summaryrefslogtreecommitdiffstats
path: root/sync/src/sync_group.c
diff options
context:
space:
mode:
Diffstat (limited to 'sync/src/sync_group.c')
-rw-r--r--sync/src/sync_group.c65
1 files changed, 58 insertions, 7 deletions
diff --git a/sync/src/sync_group.c b/sync/src/sync_group.c
index 7aa592f..db34e13 100644
--- a/sync/src/sync_group.c
+++ b/sync/src/sync_group.c
@@ -284,6 +284,10 @@ sync_group_get_default_env ()
{
if (!default_env) {
OSyncError *error = NULL;
+
+ /* Threads must be initialised for autostart, do it here */
+ if (!g_thread_supported ()) g_thread_init (NULL);
+
default_env = osync_env_new ();
g_debug ("Creating new environment");
if (!osync_env_initialize (default_env, &error)) {
@@ -697,8 +701,8 @@ sync_memberstatus_cb (OSyncMemberUpdate *status, void *user_data)
}
}
-gboolean
-sync_group_start (SyncGroup *group)
+static gboolean
+sync_group_sync (SyncGroup *group, gboolean wait)
{
OSyncError *error = NULL;
OSyncGroup *os_group;
@@ -746,11 +750,58 @@ sync_group_start (SyncGroup *group)
priv->changes = 0;
priv->max_changes = 0;
- if (!osengine_synchronize (priv->engine, &error)) {
- g_warning ("Error while starting synchronization: %s",
- osync_error_print (&error));
- osync_error_free (&error);
- sync_group_free_engine (group);
+ if (!wait) {
+ if (!osengine_synchronize (priv->engine, &error)) {
+ g_warning ("Error while starting synchronization: %s",
+ osync_error_print (&error));
+ osync_error_free (&error);
+ sync_group_free_engine (group);
+ return FALSE;
+ }
+
+ g_debug ("Sync started");
+ } else {
+ if (!osengine_wait_sync_end (priv->engine, &error)) {
+ g_warning ("osengine_wait_sync_end unsuccessful: %s",
+ osync_error_print (&error));
+ osync_error_free (&error);
+ sync_group_free_engine (group);
+ return FALSE;
+ }
+
+ g_debug ("Auto-sync finished");
+ }
+
+ return TRUE;
+}
+
+gboolean
+sync_group_start (SyncGroup *group)
+{
+ return sync_group_sync (group, FALSE);
+}
+
+static gpointer
+sync_group_autostart_cb (gpointer data)
+{
+ SyncGroup *group = (SyncGroup *)data;
+ if (!sync_group_sync (group, TRUE)) {
+ g_idle_add ((GSourceFunc)
+ sync_group_failed_idle, group);
+ }
+
+ return NULL;
+}
+
+gboolean
+sync_group_autostart (SyncGroup *group)
+{
+ GError *error = NULL;
+
+ /* TODO: Have a proper think about threading issues here */
+ if (!g_thread_create (sync_group_autostart_cb, group, TRUE, &error)) {
+ g_warning ("Failed to create thread: %s", error->message);
+ g_error_free (error);
return FALSE;
}