Changeset 116
- Timestamp:
- 03/16/06 23:35:16 (3 years ago)
- Files:
-
- branches/development-branch/acinclude.m4 (modified) (1 diff)
- branches/development-branch/configure.ac (modified) (4 diffs)
- branches/development-branch/libsyncml/objects/sml_devinf_obj.c (modified) (1 diff)
- branches/development-branch/libsyncml/objects/sml_ds_server.c (modified) (30 diffs)
- branches/development-branch/libsyncml/objects/sml_ds_server.h (modified) (1 diff)
- branches/development-branch/libsyncml/objects/sml_ds_server_internals.h (modified) (2 diffs)
- branches/development-branch/libsyncml/parser/Makefile.am (modified) (1 diff)
- branches/development-branch/libsyncml/parser/sml_wbxml.c (modified) (2 diffs)
- branches/development-branch/libsyncml/parser/sml_xml_assm.c (modified) (23 diffs)
- branches/development-branch/libsyncml/parser/sml_xml_parse.c (modified) (32 diffs)
- branches/development-branch/libsyncml/sml_command.c (modified) (6 diffs)
- branches/development-branch/libsyncml/sml_elements.c (modified) (3 diffs)
- branches/development-branch/libsyncml/sml_elements.h (modified) (1 diff)
- branches/development-branch/libsyncml/sml_elements_internals.h (modified) (1 diff)
- branches/development-branch/libsyncml/sml_error.h (modified) (1 diff)
- branches/development-branch/libsyncml/sml_manager.c (modified) (32 diffs)
- branches/development-branch/libsyncml/sml_manager.h (modified) (2 diffs)
- branches/development-branch/libsyncml/sml_manager_internals.h (modified) (2 diffs)
- branches/development-branch/libsyncml/sml_notification.c (modified) (1 diff)
- branches/development-branch/libsyncml/sml_parse.c (modified) (5 diffs)
- branches/development-branch/libsyncml/sml_parse.h (modified) (2 diffs)
- branches/development-branch/libsyncml/sml_queue.c (modified) (15 diffs)
- branches/development-branch/libsyncml/sml_session.c (modified) (29 diffs)
- branches/development-branch/libsyncml/sml_session.h (modified) (1 diff)
- branches/development-branch/libsyncml/sml_support.c (modified) (3 diffs)
- branches/development-branch/libsyncml/sml_transport.c (modified) (3 diffs)
- branches/development-branch/libsyncml/transports/Makefile.am (modified) (1 diff)
- branches/development-branch/libsyncml/transports/http_client.c (modified) (7 diffs)
- branches/development-branch/libsyncml/transports/http_client_internals.h (modified) (1 diff)
- branches/development-branch/libsyncml/transports/http_server.c (modified) (2 diffs)
- branches/development-branch/libsyncml/transports/obex_client.c (modified) (2 diffs)
- branches/development-branch/libsyncml/transports/obex_server.c (modified) (2 diffs)
- branches/development-branch/tests/Makefile.am (modified) (2 diffs)
- branches/development-branch/tests/check_ds.c (modified) (41 diffs)
- branches/development-branch/tests/check_elements.c (modified) (1 diff)
- branches/development-branch/tests/check_manager.c (modified) (6 diffs)
- branches/development-branch/tests/check_session.c (modified) (31 diffs)
- branches/development-branch/tests/check_wbxml_assembler.c (modified) (13 diffs)
- branches/development-branch/tests/check_wbxml_parser.c (modified) (3 diffs)
- branches/development-branch/tests/check_xml_assembler.c (modified) (28 diffs)
- branches/development-branch/tests/valgrind.supp (modified) (1 diff)
- branches/development-branch/tools/syncml-http-server.c (modified) (1 diff)
- branches/development-branch/tools/syncml-obex-client.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/development-branch/acinclude.m4
r101 r116 38 38 AC_SUBST(WBXML_LIBS) 39 39 fi 40 41 AM_CONDITIONAL(ENABLE_WBXML, test x$LIBWBXML = xyes) 40 42 41 43 CFLAGS="$ac_save_CFLAGS" branches/development-branch/configure.ac
r114 r116 24 24 AC_SUBST(LIBXML_LIBS) 25 25 26 #### Check for fixedlibsoup ####26 #### Check for libsoup #### 27 27 AC_ARG_ENABLE(http, 28 28 AS_HELP_STRING([--enable-http], [enable http transports]), … … 46 46 fi 47 47 fi 48 48 AM_CONDITIONAL(ENABLE_HTTP, test x$HAVE_LIBSOUP = xyes) 49 49 50 #### Check for openobex #### 50 51 AC_ARG_ENABLE(obex, … … 71 72 fi 72 73 fi 74 AM_CONDITIONAL(ENABLE_OBEX, test x$HAVE_OPENOBEX = xyes) 73 75 74 76 #### Ask if the tools are needed #### … … 99 101 AC_SUBST(ENABLE_TRACE) 100 102 fi 103 AM_CONDITIONAL(ENABLE_TRACE, test x$WITH_TRACE = xyes) 101 104 102 105 #### Check for glib #### branches/development-branch/libsyncml/objects/sml_devinf_obj.c
r115 r116 255 255 goto error; 256 256 257 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, devinf10, _recv_devinf, NULL, agent, error))258 goto error_free_loc; 259 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, devinf11, _recv_devinf, NULL, agent, error))260 goto error_free_loc; 261 262 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, devinf10, NULL, _request_devinf, NULL, agent, error))263 goto error_free_loc; 264 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, devinf11, NULL, _request_devinf, NULL, agent, error))257 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, NULL, devinf10, _recv_devinf, NULL, agent, error)) 258 goto error_free_loc; 259 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, NULL, devinf11, _recv_devinf, NULL, agent, error)) 260 goto error_free_loc; 261 262 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, NULL, devinf10, NULL, _request_devinf, NULL, agent, error)) 263 goto error_free_loc; 264 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, NULL, devinf11, NULL, _request_devinf, NULL, agent, error)) 265 265 goto error_free_loc; 266 266 branches/development-branch/libsyncml/objects/sml_ds_server.c
r115 r116 36 36 /*@{*/ 37 37 38 typedef struct SmlWriteContext {39 SmlDsSessionWriteCb callback;40 char *uid;41 char *newuid;42 SmlStatus *status;43 void *userdata;44 SmlChangeType type;45 SmlDsSession *session;46 } SmlWriteContext;47 48 static void _alert_reply(SmlSession *session, SmlStatus *status, void *userdata)49 {50 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata);51 SmlDsSession *dsession = userdata;52 53 if (dsession->sentAlertCallback)54 dsession->sentAlertCallback(session, status, dsession->sentAlertCallbackUserdata);55 56 dsession->sentAlertCallback = NULL;57 dsession->sentAlertCallbackUserdata = NULL;58 59 smlTrace(TRACE_EXIT, "%s", __func__);60 }61 62 static void _sync_reply(SmlSession *session, SmlStatus *status, void *userdata)63 {64 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata);65 SmlDsSession *dsession = userdata;66 67 if (dsession->sentSyncCallback)68 dsession->sentSyncCallback(session, status, dsession->sentSyncCallbackUserdata);69 70 dsession->sentSyncCallback = NULL;71 dsession->sentSyncCallbackUserdata = NULL;72 73 smlTrace(TRACE_EXIT, "%s", __func__);74 }75 76 void smlDsSessionRecvAlert(SmlSession *session, SmlCommand *cmd, void *userdata)77 {78 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata);79 SmlDsSession *dsession = userdata;80 81 dsession->alertCommand = cmd;82 83 dsession->location = smlLocationClone(cmd->target, NULL);84 dsession->target = smlLocationClone(cmd->source, NULL);85 86 smlTrace(TRACE_EXIT, "%s", __func__);87 }88 89 38 static SmlWriteContext *_write_context_find(SmlDsSession *dsession, const char *uid, SmlChangeType type) 90 39 { … … 104 53 } 105 54 55 static void _write_context_free(SmlWriteContext *ctx) 56 { 57 smlTrace(TRACE_ENTRY, "%s(%p)", __func__, ctx); 58 59 if (ctx->status) 60 smlStatusUnref(ctx->status); 61 62 if (ctx->uid) 63 g_free(ctx->uid); 64 65 if (ctx->newuid) 66 g_free(ctx->newuid); 67 68 g_free(ctx); 69 70 smlTrace(TRACE_EXIT, "%s", __func__); 71 } 72 106 73 static void _write_context_dispatch(SmlDsSession *dsession, SmlWriteContext *ctx) 107 74 { … … 117 84 if (((ctx->type != SML_CHANGE_ADD || smlStatusGetClass(ctx->status) != SML_ERRORCLASS_SUCCESS) && !ctx->newuid) || dsession->server->servertype == SML_DS_CLIENT) { 118 85 ctx->callback(dsession, ctx->status, NULL, ctx->userdata); 119 g_free(ctx->uid); 120 g_free(ctx); 86 87 _write_context_free(ctx); 88 121 89 dsession->pendingMaps = g_list_remove(dsession->pendingMaps, ctx); 122 90 smlTrace(TRACE_EXIT, "%s", __func__); … … 130 98 131 99 ctx->callback(dsession, ctx->status, ctx->newuid, ctx->userdata); 132 g_free(ctx->uid);133 g_free(ctx->newuid);134 g_free(ctx);100 101 _write_context_free(ctx); 102 135 103 dsession->pendingMaps = g_list_remove(dsession->pendingMaps, ctx); 136 104 137 105 smlTrace(TRACE_EXIT, "%s: Dispatched add", __func__); 138 106 } 139 void smlDsSessionRecvSync(SmlSession *session, SmlCommand *cmd, void *userdata) 140 { 141 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 107 108 static void _alert_reply(SmlSession *session, SmlStatus *status, void *userdata) 109 { 110 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata); 142 111 SmlDsSession *dsession = userdata; 143 SmlError *error = NULL; 144 145 if (dsession->syncReply == SML_ERROR_UNKNOWN) { 146 smlTrace(TRACE_INTERNAL, "Storing sync command with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 147 dsession->recvSync = g_list_append(dsession->recvSync, cmd); 148 } else { 149 smlTrace(TRACE_INTERNAL, "Using stored sync reply on cmd with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 150 SmlStatus *reply = smlCommandNewReply(cmd, dsession->syncReply, &error); 151 if (!reply) 152 goto error; 153 154 if (!smlSessionSendReply(dsession->session, reply, &error)) 155 goto error; 156 } 157 158 smlTrace(TRACE_EXIT, "%s", __func__); 159 return; 160 161 error: 162 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 163 smlErrorDeref(&error); 164 } 165 166 void smlDsSessionRecvChange(SmlSession *session, SmlCommand *cmd, void *userdata) 167 { 168 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, session, cmd, userdata); 112 113 if (dsession->sentAlertCallback) 114 dsession->sentAlertCallback(session, status, dsession->sentAlertCallbackUserdata); 115 116 dsession->sentAlertCallback = NULL; 117 dsession->sentAlertCallbackUserdata = NULL; 118 119 smlTrace(TRACE_EXIT, "%s", __func__); 120 } 121 122 static void _sync_reply(SmlSession *session, SmlStatus *status, void *userdata) 123 { 124 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata); 169 125 SmlDsSession *dsession = userdata; 170 126 171 g_mutex_lock(dsession->lock); 172 dsession->recvChanges = g_list_append(dsession->recvChanges, cmd); 173 g_mutex_unlock(dsession->lock); 127 if (dsession->sentSyncCallback) 128 dsession->sentSyncCallback(session, status, dsession->sentSyncCallbackUserdata); 129 130 dsession->sentSyncCallback = NULL; 131 dsession->sentSyncCallbackUserdata = NULL; 174 132 175 133 smlTrace(TRACE_EXIT, "%s", __func__); … … 197 155 198 156 ctx->status = status; 157 smlStatusRef(status); 199 158 _write_context_dispatch(dsession, ctx); 200 159 201 160 smlTrace(TRACE_EXIT, "%s", __func__); 202 }203 204 void smlDsSessionRecvMap(SmlSession *session, SmlCommand *cmd, void *userdata)205 {206 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata);207 SmlDsSession *dsession = userdata;208 SmlError *error = NULL;209 210 SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error);211 if (!reply)212 goto error;213 214 if (!smlSessionSendReply(session, reply, &error))215 goto error;216 217 GList *m = NULL;218 for (m = cmd->private.map.items; m; m = m->next) {219 SmlMapItem *item = m->data;220 SmlWriteContext *ctx = _write_context_find(dsession, item->target->locURI, SML_CHANGE_ADD);221 if (ctx) {222 ctx->newuid = g_strdup(item->source->locURI);223 _write_context_dispatch(dsession, ctx);224 }225 }226 227 smlTrace(TRACE_EXIT, "%s", __func__);228 return;229 230 error:231 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error));232 smlErrorDeref(&error);233 }234 235 SmlDsSession *smlDsServerRecvAlert(SmlDsServer *server, SmlSession *session, SmlCommand *cmd)236 {237 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, server, session, cmd);238 SmlError *error = NULL;239 240 server->target = smlLocationClone(session->target, &error);241 if (!server->target)242 goto error;243 244 SmlDsSession *dsession = smlDsSessionNew(server, session, &error);245 if (!dsession)246 goto error_free_target;247 248 smlDsSessionRecvAlert(session, cmd, dsession);249 250 if (server->connectCallback)251 server->connectCallback(dsession, server->connectCallbackUserdata);252 253 server->target = smlLocationClone(cmd->source, &error);254 if (!server->target)255 goto error_free_dsession;256 257 smlTrace(TRACE_EXIT, "%s", __func__);258 return dsession;259 260 error_free_dsession:261 g_free(dsession);262 error_free_target:263 smlLocationUnref(server->target);264 error:265 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error));266 smlErrorDeref(&error);267 return NULL;268 161 } 269 162 … … 287 180 goto error; 288 181 289 server->location = smlLocationClone(location, error); 290 if (!server->location) 291 goto error_free_server; 182 server->location = location; 183 smlLocationRef(location); 292 184 293 185 server->contenttype = type; … … 297 189 return server; 298 190 299 error_free_server:300 g_free(server);301 191 error: 302 192 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); … … 314 204 goto error; 315 205 316 server->location = smlLocationClone(location, error); 317 if (!server->location) 318 goto error_free_server; 319 320 server->target = smlLocationClone(target, error); 321 if (!server->target) 322 goto error_free_location; 206 server->location = location; 207 smlLocationRef(location); 208 209 server->target = target; 210 smlLocationRef(target); 323 211 324 212 server->contenttype = type; … … 328 216 return server; 329 217 330 error_free_location:331 smlLocationUnref(server->location);332 error_free_server:333 g_free(server);334 218 error: 335 219 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); … … 344 228 if (server->location) 345 229 smlLocationUnref(server->location); 230 231 if (server->target) 232 smlLocationUnref(server->target); 346 233 347 234 g_free(server); … … 401 288 } 402 289 290 SmlDsSession *smlDsServerRecvAlert(SmlDsServer *server, SmlSession *session, SmlCommand *cmd) 291 { 292 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, server, session, cmd); 293 SmlError *error = NULL; 294 295 SmlDsSession *dsession = smlDsSessionNew(server, session, &error); 296 if (!dsession) 297 goto error; 298 299 smlDsSessionRecvAlert(session, cmd, dsession); 300 301 if (server->connectCallback) 302 server->connectCallback(dsession, server->connectCallbackUserdata); 303 304 smlDsSessionUnref(dsession); 305 306 smlTrace(TRACE_EXIT, "%s", __func__); 307 return dsession; 308 309 error: 310 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 311 smlErrorDeref(&error); 312 return NULL; 313 } 314 403 315 SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error) 404 316 { … … 411 323 goto error; 412 324 413 server->target = smlLocationClone(session->target, error); 414 if (!server->target) 325 if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, error)) 415 326 goto error_free_session; 416 327 417 if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, error))418 goto error_free_target;419 420 328 smlTrace(TRACE_EXIT, "%s", __func__); 421 329 return dsession; 422 330 423 error_free_target:424 smlLocationUnref(server->target);425 331 error_free_session: 426 332 g_free(dsession); … … 443 349 dsession->lock = g_mutex_new(); 444 350 dsession->syncReply = SML_ERROR_UNKNOWN; 351 dsession->refCount = 1; 352 353 if (server->servertype == SML_DS_CLIENT) { 354 dsession->target = server->target; 355 smlLocationRef(dsession->target); 356 } 357 358 dsession->location = server->location; 359 smlLocationRef(dsession->location); 445 360 446 361 smlTrace(TRACE_EXIT, "%s: %p", __func__, dsession); … … 452 367 } 453 368 454 void smlDsSession Free(SmlDsSession *dsession)369 void smlDsSessionRef(SmlDsSession *dsession) 455 370 { 456 371 smlTrace(TRACE_ENTRY, "%s(%p)", __func__, dsession); 457 372 smlAssert(dsession); 458 373 459 g_mutex_free(dsession->lock); 460 g_free(dsession); 461 462 smlTrace(TRACE_EXIT, "%s", __func__); 374 g_atomic_int_inc(&(dsession->refCount)); 375 376 smlTrace(TRACE_EXIT, "%s: New refcount: %i", __func__, dsession->refCount); 377 } 378 379 void smlDsSessionUnref(SmlDsSession *dsession) 380 { 381 smlTrace(TRACE_ENTRY, "%s(%p)", __func__, dsession); 382 smlAssert(dsession); 383 384 if (g_atomic_int_dec_and_test(&(dsession->refCount))) { 385 smlTrace(TRACE_INTERNAL, "Refcount == 0!"); 386 387 if (dsession->target) 388 smlLocationUnref(dsession->target); 389 390 if (dsession->location) 391 smlLocationUnref(dsession->location); 392 393 if (dsession->alertCommand) 394 smlCommandUnref(dsession->alertCommand); 395 396 while (dsession->recvSync) { 397 SmlCommand *cmd = dsession->recvSync->data; 398 smlCommandUnref(cmd); 399 dsession->recvSync = g_list_delete_link(dsession->recvSync, dsession->recvSync); 400 } 401 402 while (dsession->recvChanges) { 403 SmlCommand *cmd = dsession->recvChanges->data; 404 smlCommandUnref(cmd); 405 dsession->recvChanges = g_list_delete_link(dsession->recvChanges, dsession->recvChanges); 406 } 407 408 if (dsession->syncCommand) 409 smlCommandUnref(dsession->syncCommand); 410 411 while (dsession->pendingMaps) { 412 SmlWriteContext *ctx = dsession->pendingMaps->data; 413 _write_context_free(ctx); 414 dsession->pendingMaps = g_list_delete_link(dsession->pendingMaps, dsession->pendingMaps); 415 } 416 417 418 while (dsession->mapItems) { 419 SmlMapItem *item = dsession->mapItems->data; 420 smlMapItemUnref(item); 421 dsession->mapItems = g_list_delete_link(dsession->mapItems, dsession->mapItems); 422 } 423 424 g_mutex_free(dsession->lock); 425 426 g_free(dsession); 427 } 428 429 smlTrace(TRACE_EXIT, "%s", __func__); 463 430 } 464 431 … … 470 437 if (dsession->alertCommand && dsession->recvAlertCallback) { 471 438 smlTrace(TRACE_ENTRY, "%s(%p): Dispatching alert", __func__, dsession); 439 440 g_mutex_lock(dsession->lock); 472 441 SmlErrorType type = SML_NO_ERROR; 473 442 if (!dsession->recvAlertCallback(dsession, dsession->alertCommand->private.alert.type, dsession->alertCommand->private.alert.anchor->last, dsession->alertCommand->private.alert.anchor->next, dsession->recvAlertCallbackUserdata)) … … 481 450 if (!smlSessionSendReply(dsession->session, reply, &error)) 482 451 goto error; 483 452 453 454 smlStatusUnref(reply); 455 456 smlCommandUnref(dsession->alertCommand); 484 457 dsession->alertCommand = NULL; 485 458 459 g_mutex_unlock(dsession->lock); 486 460 smlTrace(TRACE_EXIT, "%s", __func__); 487 461 } else if (dsession->recvSync && dsession->recvSyncCallback) { 488 462 smlTrace(TRACE_ENTRY, "%s(%p): Dispatching sync", __func__, dsession); 489 463 464 g_mutex_lock(dsession->lock); 490 465 dsession->recvSyncCallback(dsession, ((SmlCommand *)(dsession->recvSync->data))->private.sync.numChanged, dsession->changesCallbackUserdata); 491 466 dsession->recvSyncCallback = NULL; 492 467 493 GList *c = NULL;494 for (c = dsession->recvSync; c; c = c->next) {495 SmlCommand *cmd = (SmlCommand *)(c->data);468 while (dsession->recvSync) { 469 SmlCommand *cmd = dsession->recvSync->data; 470 496 471 smlTrace(TRACE_INTERNAL, "answering sync command with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 497 472 SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error); … … 501 476 if (!smlSessionSendReply(dsession->session, reply, &error)) 502 477 goto error; 478 479 smlStatusUnref(reply); 480 481 smlCommandUnref(cmd); 482 dsession->recvSync = g_list_delete_link(dsession->recvSync, dsession->recvSync); 503 483 } 504 484 505 485 dsession->syncReply = SML_NO_ERROR; 506 486 507 g_list_free(dsession->recvSync); 508 dsession->recvSync = NULL; 509 487 g_mutex_unlock(dsession->lock); 510 488 smlTrace(TRACE_EXIT, "%s", __func__); 511 489 } else if (dsession->recvChanges && dsession->changesCallback) { … … 520 498 if (!item || (!item->source && !item->target)) { 521 499 smlErrorSet(&error, SML_ERROR_GENERIC, "No item"); 522 goto error _unlock;500 goto error; 523 501 } 524 502 … … 527 505 * source uri. This has then to be translated by the sync engine of course */ 528 506 if (!dsession->changesCallback(dsession, cmd->private.change.type, item->target ? item->target->locURI : item->source->locURI, item->data, item->size, item->contenttype, dsession->changesCallbackUserdata, &error)) 529 goto error _unlock;507 goto error; 530 508 531 509 if (cmd->private.change.type == SML_CHANGE_ADD) … … 535 513 536 514 if (!reply) 537 goto error _unlock;515 goto error; 538 516 539 517 if (!smlSessionSendReply(dsession->session, reply, &error)) 540 goto error_unlock; 518 goto error; 519 520 smlStatusUnref(reply); 521 522 smlCommandUnref(cmd); 541 523 } 542 524 525 543 526 dsession->recvChanges = g_list_delete_link(dsession->recvChanges, dsession->recvChanges); 544 527 } … … 550 533 return; 551 534 552 error_unlock:553 g_mutex_unlock(dsession->lock);554 535 error: 555 536 if (reply) 556 537 smlStatusUnref(reply); 538 g_mutex_unlock(dsession->lock); 557 539 smlTrace(TRACE_EXIT_ERROR, "%s: Unable to dispatch: %s", __func__, smlErrorPrint(&error)); 558 540 smlErrorDeref(&error); … … 566 548 return TRUE; 567 549 return FALSE; 550 } 551 552 void smlDsSessionRecvAlert(SmlSession *session, SmlCommand *cmd, void *userdata) 553 { 554 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 555 SmlDsSession *dsession = userdata; 556 SmlError *error = NULL; 557 smlAssert(dsession->location); 558 559 g_mutex_lock(dsession->lock); 560 561 if (!cmd->target || !cmd->source) { 562 SmlStatus *reply = smlCommandNewReply(cmd, SML_ERROR_BAD_REQUEST, &error); 563 if (!reply) 564 goto error; 565 566 if (!smlSessionSendReply(session, reply, &error)) { 567 smlStatusUnref(reply); 568 goto error; 569 } 570 571 smlStatusUnref(reply); 572 573 smlTrace(TRACE_EXIT, "%s: Alert had no target or source", __func__); 574 return; 575 } 576 577 if (!smlLocationCompare(NULL, dsession->location, NULL, cmd->target)) { 578 SmlStatus *reply = smlCommandNewReply(cmd, SML_ERROR_NOT_FOUND, &error); 579 if (!reply) 580 goto error; 581 582 if (!smlSessionSendReply(session, reply, &error)) { 583 smlStatusUnref(reply); 584 goto error; 585 } 586 587 smlStatusUnref(reply); 588 589 smlTrace(TRACE_EXIT, "%s: Alert does not match our location", __func__); 590 return; 591 } 592 593 smlCommandRef(cmd); 594 595 if (!dsession->target) { 596 dsession->target = cmd->source; 597 smlLocationRef(cmd->source); 598 } 599 600 dsession->alertCommand = cmd; 601 602 g_mutex_unlock(dsession->lock); 603 604 smlTrace(TRACE_EXIT, "%s", __func__); 605 return; 606 607 error: 608 g_mutex_unlock(dsession->lock); 609 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 610 smlErrorDeref(&error); 611 return; 612 } 613 614 void smlDsSessionRecvSync(SmlSession *session, SmlCommand *cmd, void *userdata) 615 { 616 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 617 SmlDsSession *dsession = userdata; 618 SmlError *error = NULL; 619 620 g_mutex_lock(dsession->lock); 621 if (dsession->syncReply == SML_ERROR_UNKNOWN) { 622 smlTrace(TRACE_INTERNAL, "Storing sync command with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 623 smlCommandRef(cmd); 624 dsession->recvSync = g_list_append(dsession->recvSync, cmd); 625 } else { 626 smlTrace(TRACE_INTERNAL, "Using stored sync reply on cmd with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 627 SmlStatus *reply = smlCommandNewReply(cmd, dsession->syncReply, &error); 628 if (!reply) 629 goto error; 630 631 if (!smlSessionSendReply(dsession->session, reply, &error)) 632 goto error; 633 634 smlStatusUnref(reply); 635 } 636 g_mutex_unlock(dsession->lock); 637 638 smlTrace(TRACE_EXIT, "%s", __func__); 639 return; 640 641 error: 642 g_mutex_unlock(dsession->lock); 643 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 644 smlErrorDeref(&error); 645 } 646 647 void smlDsSessionRecvChange(SmlSession *session, SmlCommand *cmd, void *userdata) 648 { 649 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 650 SmlDsSession *dsession = userdata; 651 652 g_mutex_lock(dsession->lock); 653 dsession->recvChanges = g_list_append(dsession->recvChanges, cmd); 654 smlCommandRef(cmd); 655 g_mutex_unlock(dsession->lock); 656 657 smlTrace(TRACE_EXIT, "%s", __func__); 658 } 659 660 void smlDsSessionRecvMap(SmlSession *session, SmlCommand *cmd, void *userdata) 661 { 662 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 663 SmlDsSession *dsession = userdata; 664 SmlError *error = NULL; 665 666 g_mutex_lock(dsession->lock); 667 668 SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error); 669 if (!reply) 670 goto error; 671 672 if (!smlSessionSendReply(session, reply, &error)) 673 goto error; 674 675 smlStatusUnref(reply); 676 677 GList *m = NULL; 678 for (m = cmd->private.map.items; m; m = m->next) { 679 SmlMapItem *item = m->data; 680 SmlWriteContext *ctx = _write_context_find(dsession, item->target->locURI, SML_CHANGE_ADD); 681 if (ctx) { 682 ctx->newuid = g_strdup(item->source->locURI); 683 _write_context_dispatch(dsession, ctx); 684 } 685 } 686 687 g_mutex_unlock(dsession->lock); 688 689 smlTrace(TRACE_EXIT, "%s", __func__); 690 return; 691 692 error: 693 g_mutex_unlock(dsession->lock); 694 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 695 smlErrorDeref(&error); 568 696 } 569 697 … … 620 748 if (!smlSessionSendCommand(dsession->session, alert, NULL, _alert_reply, dsession, error)) 621 749 goto error; 750 751 smlCommandUnref(alert); 622 752 623 753 smlTrace(TRACE_EXIT, "%s", __func__); … … 695 825 dsession->sentSyncCallbackUserdata = userdata; 696 826 697 dsession->syncCommand = smlCommandNewSync(dsession-> server->target, dsession->server->location, num_changes, error);827 dsession->syncCommand = smlCommandNewSync(dsession->target, dsession->location, num_changes, error); 698 828 if (!dsession->syncCommand) 699 829 goto error; … … 740 870 goto error_free_ctx; 741 871 872 smlCommandUnref(cmd); 873 742 874 smlTrace(TRACE_EXIT, "%s", __func__); 743 875 return TRUE; … … 772 904 goto error; 773 905 906 smlCommandUnref(dsession->syncCommand); 774 907 dsession->syncCommand = NULL; 775 908 … … 828 961 if (!smlCommandAddMapItem(cmd, item, error)) 829 962 goto error_free_cmd; 963 smlMapItemUnref(item); 830 964 831 965 dsession->mapItems = g_list_remove(dsession->mapItems, item); … … 834 968 if (!smlSessionSendCommand(dsession->session, cmd, NULL, callback, userdata, error)) 835 969 goto error_free_cmd; 970 971 smlCommandUnref(cmd); 836 972 837 973 smlTrace(TRACE_EXIT, "%s", __func__); … … 867 1003 goto error; 868 1004 869 if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_SYNC, se rver->location, NULL, smlDsSessionRecvSync, smlDsSessionRecvChange, dsession, &error))1005 if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_SYNC, session, server->location, NULL, smlDsSessionRecvSync, smlDsSessionRecvChange, dsession, &error)) 870 1006 goto error_free_dsession; 871 1007 872 if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_MAP, se rver->location, NULL, smlDsSessionRecvMap, NULL, dsession, &error))1008 if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_MAP, session, server->location, NULL, smlDsSessionRecvMap, NULL, dsession, &error)) 873 1009 goto error_free_dsession; 874 1010 … … 890 1026 smlAssert(manager); 891 1027 892 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_ALERT, server->location, NULL, _recv_manager_alert, NULL, server, error))1028 if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_ALERT, NULL, server->location, NULL, _recv_manager_alert, NULL, server, error)) 893 1029 goto error; 894 1030 branches/development-branch/libsyncml/objects/sml_ds_server.h
r101
