From: <svn...@op...> - 2009-09-25 19:36:23
|
Author: paule Date: Fri Sep 25 21:36:03 2009 New Revision: 5851 URL: http://www.opensync.org/changeset/5851 Log: opie-sync: add main sink and move shared device connect/disconnect to it Modified: plugins/opie-sync/src/opie_sync.c plugins/opie-sync/src/opie_sync.h Modified: plugins/opie-sync/src/opie_sync.c ============================================================================== --- plugins/opie-sync/src/opie_sync.c Fri Sep 25 21:26:37 2009 (r5850) +++ plugins/opie-sync/src/opie_sync.c Fri Sep 25 21:36:03 2009 (r5851) @@ -245,11 +245,10 @@ return FALSE; } - -static void opie_sync_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +static void opie_sync_main_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) { osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); - OpieSinkEnv *env = (OpieSinkEnv *)data; + OpieMainSinkEnv *env = (OpieMainSinkEnv *)data; OSyncError *error = NULL; @@ -257,26 +256,75 @@ if(!env->plugin_env->connected) { /* We only want to connect once per session */ - + if (!device_connect(env->plugin_env, &error)) { g_mutex_unlock(env->plugin_env->plugin_mutex); goto error; } env->plugin_env->connected = TRUE; } - + if(!env->plugin_env->categories_doc) { /* Fetch categories */ opie_fetch_file(env->plugin_env, OPIE_OBJECT_TYPE_CATEGORY, OPIE_CATEGORY_FILE, &env->plugin_env->categories_doc, NULL, ctx); } - + g_mutex_unlock(env->plugin_env->plugin_mutex); + + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); + return; + +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); +} + +static void opie_sync_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); + OpieSinkEnv *env = (OpieSinkEnv *)data; + + OSyncError *error = NULL; + + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); + return; + +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); +} + +static void opie_sync_get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %d, %p)", __func__, sink, info, ctx, slow_sync, data); + OpieSinkEnv *env = (OpieSinkEnv *)data; + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); + + OSyncError *error = NULL; + + g_mutex_lock(env->plugin_env->plugin_mutex); + gboolean connected = env->plugin_env->connected; + g_mutex_unlock(env->plugin_env->plugin_mutex); + + if(!connected) { + char *errmsg; + errmsg = g_strdup_printf("Device not connected"); + osync_error_set(&error, OSYNC_ERROR_GENERIC, errmsg); + g_free(errmsg); + goto error; + } + /* pull the required data back */ if(!opie_fetch_sink(env, ctx)) { /* failed */ char *errmsg; + /* FIXME this should be being done already? */ device_disconnect(env->plugin_env, &error); errmsg = g_strdup_printf("Failed to load data from device %s", env->plugin_env->host); osync_error_set(&error, OSYNC_ERROR_GENERIC, errmsg); @@ -294,24 +342,6 @@ osync_context_report_slowsync(ctx); } - osync_context_report_success(ctx); - osync_trace(TRACE_EXIT, "%s", __func__); - return; - -error: - osync_context_report_osyncerror(ctx, error); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); - osync_error_unref(&error); -} - -static void opie_sync_get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %d, %p)", __func__, sink, info, ctx, slow_sync, data); - OpieSinkEnv *env = (OpieSinkEnv *)data; - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); - - OSyncError *error = NULL; - if (slow_sync) { osync_trace(TRACE_INTERNAL, "Slow sync requested"); @@ -432,6 +462,11 @@ //Now we need to answer the call osync_context_report_success(ctx); osync_trace(TRACE_EXIT, "%s", __func__); + return; +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); } static void opie_sync_commit_change(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data) @@ -569,6 +604,27 @@ osync_error_unref(&error); } +static void opie_sync_main_sync_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); + OpieMainSinkEnv *env = (OpieMainSinkEnv *)data; + OSyncError *error = NULL; + + /* Put categories */ + if(env->plugin_env->categories_doc && env->plugin_env->categories_doc->_private == 0) { + opie_put_file(env->plugin_env, OPIE_OBJECT_TYPE_CATEGORY, OPIE_CATEGORY_FILE, env->plugin_env->categories_doc); + } + + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); + return; + +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); +} + static void opie_sync_disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) { OpieSinkEnv *env = (OpieSinkEnv *)data; @@ -577,6 +633,19 @@ osync_context_report_success(ctx); } +static void opie_sync_main_disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + OpieMainSinkEnv *env = (OpieMainSinkEnv *)data; + + OSyncError *error = NULL; + device_disconnect(env->plugin_env, &error); + + comms_shutdown(); + + //Answer the call + osync_context_report_success(ctx); +} + OpieSinkEnv *opie_sync_create_sink_env(OpiePluginEnv *env, OSyncPluginInfo *info, const char *objtype, const char *objformat, OPIE_OBJECT_TYPE opie_objtype, const char *remotefile, const char *listelement, const char *itemelement, OSyncError **error) { OSyncObjTypeSink *sink = osync_plugin_info_find_objtype(info, objtype); @@ -628,6 +697,21 @@ env->backuppath = NULL; env->plugin_mutex = g_mutex_new(); + + /* Main sink */ + env->main_sink_env = osync_try_malloc0(sizeof(OpieMainSinkEnv), error); + env->main_sink_env->plugin_env = env; + env->main_sink_env->sink = osync_objtype_main_sink_new(error); + if(!env->main_sink_env->sink) + goto error_free_env; + + osync_objtype_sink_set_connect_func(env->main_sink_env->sink, opie_sync_main_connect); + osync_objtype_sink_set_disconnect_func(env->main_sink_env->sink, opie_sync_main_disconnect); + osync_objtype_sink_set_sync_done_func(env->main_sink_env->sink, opie_sync_main_sync_done); + osync_objtype_sink_set_userdata(env->main_sink_env->sink, env->main_sink_env); + osync_objtype_sink_enable_state_db(env->main_sink_env->sink, TRUE); + + osync_plugin_info_set_main_sink(info, env->main_sink_env->sink); /* Contacts sink */ env->contact_env = opie_sync_create_sink_env(env, info, "contact", OPIE_FORMAT_XML_CONTACT, OPIE_OBJECT_TYPE_CONTACT, OPIE_ADDRESS_FILE, "Contacts", "Contact", error); @@ -670,16 +754,6 @@ osync_trace(TRACE_ENTRY, "%s(%p)", __func__, userdata); OpiePluginEnv *env = (OpiePluginEnv *)userdata; - /* Put categories */ - if(env->categories_doc && env->categories_doc->_private == 0) { - opie_put_file(env, OPIE_OBJECT_TYPE_CATEGORY, OPIE_CATEGORY_FILE, env->categories_doc); - } - - OSyncError *error = NULL; - device_disconnect(env, &error); - - comms_shutdown(); - g_mutex_free(env->plugin_mutex); g_free(env->contact_env); @@ -697,7 +771,7 @@ static osync_bool opie_sync_discover(OSyncPluginInfo *info, void *data, OSyncError **error) { - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, error); + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, info, data, error); OSyncList *l, *list = NULL; list = osync_plugin_info_get_objtype_sinks(info); Modified: plugins/opie-sync/src/opie_sync.h ============================================================================== --- plugins/opie-sync/src/opie_sync.h Fri Sep 25 21:26:37 2009 (r5850) +++ plugins/opie-sync/src/opie_sync.h Fri Sep 25 21:36:03 2009 (r5851) @@ -36,6 +36,7 @@ typedef struct OpiePluginEnv OpiePluginEnv; typedef struct OpieSinkEnv OpieSinkEnv; +typedef struct OpieMainSinkEnv OpieMainSinkEnv; typedef enum { OPIE_SYNC_QTOPIA_2, @@ -81,6 +82,7 @@ OpieSinkEnv* todo_env; OpieSinkEnv* event_env; OpieSinkEnv* note_env; + OpieMainSinkEnv* main_sink_env; GMutex* plugin_mutex; }; @@ -96,6 +98,11 @@ OPIE_OBJECT_TYPE objtype; }; +struct OpieMainSinkEnv { + OpiePluginEnv* plugin_env; + OSyncObjTypeSink* sink; +}; + #define OPIE_FORMAT_XML_CONTACT "opie-xml-contact" #define OPIE_FORMAT_XML_TODO "opie-xml-todo" #define OPIE_FORMAT_XML_EVENT "opie-xml-event" |