diff options
Diffstat (limited to 'sync/src/sync_group.c')
-rw-r--r-- | sync/src/sync_group.c | 65 |
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; } |