diff options
-rw-r--r-- | sync/src/Makefile.am | 1 | ||||
-rw-r--r-- | sync/src/sync_group.c | 65 | ||||
-rw-r--r-- | sync/src/sync_group.h | 1 | ||||
-rw-r--r-- | sync/src/sync_main.c | 80 | ||||
-rw-r--r-- | sync/src/sync_main.h | 1 | ||||
-rw-r--r-- | sync/src/sync_syncml_server_item.c | 111 | ||||
-rw-r--r-- | sync/src/sync_syncml_server_item.h | 16 |
7 files changed, 249 insertions, 26 deletions
diff --git a/sync/src/Makefile.am b/sync/src/Makefile.am index 87a4753..765d2b0 100644 --- a/sync/src/Makefile.am +++ b/sync/src/Makefile.am @@ -6,6 +6,7 @@ bin_PROGRAMS = sync sync_SOURCES = sync_main.c sync.h sync_group.c sync_group.h sync_item.c \ sync_item.h sync_evo2_item.c sync_evo2_item.h sync_file_item.c \ sync_file_item.h sync_syncml_item.c sync_syncml_item.h \ + sync_syncml_server_item.c sync_syncml_server_item.h \ sync_collection.c sync_collection.h sync_LDADD = $(SYNC_LIBS) 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; } diff --git a/sync/src/sync_group.h b/sync/src/sync_group.h index 783f9de..08318fb 100644 --- a/sync/src/sync_group.h +++ b/sync/src/sync_group.h @@ -72,6 +72,7 @@ const gchar * sync_group_get_namespace (SyncGroup *group); gchar * sync_group_get_name (SyncGroup *group); gboolean sync_group_start (SyncGroup *group); +gboolean sync_group_autostart (SyncGroup *group); void sync_group_resolve_conflict (SyncGroup *group, SyncGroupConflictRes res); void sync_group_abort (SyncGroup *group); diff --git a/sync/src/sync_main.c b/sync/src/sync_main.c index dcfbaa7..7881145 100644 --- a/sync/src/sync_main.c +++ b/sync/src/sync_main.c @@ -16,6 +16,7 @@ #include "sync_evo2_item.h" #include "sync_file_item.h" #include "sync_syncml_item.h" +#include "sync_syncml_server_item.h" #if 0 static gboolean sync_clean_backup (SyncData *data) @@ -104,6 +105,26 @@ sync_animate (SyncData *data) } static void +sync_server_started_cb (SyncGroup *group) +{ + g_message ("Server started sync"); +} + +static void +sync_server_finished_cb (SyncGroup *group) +{ + g_message ("Server finished sync"); + sync_group_autostart (group); +} + +static void +sync_server_failed_cb (SyncGroup *group, const gchar *error) +{ + g_warning ("Server sync failed"); + sync_group_autostart (group); +} + +static void sync_started_cb (SyncCollection *collection, SyncData *data) { GtkWidget *widget = glade_xml_get_widget ( @@ -179,46 +200,51 @@ sync_item_activated_cb (GtkIconView *iconview, GtkTreePath *arg1, &iter, COL_NAME, &name, COL_TYPE, &type, -1); switch (type) { - SyncItem *item; + SyncItem *item, *item2; SyncGroup *group; gchar *path; case TYPE_SYNCML: + path = g_strdup_printf (TEMP_PATH, + g_getenv ("HOME")); + item2 = sync_file_item_new ("Test", path); + g_free (path); + /* Contacts SyncML item */ - item = sync_syncml_item_new ("Mobical", - "http://www.mobical.net/sync/server", - CONTACTS, "Cwiiis", "2e9tp2", "con"); + item = sync_syncml_item_new ("Server", + "http://localhost:8080", + CONTACTS, "", "", "card"); group = sync_group_new_with_items ( - data->local_item, item); + item2, item); sync_collection_add_group (data->collection, group); g_object_unref (group); g_object_unref (item); /* Events SyncML item */ - item = sync_syncml_item_new ("Mobical", - "http://www.mobical.net/sync/server", - EVENTS, "Cwiiis", "2e9tp2", "cal"); +/* item = sync_syncml_item_new ("Server", + "http://localhost:8080", + EVENTS, "", "", "cal"); group = sync_group_new_with_items ( - data->local_item, item); + item2, item); sync_collection_add_group (data->collection, group); g_object_unref (group); - g_object_unref (item); + g_object_unref (item);*. /* Todo SyncML item */ - item = sync_syncml_item_new ("Mobical", - "http://www.mobical.net/sync/server", - TODO, "Cwiiis", "2e9tp2", "task"); +/* item = sync_syncml_item_new ("Server", + "http://localhost:8080", + TODO, "", "", "cal"); group = sync_group_new_with_items ( - data->local_item, item); + item2, item); sync_collection_add_group (data->collection, group); g_object_unref (group); - g_object_unref (item); + g_object_unref (item);*/ /* TODO: Check if notes sync works? */ - + g_object_unref (item2); break; case TYPE_FILE: path = g_strdup_printf (TEMP_PATH, @@ -367,6 +393,7 @@ main (int argc, char **argv) GtkIconTheme *icon_theme; gint width = 0, height = 0; SyncData data; + SyncItem *server_item; gtk_init (&argc, &argv); glade_init (); @@ -407,7 +434,22 @@ main (int argc, char **argv) /* Create local sync-item and sync collection */ data.collection = sync_collection_new (); data.local_item = sync_evo2_item_new ("Local", NULL, NULL, NULL); - + + /* Create and start server */ + server_item = sync_syncml_server_item_new ("Server", "", "", + 8080, "card", "cal", "note"); + data.server_group = sync_group_new_with_items ( + server_item, data.local_item); + g_object_unref (server_item); + /* TODO: Conflicts? */ + g_signal_connect (G_OBJECT (data.server_group), "started", + G_CALLBACK (sync_server_started_cb), NULL); + g_signal_connect (G_OBJECT (data.server_group), "finished", + G_CALLBACK (sync_server_finished_cb), NULL); + g_signal_connect (G_OBJECT (data.server_group), "failed", + G_CALLBACK (sync_server_failed_cb), NULL); + sync_group_autostart (data.server_group); + /* Insert some items for testing (TODO: look at loading groups later) */ gtk_list_store_insert_with_values (GTK_LIST_STORE (data.model), &iter, G_MAXINT, COL_NAME, "SyncML Test", COL_TYPE, TYPE_SYNCML, @@ -417,7 +459,7 @@ main (int argc, char **argv) COL_PIXBUF, data.backup_icon, -1); /* Insert preset items */ - gtk_list_store_insert_with_values (GTK_LIST_STORE (data.model), &iter, +/* gtk_list_store_insert_with_values (GTK_LIST_STORE (data.model), &iter, G_MAXINT, COL_NAME, "Backup", COL_TYPE, TYPE_BACKUP, COL_PIXBUF, data.backup_icon, -1); gtk_list_store_insert_with_values (GTK_LIST_STORE (data.model), &iter, @@ -425,7 +467,7 @@ main (int argc, char **argv) COL_PIXBUF, data.restore_icon, -1); gtk_list_store_insert_with_values (GTK_LIST_STORE (data.model), &iter, G_MAXINT, COL_NAME, "Add target...", COL_TYPE, TYPE_ADD_NEW, - COL_PIXBUF, data.add_icon, -1); + COL_PIXBUF, data.add_icon, -1);*/ /* TODO: Avahi detection of local sync servers? */ /* TODO: Bluetooth scanning? */ diff --git a/sync/src/sync_main.h b/sync/src/sync_main.h index 1f8e7c7..7542029 100644 --- a/sync/src/sync_main.h +++ b/sync/src/sync_main.h @@ -54,6 +54,7 @@ typedef struct { SyncCollection *collection; SyncGroup *group; SyncItem *local_item; + SyncGroup *server_group; gboolean started; guint animate_id; diff --git a/sync/src/sync_syncml_server_item.c b/sync/src/sync_syncml_server_item.c new file mode 100644 index 0000000..c0f5643 --- /dev/null +++ b/sync/src/sync_syncml_server_item.c @@ -0,0 +1,111 @@ + +#include <opensync/opensync.h> +#include <glib.h> +#include <string.h> +#include "sync_item.h" +#include "sync_group.h" +#include "sync_syncml_server_item.h" + +#define SYNCML_SERVER_PLUGIN "syncml-http-server" +#define SYNCML_SERVER_CONFIG \ + "<config>" \ + "<username>%s</username>" \ + "<password>%s</password>" \ + "<url>%s</url>" \ + "<port>%d</port>" \ + "<usestringtable>1</usestringtable>" \ + "<onlyreplace>0</onlyreplace>" \ + "<recvLimit>0</recvLimit>" \ + "<contact_db>%s</contact_db>" \ + "<calendar_db>%s</calendar_db>" \ + "<note_db>%s</note_db>" \ + "</config>" + +typedef struct { + gchar *user; + gchar *pass; + guint port; + gchar *card_db; + gchar *cal_db; + gchar *note_db; +} SyncSyncMLServerItemData; + +static void +sync_syncml_server_free_data (SyncSyncMLServerItemData *data) +{ + g_free (data->user); + g_free (data->pass); + g_free (data->card_db); + g_free (data->cal_db); + g_free (data->note_db); +} + +static OSyncMember * +sync_syncml_server_item_get_member (SyncItem *item, SyncGroup *group) +{ + OSyncMember *member; + OSyncError *error = NULL; + OSyncConfigurationTypes type = NO_CONFIGURATION; + + member = osync_member_new (sync_group_get_osync_group (group)); + if (!osync_member_instance_plugin (member, SYNCML_SERVER_PLUGIN, + &error)) { + g_warning ("Error instancing syncml server plug-in: %s", + osync_error_print (&error)); + osync_error_free (&error); + return NULL; + } + if (!osync_member_need_config (member, &type, &error)) { + g_warning ("Error reading plug-in config requirements: %s", + osync_error_print (&error)); + osync_error_free (&error); + return NULL; + } + if (type == NO_CONFIGURATION) { + g_warning ( + "syncml server plug-in reports no need for " + "configuration"); + } else { + SyncSyncMLServerItemData *data; + const gchar *url; + gchar *config; + + data = (SyncSyncMLServerItemData *)sync_item_get_data (item); + url = sync_item_get_name (item); + + config = g_strdup_printf (SYNCML_SERVER_CONFIG, data->user, + data->pass, url, data->port, data->card_db, + data->cal_db, data->note_db); + osync_member_set_config ( + member, config, strlen (config)); + g_free (config); + } + + return member; +} + +SyncItem * +sync_syncml_server_item_new (const gchar *name, const gchar *user, + const gchar *pass, guint port, + const gchar *card_db, const gchar *cal_db, + const gchar *note_db) +{ + SyncItem *item; + SyncSyncMLServerItemData *data; + + item = sync_item_new (name, "", sync_syncml_server_item_get_member); + + data = g_new0 (SyncSyncMLServerItemData, 1); + data->user = g_strdup (user); + data->pass = g_strdup (pass); + data->port = port; + data->card_db = g_strdup (card_db); + data->cal_db = g_strdup (cal_db); + data->note_db = g_strdup (note_db); + + sync_item_set_data (item, data); + sync_item_set_data_free_func (item, + (SyncItemDataFreeFunc)sync_syncml_server_free_data); + + return item; +} diff --git a/sync/src/sync_syncml_server_item.h b/sync/src/sync_syncml_server_item.h new file mode 100644 index 0000000..625bc08 --- /dev/null +++ b/sync/src/sync_syncml_server_item.h @@ -0,0 +1,16 @@ + +#ifndef SYNC_SYNCML_SERVER_ITEM_H +#define SYNC_SYNCML_SERVER_ITEM_H + +#include <glib.h> +#include "sync_item.h" + +SyncItem *sync_syncml_server_item_new (const gchar *name, + const gchar *user, + const gchar *pass, + guint port, + const gchar *card_db, + const gchar *cal_db, + const gchar *note_db); + +#endif |