summaryrefslogtreecommitdiffstats
path: root/sync/src/sync_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sync/src/sync_main.c')
-rw-r--r--sync/src/sync_main.c462
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 ();