From: <svn...@op...> - 2009-08-07 17:48:19
|
Author: bellmich Date: Fri Aug 7 19:48:10 2009 New Revision: 1239 URL: http://libsyncml.opensync.org/changeset/1239 Log: - integrated SmlChangeItem interface (replaced SmlDataSyncChange) - fixed bug in event callback (error is a const) which can lead to SegFaults Modified: trunk/libsyncml/data_sync_api/data_sync_callbacks.c trunk/libsyncml/data_sync_api/data_sync_callbacks.h Modified: trunk/libsyncml/data_sync_api/data_sync_callbacks.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_callbacks.c Fri Aug 7 19:46:04 2009 (r1238) +++ trunk/libsyncml/data_sync_api/data_sync_callbacks.c Fri Aug 7 19:48:10 2009 (r1239) @@ -30,6 +30,7 @@ #include "data_sync_devinf.h" #include "libsyncml/objects/sml_ds_server.h" #include "libsyncml/sml_manager.h" +#include "sml_change_item_internals.h" /* **************************************** */ /* ***** Management Callbacks ***** */ @@ -39,13 +40,14 @@ SmlManager *manager, SmlManagerEventType type, SmlSession *session, - GError *error, + const GError *error, void *userdata) { smlTrace(TRACE_ENTRY, "%s(%p, %i, %p, %p, %p)", __func__, manager, type, session, error, userdata); SmlDataSyncObject *dsObject = userdata; smlAssert(dsObject); GList *o = NULL; + GError *locerror = NULL; /* FIXME: Is this lock really needed? */ /* FIXME: Who is allowed to call smlManagerDispatch? */ /* FIXME: The SmlManager must be synchronized and not the callback. */ @@ -91,7 +93,7 @@ dsObject, anchor, datastore->localNext, dsObject->setAnchorUserdata, - &error)) + &locerror)) goto error; anchor = g_strdup_printf( "remoteanchor%s", @@ -100,7 +102,7 @@ dsObject, anchor, datastore->remoteNext, dsObject->setAnchorUserdata, - &error)) + &locerror)) goto error; } } @@ -189,7 +191,7 @@ /* prepare credential */ SmlCred *cred = smlCredNewAuth(dsObject->authType, dsObject->username, dsObject->password, - &error); + &locerror); if (!cred) goto error; smlSessionRegisterCred(dsObject->session, cred); @@ -230,9 +232,9 @@ * the own device information is send and * the remote ones is requested. */ - if (!smlDataSyncManageDevInf(dsObject, TRUE, &error)) + if (!smlDataSyncManageDevInf(dsObject, TRUE, &locerror)) goto error; - if (!smlSessionFlush(dsObject->session, TRUE, &error)) + if (!smlSessionFlush(dsObject->session, TRUE, &locerror)) goto error; break; case SML_PACKAGE_2: /* alerts received by server */ @@ -242,10 +244,10 @@ * the own device information is send and * the remote ones is requested. */ - if (!smlDataSyncManageDevInf(dsObject, TRUE, &error)) + if (!smlDataSyncManageDevInf(dsObject, TRUE, &locerror)) goto error; - if (!smlSessionFlush(dsObject->session, TRUE, &error)) + if (!smlSessionFlush(dsObject->session, TRUE, &locerror)) goto error; smlDataSyncSendEvent( @@ -263,16 +265,16 @@ dsObject->eventUserdata, NULL); break; case SML_PACKAGE_5: /* syncs received by client */ - if (!smlDataSyncSendMap(dsObject, &error)) + if (!smlDataSyncSendMap(dsObject, &locerror)) goto error; - if (!smlSessionFlush(dsObject->session, TRUE, &error)) + if (!smlSessionFlush(dsObject->session, TRUE, &locerror)) goto error; smlDataSyncSendEvent( dsObject, SML_DATA_SYNC_EVENT_GOT_ALL_CHANGES, dsObject->eventUserdata, NULL); break; case SML_PACKAGE_6: /* map received by server */ - if (!smlSessionFlush(dsObject->session, TRUE, &error)) + if (!smlSessionFlush(dsObject->session, TRUE, &locerror)) goto error; break; case SML_PACKAGE_END: /* end received by client */ @@ -280,7 +282,7 @@ /* auto disconnect by library */ break; default: - g_set_error(&error, SML_ERROR, SML_ERROR_NOT_IMPLEMENTED, + g_set_error(&locerror, SML_ERROR, SML_ERROR_NOT_IMPLEMENTED, "The package %d is actually not supported.", dsObject->actualPackage); goto error; @@ -292,8 +294,8 @@ SmlLink *link_ = smlManagerSessionGetLink( dsObject->manager, dsObject->session, - &error); - if (!link_ && error) + &locerror); + if (!link_ && locerror) goto error; /* OBEX is a stateful protocol and the client should * init the disconnect. The problem is what happens @@ -302,7 +304,7 @@ * if (dsObject->tspType != SML_TRANSPORT_OBEX_SERVER && * !smlTransportDisconnect(dsObject->tsp, link, &error)) */ - if (!smlTransportDisconnect(dsObject->tsp, link_, &error)) + if (!smlTransportDisconnect(dsObject->tsp, link_, &locerror)) { if (link_) smlLinkDeref(link_); @@ -338,11 +340,19 @@ return; error: g_mutex_unlock(dsObject->managerMutex); + if (error && locerror) { + /* The locerror is only a resulting error from the original error. */ + g_error_free(locerror); + locerror = NULL; + } + if (locerror) + error = locerror; smlDataSyncSendEvent( dsObject, SML_DATA_SYNC_EVENT_ERROR, dsObject->eventUserdata, error); smlTrace(TRACE_EXIT_ERROR, "%s - %s", __func__, error->message); - g_error_free(error); + if (locerror) + g_error_free(locerror); } /* *************************************** */ @@ -532,30 +542,29 @@ gboolean smlDataSyncChangeCallback( SmlDsSession *dsession, - SmlChangeType type, - const gchar *uid, - gchar *data, - gsize size, - const gchar *contenttype, + SmlChangeItem *item, void *userdata, GError **error) { - smlTrace(TRACE_ENTRY, "%s(%p, %i, %s, %p, %i, %s, %p, %p)", __func__, dsession, type, VA_STRING(uid), data, size, VA_STRING(contenttype), userdata, error); + smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, dsession, item, userdata, error); CHECK_ERROR_REF SmlDataSyncDatastore *datastore = userdata; - smlAssert(type); + smlAssert(item); + smlAssert(sml_change_item_get_action(item)); smlAssert(datastore); smlAssert(datastore->dsObject); smlAssert(datastore->dsObject->changeCallback); /* some mobiles sends replace commands during slow-sync */ if (datastore->alertType == SML_ALERT_SLOW_SYNC && - type == SML_CHANGE_REPLACE) - type = SML_CHANGE_ADD; + sml_change_item_get_action(item) == SML_CHANGE_REPLACE) + sml_change_item_set_action(item, SML_CHANGE_ADD); /* decode base64 data if necessary */ + gchar *data = NULL; + gsize length = 0; size_t appClassLength = ((size_t) index(datastore->contentType, '/')) - ((size_t) datastore->contentType); if ( ( strstr(datastore->contentType, SML_CONTENT_TYPE_APPLICATION) == datastore->contentType && @@ -570,22 +579,23 @@ appClassLength == strlen(SML_CONTENT_TYPE_AUDIO) ) ) { /* binary data must be base64 encoded */ - char *b64data = data; - size_t length = 0; - data = (char *) g_base64_decode(b64data, &length); - size = length; - smlSafeCFree(&b64data); + data = (char *) g_base64_decode(sml_change_item_get_data(item), &length); if (!data) { g_set_error(error, SML_ERROR, SML_ERROR_GENERIC, "The base 64 decoding of glib failed."); goto error; } + } else { + data = g_strdup(sml_change_item_get_data(item)); + length = strlen(data); } /* perform callback */ if (!datastore->dsObject->changeCallback( datastore->dsObject, datastore->sourceUri, - type, uid, data, size, + sml_change_item_get_action(item), + sml_location_get_uri(sml_change_item_get_location(item)), + data, length, datastore->dsObject->changeUserdata, error)) goto error; @@ -608,8 +618,8 @@ GError *error = NULL; smlAssert(userdata); - SmlDataSyncChange *change = userdata; - SmlDataSyncDatastore *datastore = change->datastore; + SmlChangeItem *change = userdata; + SmlDataSyncDatastore *datastore = sml_change_item_get_data_store(change); SmlDataSyncObject *dsObject = datastore->dsObject; smlAssert(dsObject); @@ -617,7 +627,7 @@ !dsObject->changeStatusCallback( dsObject, smlStatusGetCode(status), - change->userdata, &error)) + sml_change_item_get_userdata(change), &error)) goto error; smlTrace(TRACE_EXIT, "%s", __func__); Modified: trunk/libsyncml/data_sync_api/data_sync_callbacks.h ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_callbacks.h Fri Aug 7 19:46:04 2009 (r1238) +++ trunk/libsyncml/data_sync_api/data_sync_callbacks.h Fri Aug 7 19:48:10 2009 (r1239) @@ -31,7 +31,7 @@ SmlManager *manager, SmlManagerEventType type, SmlSession *session, - GError *error, + const GError *error, void *userdata); /* *************************************** */ @@ -75,11 +75,7 @@ gboolean smlDataSyncChangeCallback( SmlDsSession *dsession, - SmlChangeType type, - const gchar *uid, - gchar *data, - gsize size, - const gchar *contenttype, + SmlChangeItem *item, void *userdata, GError **error); |