diff options
Diffstat (limited to 'sync/src/sync_main.c')
-rw-r--r-- | sync/src/sync_main.c | 462 |
1 files changed, 149 insertions, 313 deletions
diff --git a/sync/src/sync_main.c b/sync/src/sync_main.c index e83f21d..85ca89c 100644 --- a/sync/src/sync_main.c +++ b/sync/src/sync_main.c @@ -9,8 +9,12 @@ #include <opensync/opensync.h> #include <osengine/engine.h> -#include "sync.h" - +#include "sync_main.h" +#include "sync_group.h" +#include "sync_item.h" +#include "sync_evo2_item.h" +#include "sync_file_item.h" +#if 0 static gboolean sync_clean_backup (SyncData *data) { @@ -137,317 +141,94 @@ sync_get_backup_group (SyncData *data) return group; } +#endif static gboolean sync_animate (SyncData *data) { static gint direction = 1; - gfloat x, y; - GtkWidget *widget = glade_xml_get_widget (data->xml, "sync_image_mid"); - - gtk_misc_get_alignment (GTK_MISC (widget), &x, &y); - x += 0.05 * direction; - if ((x > 1) || (x < 0)) { - direction = -direction; - } - gtk_misc_set_alignment (GTK_MISC (widget), x, y); + static gint count = 0; - return data->syncing; -} - -static const char * -OSyncChangeType2String (OSyncChangeType c) -{ - switch (c) { - case CHANGE_ADDED: return "ADDED"; - case CHANGE_UNMODIFIED: return "UNMODIFIED"; - case CHANGE_DELETED: return "DELETED"; - case CHANGE_MODIFIED: return "MODIFIED"; - default: - case CHANGE_UNKNOWN: return "?"; + if (data->started) { + gfloat x, y; + GtkWidget *widget = glade_xml_get_widget ( + data->xml, "sync_image_mid"); + + gtk_misc_get_alignment (GTK_MISC (widget), &x, &y); + x += 0.05 * direction; + if ((x > 1) || (x < 0)) { + direction = -direction; + } + gtk_misc_set_alignment (GTK_MISC (widget), x, y); + } else { + count ++; + if (count >= ANIM_FREQ / SWITCH_FREQ) { + GtkWidget *widget = glade_xml_get_widget (data->xml, + "prepare_image"); + + count = 0; + if (direction == 1) { + gtk_image_set_from_icon_name ( + GTK_IMAGE (widget), + "gtk-connect", GTK_ICON_SIZE_DIALOG); + } else { + gtk_image_set_from_icon_name ( + GTK_IMAGE (widget), + "gtk-disconnect", GTK_ICON_SIZE_DIALOG); + } + direction = -direction; + } } -} - -static void -sync_conflict_cb (OSyncEngine *engine, OSyncMapping *mapping, - void *user_data) -{ - GtkWidget *widget; - SyncData *data = (SyncData *)user_data; - - gdk_threads_enter (); - widget = glade_xml_get_widget (data->xml, "main_notebook"); - gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), TAB_CONFLICT); - gdk_threads_leave (); - osengine_mapping_ignore_conflict (engine, mapping); + return TRUE; } static void -sync_changestatus_cb (OSyncEngine *engine, OSyncChangeUpdate *status, - void *user_data) +sync_started_cb (SyncGroup *group, SyncData *data) { - SyncData *data = (SyncData *)user_data; - - switch (status->type) { - case CHANGE_RECEIVED_INFO: - g_debug ("Received a entry %s without data from member " - "%i. Changetype %s", - osync_change_get_uid (status->change), - status->member_id, - OSyncChangeType2String ( - osync_change_get_changetype ( - status->change))); - break; - case CHANGE_RECEIVED: - g_debug ("Received a entry %s with data of size %i from " - "member %i. Changetype %s", - osync_change_get_uid (status->change), - osync_change_get_datasize (status->change), - status->member_id, - OSyncChangeType2String ( - osync_change_get_changetype ( - status->change))); - break; - case CHANGE_SENT: - g_debug ("Sent a entry %s of size %i to member %i. " - "Changetype %s", - osync_change_get_uid (status->change), - osync_change_get_datasize (status->change), - status->member_id, - OSyncChangeType2String ( - osync_change_get_changetype ( - status->change))); - break; - case CHANGE_WRITE_ERROR: - g_debug ("Error writing entry %s to member %i: %s", - osync_change_get_uid (status->change), - status->member_id, - osync_error_print (&(status->error))); - break; - case CHANGE_RECV_ERROR: - g_debug ("Error reading entry %s from member %i: %s", - osync_change_get_uid (status->change), - status->member_id, - osync_error_print (&(status->error))); - break; - } + GtkWidget *widget = glade_xml_get_widget ( + data->xml, "sync_progressbar"); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (widget), + "Synchronising..."); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (widget), 0); + + widget = glade_xml_get_widget ( + data->xml, "sync_image_notebook"); + gtk_notebook_set_current_page ( + GTK_NOTEBOOK (widget), IMAGE_TAB_SYNC); + + data->started = TRUE; } static void -sync_mappingstatus_cb (OSyncMappingUpdate *status, void *user_data) -{ - SyncData *data = (SyncData *)user_data; - - switch (status->type) { - case MAPPING_SOLVED: - g_debug ("Mapping solved"); - break; - case MAPPING_SYNCED: - g_debug ("Mapping Synced"); - break; - case MAPPING_WRITE_ERROR: - g_debug ("Mapping Write Error: %s", - osync_error_print (&(status->error))); - break; - } -} - -static gboolean -sync_finish_cb (gpointer data) +sync_progress_cb (SyncGroup *group, gdouble progress, SyncData *data) { - OSyncEngine *engine = (OSyncEngine *)data; - - g_debug ("Finalizing/freeing sync engine"); - osengine_finalize (engine); - osengine_free (engine); - - return FALSE; + GtkWidget *widget = glade_xml_get_widget ( + data->xml, "sync_progressbar"); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (widget), progress); } static void -sync_enginestatus_cb (OSyncEngine *engine, OSyncEngineUpdate *status, - void *user_data) +sync_conflict_cb (SyncGroup *group, SyncData *data) { - GtkWidget *widget; - SyncData *data = (SyncData *)user_data; - - switch (status->type) { - case ENG_PREV_UNCLEAN: - g_debug ("The previous synchronization was unclean. " - "Slow-syncing"); - return; - case ENG_ENDPHASE_CON: - g_debug ("All clients connected or error"); - return; - case ENG_END_CONFLICTS: - g_debug ("All conflicts have been reported"); - return; - case ENG_ENDPHASE_READ: - g_debug ("All clients sent changes or error"); - return; - case ENG_ENDPHASE_WRITE: - g_debug ("All clients have written"); - return; - case ENG_ENDPHASE_DISCON: - g_debug ("All clients have disconnected"); - return; - case ENG_SYNC_SUCCESSFULL: - g_debug ("The sync was successful"); - gdk_threads_enter (); - widget = glade_xml_get_widget ( - data->xml, "main_notebook"); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (widget), TAB_SUCCESS); - gdk_threads_leave (); - break; - case ENG_ERROR: - g_debug ("The sync failed: %s", - osync_error_print (&(status->error))); - gdk_threads_enter (); - widget = glade_xml_get_widget ( - data->xml, "main_notebook"); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (widget), TAB_ERROR); - gdk_threads_leave (); -/* g_debug ("Aborting synchronisation..."); - osengine_abort (engine);*/ - break; - } - - data->syncing = FALSE; - g_debug ("Setting idle function to clean up engine."); - g_idle_add (sync_finish_cb, engine); + GtkWidget *widget = glade_xml_get_widget (data->xml, "main_notebook"); + gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), TAB_CONFLICT); } static void -sync_memberstatus_cb (OSyncMemberUpdate *status, void *user_data) +sync_finished_cb (SyncGroup *group, SyncData *data) { - SyncData *data = (SyncData *)user_data; - - switch (status->type) { - case MEMBER_CONNECTED: - g_debug ("Member %lli of type %s just connected", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member)); - break; - case MEMBER_DISCONNECTED: - g_debug ("Member %lli of type %s just disconnected", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member)); - break; - case MEMBER_SENT_CHANGES: - g_debug ("Member %lli of type %s just sent all changes", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member)); - break; - case MEMBER_COMMITTED_ALL: - g_debug ( - "Member %lli of type %s committed all changes.", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member)); - break; - case MEMBER_CONNECT_ERROR: - g_debug ("Member %lli of type %s had an " - "error while connecting: %s", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member), - osync_error_print (&(status->error))); - break; - case MEMBER_GET_CHANGES_ERROR: - g_debug ("Member %lli of type %s had an error while " - "getting changes: %s", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member), - osync_error_print (&(status->error))); - break; - case MEMBER_SYNC_DONE_ERROR: - g_debug ("Member %lli of type %s had an error while " - "calling sync done: %s", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member), - osync_error_print (&(status->error))); - break; - case MEMBER_DISCONNECT_ERROR: - g_debug ("Member %lli of type %s had an error while " - "disconnecting: %s", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member), - osync_error_print (&(status->error))); - break; - case MEMBER_COMMITTED_ALL_ERROR: - g_debug ("Member %lli of type %s had an error while " - "commiting changes: %s", - osync_member_get_id (status->member), - osync_member_get_pluginname (status->member), - osync_error_print (&(status->error))); - break; - } + GtkWidget *widget = glade_xml_get_widget (data->xml, "main_notebook"); + gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), TAB_SUCCESS); + g_source_remove (data->animate_id); } static void -sync_backup (SyncData *data) +sync_failed_cb (SyncGroup *group, SyncData *data) { - OSyncGroup *group; - OSyncEngine *engine; - GtkWidget *widget; - OSyncError *error = NULL; - - widget = glade_xml_get_widget (data->xml, "main_notebook"); - - if (!(group = sync_get_backup_group (data))) { - g_warning ("Unable to retrieve back-up group"); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (widget), TAB_ERROR); - return; - } - - if (!(engine = osengine_new (group, &error))) { - g_warning ("Error while creating syncengine: %s", - osync_error_print (&error)); - osync_error_free (&error); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (widget), TAB_ERROR); - return; - } - -/* osengine_set_message_callback (engine, NULL, NULL);*/ - osengine_set_conflict_callback ( - engine, sync_conflict_cb, data); - osengine_set_changestatus_callback ( - engine, sync_changestatus_cb, data); - osengine_set_mappingstatus_callback ( - engine, sync_mappingstatus_cb, data); - osengine_set_enginestatus_callback ( - engine, sync_enginestatus_cb, data); - osengine_set_memberstatus_callback ( - engine, sync_memberstatus_cb, data); - - if (!osengine_init (engine, &error)) { - g_warning ("Error while initializing syncengine: %s", - osync_error_print (&error)); - osync_error_free (&error); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (widget), TAB_ERROR); - return; - } - - if (!osengine_synchronize (engine, &error)) { - g_warning ("Error while starting synchronization: %s", - osync_error_print (&error)); - osync_error_free (&error); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (widget), TAB_ERROR); - return; - } - - /* Switch to sync tab */ - gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), TAB_SYNC); - /* Start sync animation */ - g_debug ("Started synchronisation..."); - data->syncing = TRUE; - data->animate_id = g_timeout_add ( - 100, (GSourceFunc)sync_animate, data); + GtkWidget *widget = glade_xml_get_widget (data->xml, "main_notebook"); + gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), TAB_ERROR); + g_source_remove (data->animate_id); } static gboolean @@ -464,17 +245,47 @@ sync_item_activated_cb (GtkIconView *iconview, GtkTreePath *arg1, if (gtk_tree_model_get_iter ( GTK_TREE_MODEL (data->model), &iter, arg1)) { - gint id; + SyncItem *item; + const gchar *name; + GtkWidget *widget; + gfloat x, y; + gtk_tree_model_get (GTK_TREE_MODEL (data->model), - &iter, COL_ID, &id, -1); + &iter, COL_NAME, &name, -1); - /* Special case for back-up item */ - if (id == 0) { - g_debug ("Performing backup"); - sync_backup (data); - + item = (SyncItem *)g_hash_table_lookup (data->sync_items, name); + + sync_group_set_item2 (data->group, item); + data->started = FALSE; + + if (!sync_group_start (data->group)) { + /* Switch to error tab */ + widget = glade_xml_get_widget ( + data->xml, "main_notebook"); + gtk_notebook_set_current_page ( + GTK_NOTEBOOK (widget), TAB_ERROR); return; } + + /* Set progress bar text */ + widget = glade_xml_get_widget (data->xml, "sync_progressbar"); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (widget), + "Preparing..."); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (widget), 0); + + /* Switch to sync/prepare tab and start animation */ + widget = glade_xml_get_widget ( + data->xml, "sync_image_mid"); + gtk_misc_get_alignment (GTK_MISC (widget), &x, &y); + gtk_misc_set_alignment (GTK_MISC (widget), 0, y); + widget = glade_xml_get_widget ( + data->xml, "sync_image_notebook"); + gtk_notebook_set_current_page ( + GTK_NOTEBOOK (widget), IMAGE_TAB_PREPARE); + widget = glade_xml_get_widget (data->xml, "main_notebook"); + gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), TAB_SYNC); + data->animate_id = g_timeout_add ( + ANIM_FREQ, (GSourceFunc)sync_animate, data); } } @@ -506,14 +317,15 @@ main (int argc, char **argv) GtkTreePath *path; GtkIconTheme *icon_theme; gint width = 0, height = 0; - OSyncError *error = NULL; SyncData data; + SyncItem *preset_item; + gchar *temp_path; gtk_init (&argc, &argv); glade_init (); - g_thread_init (NULL); - gdk_threads_init (); - /* Must be called due to buggy OpenSync */ +/* g_thread_init (NULL); + gdk_threads_init ();*/ + /* FIXME: Must be called due to buggy OpenSync */ gconf_client_get_default (); data.xml = glade_xml_new (XML_FILE, NULL, NULL); @@ -524,38 +336,50 @@ main (int argc, char **argv) icon_theme = gtk_icon_theme_get_default (); gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height); data.backup_icon = gtk_icon_theme_load_icon (icon_theme, - GTK_STOCK_FLOPPY, MIN (width, height), 0, NULL); + GTK_STOCK_FLOPPY, MIN (width, height), + GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + data.restore_icon = gtk_icon_theme_load_icon (icon_theme, + GTK_STOCK_OPEN, MIN (width, height), + GTK_ICON_LOOKUP_USE_BUILTIN, NULL); data.network_icon = gtk_icon_theme_load_icon (icon_theme, - GTK_STOCK_NETWORK, MIN (width, height), 0, NULL); + GTK_STOCK_NETWORK, MIN (width, height), + GTK_ICON_LOOKUP_USE_BUILTIN, NULL); /* Setup icon-view */ widget = glade_xml_get_widget (data.xml, "main_iconview"); data.model = gtk_list_store_new ( - 3, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_PIXBUF); + 2, G_TYPE_STRING, GDK_TYPE_PIXBUF); gtk_icon_view_set_model (GTK_ICON_VIEW (widget), GTK_TREE_MODEL (data.model)); gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (widget), COL_PIXBUF); gtk_icon_view_set_text_column (GTK_ICON_VIEW (widget), COL_NAME); - /* Insert backup item in icon-view */ + /* Create local sync-item and sync group */ + data.local_item = sync_evo2_item_new ("Local", NULL, NULL, NULL); + data.group = sync_group_new_with_items (data.local_item, NULL); + + /* Create SyncItem hash-table */ + data.sync_items = g_hash_table_new_full (g_str_hash, g_str_equal, + NULL, g_object_unref); + /* Insert preset items */ + temp_path = g_strdup_printf (TEMP_PATH, g_getenv ("HOME")); + preset_item = g_object_ref (sync_file_item_new ("Test", temp_path)); + g_hash_table_insert (data.sync_items, "Test", preset_item); gtk_list_store_insert_with_values (GTK_LIST_STORE (data.model), &iter, - 0, COL_ID, 0, COL_NAME, "Backup", - COL_PIXBUF, data.backup_icon, -1); + 0, COL_NAME, "Test", COL_PIXBUF, data.backup_icon, -1); + g_free (temp_path); + + /* TODO: Insert saved items */ + /* TODO: Avahi detection of local sync servers */ + /* TODO: Bluetooth scanning? */ + /* Insert backup item */ + /* Insert restore item */ + + /* Select first item */ path = gtk_tree_path_new_first (); gtk_icon_view_select_path (GTK_ICON_VIEW (widget), path); gtk_tree_path_free (path); - /* Create OpenSync environment */ - data.osync = osync_env_new (); - osync_env_set_option (data.osync, - "GROUPS_DIRECTORY", (const char *)NULL); - osync_env_set_option (data.osync, "LOAD_GROUPS", "TRUE"); - osync_env_set_option (data.osync, "LOAD_PLUGINS", "TRUE"); - osync_env_set_option (data.osync, "LOAD_FORMATS", "TRUE"); - if (!osync_env_initialize (data.osync, &error)) { - g_error ("Unable to initialise OpenSync environment: %s", - osync_error_print (&error)); - } widget = glade_xml_get_widget (data.xml, "quit_menuitem"); g_signal_connect (G_OBJECT (widget), "activate", @@ -579,6 +403,18 @@ main (int argc, char **argv) widget = glade_xml_get_widget (data.xml, "error_close_button"); g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (sync_chooser_cb), &data); + + /* Connect SyncGroup signals */ + g_signal_connect (G_OBJECT (data.group), "started", + G_CALLBACK (sync_started_cb), &data); + g_signal_connect (G_OBJECT (data.group), "progress", + G_CALLBACK (sync_progress_cb), &data); + g_signal_connect (G_OBJECT (data.group), "conflict", + G_CALLBACK (sync_conflict_cb), &data); + g_signal_connect (G_OBJECT (data.group), "finished", + G_CALLBACK (sync_finished_cb), &data); + g_signal_connect (G_OBJECT (data.group), "failed", + G_CALLBACK (sync_failed_cb), &data); gtk_main (); |