From: <svn...@op...> - 2009-03-13 12:38:59
|
Author: bellmich Date: Fri Mar 13 13:38:53 2009 New Revision: 5291 URL: http://www.opensync.org/changeset/5291 Log: The function disconnect can now be used to abort the synchronization. - sync_done is now a main function and not a sink function - sync_done is used to determine normal disconnects - introduced state variable waitForDisconnect - removed useless variable command and the according enum type definition OSyncPluginSyncmlDatastoreCommand - uses the new libsyncml DS API function smlDataSyncAbort Modified: plugins/syncml/src/syncml_common.c plugins/syncml/src/syncml_common.h plugins/syncml/src/syncml_ds_client.c plugins/syncml/src/syncml_ds_server.c Modified: plugins/syncml/src/syncml_common.c ============================================================================== --- plugins/syncml/src/syncml_common.c Fri Mar 13 10:25:49 2009 (r5290) +++ plugins/syncml/src/syncml_common.c Fri Mar 13 13:38:53 2009 (r5291) @@ -202,7 +202,16 @@ void sync_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) { + osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, ctx, data); + SmlPluginEnv *env = (SmlPluginEnv *)data; + g_assert(env); + osync_context_report_success(ctx); + + /* disconnect is allowed now */ + env->waitForDisconnect = TRUE; + + osync_trace(TRACE_EXIT, "%s", __func__, ctx); } void disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) @@ -211,15 +220,16 @@ SmlPluginEnv *env = (SmlPluginEnv *)data; g_assert(env); - SmlBool waiting = FALSE; + SmlBool waitForConnectDone = FALSE; if (env->databases && ((SmlDatabase *)env->databases->data)->alert_type_mutex && !((SmlDatabase *)env->databases->data)->connectCtx) { /* the datastores are waiting for the approved alert types */ - waiting = TRUE; + waitForConnectDone = TRUE; } - if (!waiting && + if (!waitForConnectDone && + env->waitForDisconnect && ( (env->state1 >= SML_DATA_SYNC_EVENT_DISCONNECT && (!env->dsObject2 || @@ -254,6 +264,23 @@ } } + if (!env->waitForDisconnect) { + /* this is an abort */ + smlTrace(TRACE_INTERNAL, "%s: abort detected", __func__); + SmlError *error = NULL; + if (env->dsObject2 && env->state2 > SML_DATA_SYNC_EVENT_CONNECT) + { + smlDataSyncAbort(env->dsObject2, &error); + } else { + smlDataSyncAbort(env->dsObject1, &error); + } + if (error != NULL) + { + OSyncError *oserror = NULL; + osync_error_set(&oserror, OSYNC_ERROR_GENERIC, "%s", smlErrorPrint(&error)); + report_error_on_context(&(env->disconnectCtx), &oserror, TRUE); + } + } } osync_trace(TRACE_EXIT, "%s", __func__); @@ -767,6 +794,7 @@ /* prepare the function list for OpenSync */ OSyncObjTypeSinkFunctions main_functions; memset(&main_functions, 0, sizeof(main_functions)); + main_functions.sync_done = sync_done; main_functions.disconnect = disconnect; /* Register main sink for connect and disconnect functions */ Modified: plugins/syncml/src/syncml_common.h ============================================================================== --- plugins/syncml/src/syncml_common.h Fri Mar 13 10:25:49 2009 (r5290) +++ plugins/syncml/src/syncml_common.h Fri Mar 13 13:38:53 2009 (r5291) @@ -78,13 +78,6 @@ #define SYNCML_PLUGIN_CONFIG_AUTH_TYPE "AuthType" -typedef enum { - OSYNC_PLUGIN_SYNCML_COMMAND_UNKNOWN, - OSYNC_PLUGIN_SYNCML_COMMAND_SEND_ALERT, - OSYNC_PLUGIN_SYNCML_COMMAND_SEND_SYNC, - OSYNC_PLUGIN_SYNCML_COMMAND_RECV_SYNC, -} OSyncPluginSyncmlDatastoreCommand; - typedef struct SmlPluginEnv { SmlDataSyncObject *dsObject1; SmlDataSyncObject *dsObject2; @@ -93,6 +86,7 @@ /* libsyncml state management */ SmlBool abort; + SmlBool waitForDisconnect; SmlDataSyncEventType state1; SmlDataSyncEventType state2; @@ -130,8 +124,6 @@ unsigned int pendingChanges; unsigned int pendingCommits; - OSyncPluginSyncmlDatastoreCommand command; - OSyncContext *connectCtx; OSyncContext *syncModeCtx; OSyncContext *getChangesCtx; Modified: plugins/syncml/src/syncml_ds_client.c ============================================================================== --- plugins/syncml/src/syncml_ds_client.c Fri Mar 13 10:25:49 2009 (r5290) +++ plugins/syncml/src/syncml_ds_client.c Fri Mar 13 13:38:53 2009 (r5291) @@ -48,7 +48,6 @@ functions.connect = syncml_connect; functions.connect_done = syncml_connect_done; functions.get_changes = ds_client_get_changeinfo; - functions.sync_done = sync_done; functions.batch_commit = ds_client_batch_commit; // Request an anchor from the framework. Modified: plugins/syncml/src/syncml_ds_server.c ============================================================================== --- plugins/syncml/src/syncml_ds_server.c Fri Mar 13 10:25:49 2009 (r5290) +++ plugins/syncml/src/syncml_ds_server.c Fri Mar 13 13:38:53 2009 (r5291) @@ -45,7 +45,6 @@ functions.connect = syncml_connect; functions.connect_done = syncml_connect_done; functions.get_changes = ds_server_get_changeinfo; - functions.sync_done = sync_done; functions.batch_commit = ds_server_batch_commit; // Request an anchor from the framework. |