Changeset 87
- Timestamp:
- 02/25/06 18:05:05 (3 years ago)
- Files:
-
- branches/libsyncml-threaded/libsyncml/Makefile.am (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/objects/Makefile.am (modified) (2 diffs)
- branches/libsyncml-threaded/libsyncml/objects/sml_ds_server.c (modified) (18 diffs)
- branches/libsyncml-threaded/libsyncml/objects/sml_ds_server.h (modified) (3 diffs)
- branches/libsyncml-threaded/libsyncml/objects/sml_ds_server_internals.h (modified) (4 diffs)
- branches/libsyncml-threaded/libsyncml/parser/sml_xml_assm.c (modified) (4 diffs)
- branches/libsyncml-threaded/libsyncml/parser/sml_xml_assm_internals.h (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_defines.h (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_devinf.c (modified) (3 diffs)
- branches/libsyncml-threaded/libsyncml/sml_devinf.h (modified) (2 diffs)
- branches/libsyncml-threaded/libsyncml/sml_devinf_internals.h (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_manager.c (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_manager.h (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_notification.c (modified) (8 diffs)
- branches/libsyncml-threaded/libsyncml/sml_notification.h (modified) (2 diffs)
- branches/libsyncml-threaded/libsyncml/sml_notification_internals.h (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_parse.c (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_parse.h (modified) (3 diffs)
- branches/libsyncml-threaded/libsyncml/sml_queue.c (modified) (1 diff)
- branches/libsyncml-threaded/libsyncml/sml_session.c (modified) (3 diffs)
- branches/libsyncml-threaded/libsyncml/sml_support.c (modified) (2 diffs)
- branches/libsyncml-threaded/libsyncml/syncml.h (modified) (1 diff)
- branches/libsyncml-threaded/tests/check_ds.c (modified) (55 diffs)
- branches/libsyncml-threaded/tests/check_san.c (modified) (5 diffs)
- branches/libsyncml-threaded/tools/syncml-http-server.c (modified) (2 diffs)
- branches/libsyncml-threaded/tools/syncml-obex-client.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/libsyncml-threaded/libsyncml/Makefile.am
r75 r87 64 64 parser/libsyncml-wbxml.la \ 65 65 objects/libauth.la \ 66 objects/libdevinf.la \ 66 67 objects/libdsserver.la branches/libsyncml-threaded/libsyncml/objects/Makefile.am
r22 r87 9 9 libsyncmlinclude_HEADERS = \ 10 10 sml_auth.h \ 11 sml_ds_server.h 11 sml_ds_server.h \ 12 sml_devinf_obj.h 12 13 13 14 EXTRA_DIST = \ 14 15 sml_auth_internals.h \ 15 sml_ds_server_internals.h 16 sml_ds_server_internals.h \ 17 sml_devinf_obj_internals.h 16 18 17 noinst_LTLIBRARIES = libauth.la libd sserver.la19 noinst_LTLIBRARIES = libauth.la libdevinf.la libdsserver.la 18 20 19 21 libauth_la_SOURCES = sml_auth.c … … 22 24 libdsserver_la_SOURCES = sml_ds_server.c 23 25 libdsserver_la_LDFLAGS = @PACKAGE_LIBS@ 26 27 libdevinf_la_SOURCES = sml_devinf_obj.c 28 libdevinf_la_LDFLAGS = @PACKAGE_LIBS@ branches/libsyncml-threaded/libsyncml/objects/sml_ds_server.c
r86 r87 51 51 SmlDsSession *dsession = userdata; 52 52 53 switch (smlStatusGetClass(status)) {54 case SML_ERRORCLASS_SUCCESS:55 dsession->state = SML_DS_STATE_SENT_ALERT;56 break;57 default:58 dsession->state = SML_DS_STATE_ERROR;59 break;60 }61 62 53 if (dsession->sentAlertCallback) 63 54 dsession->sentAlertCallback(session, status, dsession->sentAlertCallbackUserdata); … … 69 60 } 70 61 71 static void _devinf_reply(SmlSession *session, SmlStatus *status, void *userdata)72 {73 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata);74 75 smlTrace(TRACE_EXIT, "%s", __func__);76 }77 78 62 static void _sync_reply(SmlSession *session, SmlStatus *status, void *userdata) 79 63 { … … 81 65 SmlDsSession *dsession = userdata; 82 66 83 switch (smlStatusGetClass(status)) {84 case SML_ERRORCLASS_SUCCESS:85 dsession->state = SML_DS_STATE_SENT_CHANGES;86 break;87 default:88 dsession->state = SML_DS_STATE_ERROR;89 break;90 }91 92 67 if (dsession->sentSyncCallback) 93 68 dsession->sentSyncCallback(session, status, dsession->sentSyncCallbackUserdata); … … 108 83 dsession->location = smlLocationClone(cmd->target, NULL); 109 84 dsession->target = smlLocationClone(cmd->source, NULL); 110 111 smlTrace(TRACE_EXIT, "%s", __func__);112 }113 114 void smlDsSessionRecvDevinf(SmlSession *session, SmlCommand *cmd, void *userdata)115 {116 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata);117 SmlDsSession *dsession = userdata;118 119 dsession->recvDevInf = cmd;120 85 121 86 smlTrace(TRACE_EXIT, "%s", __func__); … … 268 233 } 269 234 270 static SmlBool _send_devinf(SmlDsSession *dsession, SmlCommand *get, SmlError **error)271 {272 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, dsession, get, error);273 SmlLocation *loc = NULL;274 275 if (!dsession->sent_devinf) {276 if (get) {277 SmlStatus *result = smlDevInfNewResult(get, get->target, dsession->server->ownDevInf, error);278 if (!result)279 goto error;280 281 if (!smlSessionSendResult(dsession->session, result, _devinf_reply, dsession, error))282 goto error;283 } else {284 loc = smlLocationNew("./devinf11", NULL, error);285 if (!loc)286 goto error;287 288 SmlCommand *cmd = smlDevInfNewPut(loc, dsession->server->ownDevInf, error);289 if (!cmd)290 goto error_free_loc;291 292 smlLocationFree(loc);293 294 if (!smlSessionSendCommand(dsession->session, cmd, NULL, _devinf_reply, dsession, error))295 goto error;296 }297 dsession->sent_devinf= TRUE;298 } else299 smlTrace(TRACE_INTERNAL, "Already sent the devinf!");300 301 smlTrace(TRACE_EXIT, "%s", __func__);302 return TRUE;303 304 error_free_loc:305 smlLocationFree(loc);306 error:307 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error));308 return FALSE;309 }310 311 static void _request_devinf(SmlSession *session, SmlCommand *cmd, void *userdata)312 {313 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata);314 SmlDsSession *dsession = userdata;315 SmlError *error = NULL;316 317 SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error);318 if (!reply)319 goto error;320 321 if (!smlSessionSendReply(session, reply, &error))322 goto error;323 324 if (!_send_devinf(dsession, userdata, &error))325 goto error;326 327 smlTrace(TRACE_EXIT, "%s", __func__);328 return;329 330 error:331 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error));332 }333 334 235 SmlDsSession *smlDsServerRecvAlert(SmlDsServer *server, SmlSession *session, SmlCommand *cmd) 335 236 { … … 500 401 } 501 402 502 SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, Sml Bool send_devinf, SmlError **error)503 { 504 smlTrace(TRACE_ENTRY, "%s(%p, %p, %i, %s, %s, % i, %p)", __func__, server, session, type, last, next, send_devinf, error);403 SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error) 404 { 405 smlTrace(TRACE_ENTRY, "%s(%p, %p, %i, %s, %s, %p)", __func__, server, session, type, last, next, error); 505 406 smlAssert(server); 506 407 smlAssert(session); 507 508 408 509 409 SmlDsSession *dsession = smlDsSessionNew(server, session, error); … … 515 415 goto error_free_session; 516 416 517 if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, send_devinf,error))417 if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, error)) 518 418 goto error_free_target; 519 520 dsession->state = SML_DS_STATE_SENT_ALERT;521 419 522 420 smlTrace(TRACE_EXIT, "%s", __func__); … … 532 430 } 533 431 534 void smlDsServerSetDevinf(SmlDsServer *server, SmlDevInf *devinf)535 {536 smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, server, devinf);537 smlAssert(server);538 539 server->ownDevInf = devinf;540 541 smlTrace(TRACE_EXIT, "%s", __func__);542 }543 544 432 SmlDsSession *smlDsSessionNew(SmlDsServer *server, SmlSession *session, SmlError **error) 545 433 { … … 552 440 553 441 dsession->server = server; 554 dsession->state = SML_DS_STATE_IDLE;555 442 dsession->session = session; 556 443 dsession->lock = g_mutex_new(); … … 596 483 597 484 dsession->alertCommand = NULL; 598 599 dsession->state = SML_DS_STATE_RECV_ALERT;600 485 601 486 smlTrace(TRACE_EXIT, "%s", __func__); 602 } else if (dsession->recvDevInf && dsession->recvDevinfCallback) {603 smlTrace(TRACE_ENTRY, "%s(%p): Dispatching devinf", __func__, dsession);604 605 SmlDevInf *devinf = smlDevInfParse(dsession->recvDevInf->private.access.item->data, dsession->recvDevInf->private.access.item->size, &error);606 if (!devinf)607 goto error;608 609 dsession->recvDevinfCallback(dsession, devinf, dsession->recvDevinfCallbackUserdata);610 dsession->recvDevinfCallback = NULL;611 612 SmlStatus *reply = smlCommandNewReply(dsession->recvDevInf, SML_NO_ERROR, &error);613 if (!reply)614 goto error;615 616 if (!smlSessionSendReply(dsession->session, reply, &error))617 goto error;618 619 dsession->recvDevInf = NULL;620 621 smlTrace(TRACE_EXIT, "%s", __func__);622 487 } else if (dsession->recvSync && dsession->recvSyncCallback) { 623 smlTrace(TRACE_ENTRY, "%s(%p) ", __func__, dsession);488 smlTrace(TRACE_ENTRY, "%s(%p): Dispatching sync", __func__, dsession); 624 489 625 490 dsession->recvSyncCallback(dsession, ((SmlCommand *)(dsession->recvSync->data))->private.sync.numChanged, dsession->changesCallbackUserdata); … … 640 505 dsession->syncReply = SML_NO_ERROR; 641 506 642 dsession->state = SML_DS_STATE_RECV_CHANGES;643 644 507 g_list_free(dsession->recvSync); 645 508 dsession->recvSync = NULL; … … 647 510 smlTrace(TRACE_EXIT, "%s", __func__); 648 511 } else if (dsession->recvChanges && dsession->changesCallback) { 649 smlTrace(TRACE_ENTRY, "%s(%p) ", __func__, dsession);512 smlTrace(TRACE_ENTRY, "%s(%p): Dispatching changes", __func__, dsession); 650 513 651 514 g_mutex_lock(dsession->lock); … … 655 518 if (cmd) { 656 519 SmlItem *item = cmd->private.change.item; 657 if (!item ) {520 if (!item || (!item->source && !item->target)) { 658 521 smlErrorSet(&error, SML_ERROR_GENERIC, "No item"); 659 522 goto error_unlock; 660 523 } 661 524 662 if (cmd->private.change.type == SML_CHANGE_ADD) { 663 if (!dsession->changesCallback(dsession, cmd->private.change.type, item->source->locURI, item->data, item->size, item->contenttype, dsession->changesCallbackUserdata, &error)) 664 goto error_unlock; 525 /* We'd rather use the target of the change since it already the mapped 526 * uid (if we are a client for example). If it is not given we use the 527 * source uri. This has then to be translated by the sync engine of course */ 528 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; 665 530 531 if (cmd->private.change.type == SML_CHANGE_ADD) 666 532 reply = smlCommandNewReply(cmd, SML_ALERT_SLOW_SYNC, &error); 667 } else { 668 if (!dsession->changesCallback(dsession, cmd->private.change.type, item->target->locURI, item->data, item->size, item->contenttype, dsession->changesCallbackUserdata, &error)) 669 goto error_unlock; 670 533 else 671 534 reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error); 672 }673 535 674 536 if (!reply) … … 700 562 { 701 563 if ((dsession->alertCommand && dsession->recvAlertCallback) || \ 702 (dsession->recvDevInf && dsession->recvDevinfCallback) || \703 564 (dsession->recvSync && dsession->recvSyncCallback) || \ 704 565 (dsession->recvChanges && dsession->changesCallback)) … … 745 606 * @returns TRUE if the call was successful, FALSE otherwise 746 607 */ 747 SmlBool smlDsSessionSendAlert(SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, Sml Bool send_devinf, SmlError **error)748 { 749 smlTrace(TRACE_ENTRY, "%s(%p, %i, %s, %s, % i, %p)", __func__, dsession, type, last, next, send_devinf, error);608 SmlBool smlDsSessionSendAlert(SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error) 609 { 610 smlTrace(TRACE_ENTRY, "%s(%p, %i, %s, %s, %p)", __func__, dsession, type, last, next, error); 750 611 smlAssert(dsession); 751 612 … … 760 621 goto error; 761 622 762 if (send_devinf) {763 smlAssert(dsession->server->ownDevInf);764 765 if (!_send_devinf(dsession, NULL, error))766 goto error;767 768 }769 770 dsession->state = SML_DS_STATE_SENT_ALERT;771 772 623 smlTrace(TRACE_EXIT, "%s", __func__); 773 624 return TRUE; … … 776 627 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 777 628 return FALSE; 778 }779 780 void smlDsSessionGetDevinf(SmlDsSession *dsession, SmlDsSessionDevinfCb callback, void *userdata)781 {782 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, dsession, callback, userdata);783 smlAssert(dsession);784 smlAssert(callback);785 786 dsession->recvDevinfCallback = callback;787 dsession->recvDevinfCallbackUserdata = userdata;788 789 smlDsSessionDispatch(dsession);790 791 smlTrace(TRACE_EXIT, "%s", __func__);792 629 } 793 630 … … 1030 867 goto error_free_dsession; 1031 868 1032 SmlLocation *devinf = smlLocationNew("./devinf11", NULL, &error);1033 if (!devinf)1034 goto error_free_dsession;1035 1036 if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_PUT, NULL, devinf, smlDsSessionRecvDevinf, NULL, dsession, &error)) {1037 smlLocationFree(devinf);1038 goto error_free_dsession;1039 }1040 1041 if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_GET, devinf, NULL, _request_devinf, NULL, dsession, &error)) {1042 smlLocationFree(devinf);1043 goto error_free_dsession;1044 }1045 1046 smlLocationFree(devinf);1047 1048 869 smlTrace(TRACE_EXIT, "%s", __func__); 1049 870 return; branches/libsyncml-threaded/libsyncml/objects/sml_ds_server.h
r86 r87 33 33 typedef void (* SmlDsSessionConnectCb) (SmlDsSession *dsession, void *userdata); 34 34 typedef SmlBool (* SmlDsSessionAlertCb) (SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, void *userdata); 35 typedef void (* SmlDsSessionDevinfCb) (SmlDsSession *dsession, SmlDevInf *devinf, void *userdata);36 35 typedef void (* SmlDsSessionSyncCb) (SmlDsSession *dsession, unsigned int numchanges, void *userdata); 37 36 typedef SmlBool (* SmlDsSessionChangesCb) (SmlDsSession *dsession, SmlChangeType type, const char *uid, char *data, unsigned int size, SmlContentType contenttype, void *userdata, SmlError **error); … … 47 46 const char *smlDsServerGetLocation(SmlDsServer *server); 48 47 SmlContentType smlDsServerGetContentType(SmlDsServer *server); 49 SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlBool send_devinf, SmlError **error); 50 void smlDsServerSetDevinf(SmlDsServer *server, SmlDevInf *devinf); 48 SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error); 51 49 52 50 void smlDsSessionDispatch(SmlDsSession *dsession); 53 51 SmlBool smlDsSessionCheck(SmlDsSession *dsession); 54 52 void smlDsSessionGetAlert(SmlDsSession *dsession, SmlDsSessionAlertCb callback, void *userdata); 55 SmlBool smlDsSessionSendAlert(SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, Sml Bool send_devinf, SmlError **error);53 SmlBool smlDsSessionSendAlert(SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error); 56 54 void smlDsSessionGetChanges(SmlDsSession *dsession, SmlDsSessionChangesCb chgCallback, void *userdata); 57 55 void smlDsSessionGetSync(SmlDsSession *dsession, SmlDsSessionSyncCb chgCallback, void *userdata); … … 62 60 SmlBool smlDsSessionCloseMap(SmlDsSession *dsession, SmlStatusReplyCb callback, void *userdata, SmlError **error); 63 61 const char *smlDsSessionGetLocation(SmlDsSession *dsession); 64 void smlDsSessionGetDevinf(SmlDsSession *dsession, SmlDsSessionDevinfCb callback, void *userdata);65 62 66 63 #endif //_SML_DS_SERVER_H_ branches/libsyncml-threaded/libsyncml/objects/sml_ds_server_internals.h
r86 r87 22 22 #define _SML_DS_SERVER_INTERNALS_H_ 23 23 24 typedef enum {25 SML_DS_STATE_IDLE,26 SML_DS_STATE_SENT_ALERT,27 SML_DS_STATE_RECV_ALERT,28 SML_DS_STATE_SENT_CHANGES,29 SML_DS_STATE_RECV_CHANGES,30 SML_DS_STATE_SENT_MAP,31 SML_DS_STATE_RECV_MAP,32 SML_DS_STATE_ERROR33 } SmlDsSessionState;34 35 24 struct SmlDsSession { 36 25 SmlDsServer *server; … … 40 29 SmlLocation *location; 41 30 42 /** Defines the state that the ds server is currently in */43 SmlDsSessionState state;44 45 31 /** Callback that will receive the alert once it is received */ 46 32 SmlDsSessionAlertCb recvAlertCallback; … … 48 34 SmlCommand *alertCommand; 49 35 50 SmlDsSessionDevinfCb recvDevinfCallback;51 void *recvDevinfCallbackUserdata;52 SmlCommand *recvDevInf;53 54 36 /** Callback that will receive the reply to the alert */ 55 37 SmlStatusReplyCb sentAlertCallback; 56 38 void *sentAlertCallbackUserdata; 57 SmlBool sent_devinf;58 39 59 40 /** Callback that will receive the sync command */ … … 94 75 SmlDsSessionConnectCb connectCallback; 95 76 void *connectCallbackUserdata; 96 97 SmlDevInf *ownDevInf;98 77 }; 99 78 100 79 void smlDsSessionRecvAlert(SmlSession *session, SmlCommand *cmd, void *userdata); 101 void smlDsSessionRecvDevinf(SmlSession *session, SmlCommand *cmd, void *userdata);102 80 void smlDsSessionRecvSync(SmlSession *session, SmlCommand *cmd, void *userdata); 103 81 void smlDsSessionRecvChange(SmlSession *session, SmlCommand *cmd, void *userdata); branches/libsyncml-threaded/libsyncml/parser/sml_xml_assm.c
r85 r87 1080 1080 } 1081 1081 1082 SmlBool smlXmlAssemblerReserveResult(SmlXmlAssembler *assm, unsigned int cmdRef, unsigned int msgRef, unsigned int cmdID, SmlError **error) 1083 { 1084 smlTrace(TRACE_ENTRY, "%s(%p, %i, %i, %i, %p)", __func__, assm, cmdRef, msgRef, cmdID, error); 1085 smlAssert(assm); 1086 1087 /* We first start a new writer that will write our status into a buffer */ 1088 SmlXmlAssemblerStatus *res = smlTryMalloc0(sizeof(SmlXmlAssemblerStatus), error); 1089 if (!res) 1090 goto error; 1091 res->cmdRef = cmdRef; 1092 res->cmdID = cmdID; 1093 res->msgRef = msgRef; 1094 res->isResult = TRUE; 1095 1096 /* Now we can append the buffer */ 1097 if (cmdRef != 0) 1098 assm->statuses = g_list_append(assm->statuses, res); 1099 else 1100 assm->statuses = g_list_prepend(assm->statuses, res); 1101 assm->reserved_statuses++; 1102 1103 smlTrace(TRACE_EXIT, "%s", __func__); 1104 return TRUE; 1105 1106 error: 1107 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 1108 return FALSE; 1109 } 1110 1082 1111 SmlBool smlXmlAssemblerReserveStatus(SmlXmlAssembler *assm, unsigned int cmdRef, unsigned int msgRef, unsigned int cmdID, SmlError **error) 1083 1112 { … … 1352 1381 for (b = assm->statuses; b; b = b->next) { 1353 1382 SmlXmlAssemblerStatus *status = b->data; 1354 if (!status->buffer ) {1383 if (!status->buffer && !status->isResult) { 1355 1384 smlTrace(TRACE_INTERNAL, "Reserved status %i is missing", status->cmdRef); 1356 1385 missingstatus = TRUE; … … 1358 1387 } 1359 1388 1389 if (!status->buffer) 1390 continue; 1391 1360 1392 buffersize += xmlBufferLength(status->buffer); 1361 1393 if (maxsize && buffersize > maxsize) … … 1526 1558 functions->add_status = (SmlAssemblerStatusFunction)smlXmlAssemblerAddStatus; 1527 1559 functions->rem_status = (SmlAssemblerRemStatusFunction)smlXmlAssemblerRemStatus; 1560 functions->reserve_result = (SmlAssemblerReserveResultFunction)smlXmlAssemblerReserveResult; 1528 1561 functions->reserve_status = (SmlAssemblerReserveStatusFunction)smlXmlAssemblerReserveStatus; 1529 1562 functions->missing_status = (SmlAssemblerStatusMissingFunction)smlXmlAssemblerMissingStatus; branches/libsyncml-threaded/libsyncml/parser/sml_xml_assm_internals.h
r84 r87 55 55 /** The command id.*/ 56 56 unsigned int cmdID; 57 SmlBool isResult; 57 58 } SmlXmlAssemblerStatus; 58 59 branches/libsyncml-threaded/libsyncml/sml_defines.h
r75 r87 164 164 SML_CONTENT_TYPE_VCAL = 2, 165 165 SML_CONTENT_TYPE_VTODO = 3, 166 SML_CONTENT_TYPE_DEVINF_XML = 4 166 SML_CONTENT_TYPE_PLAIN= 4, 167 SML_CONTENT_TYPE_DEVINF_XML = 5 167 168 } SmlContentType; 168 169 branches/libsyncml-threaded/libsyncml/sml_devinf.c
r79 r87 71 71 } 72 72 73 74 73 SmlStatus *smlDevInfNewResult(SmlCommand *cmd, SmlLocation *source, SmlDevInf *devinf, SmlError **error) 75 74 { … … 161 160 goto error;*/ 162 161 163 const char *dev = "<DevInf xmlns=\"syncml:devinf\"><VerDTD>1.1</VerDTD><Man>Libsyncml</Man><Mod>Libsyncml</Mod><SwV>00</SwV><DevID>1</DevID><DevTyp>Server</DevTyp><UTC></UTC><SupportNumberOfChanges></SupportNumberOfChanges><DataStore><SourceRef>./Notes</SourceRef><MaxGUIDSize>4</MaxGUIDSize><Rx-Pref><CTType>text/plain</CTType><VerCT>1.0</VerCT></Rx-Pref><Tx-Pref><CTType>text/plain</CTType><VerCT>1.0</VerCT></Tx-Pref><DSMem><SharedMem></SharedMem><MaxID>5000</MaxID></DSMem><SyncCap><SyncType>1</SyncType><SyncType>2</SyncType><SyncType>3</SyncType><SyncType>4</SyncType><SyncType>5</SyncType><SyncType>6</SyncType></SyncCap></DataStore></DevInf>"; 164 165 *data = g_strdup(dev); 162 GString *string = g_string_new("<DevInf xmlns=\"syncml:devinf\"><VerDTD>1.1</VerDTD><Man>Libsyncml</Man><Mod>Libsyncml</Mod><SwV>00</SwV><DevID>1</DevID><DevTyp>Server</DevTyp><UTC></UTC><SupportNumberOfChanges></SupportNumberOfChanges>"); 163 164 GList *d = NULL; 165 for (d = devinf->datastores; d; d = d->next) { 166 SmlDevInfDataStore *datastore = d->data; 167 char *dchar = NULL; 168 unsigned int dsize = 0; 169 if (!smlDevInfDataStoreAssemble(datastore, &dchar, &dsize, error)) 170 goto error; 171 172 string = g_string_append(string, dchar); 173 } 174 175 string = g_string_append(string, "</DevInf>"); 176 177 178 179 *data = string->str; 180 *size = strlen(string->str) + 1; 181 182 g_string_free(string, FALSE); 183 184 smlTrace(TRACE_EXIT, "%s", __func__); 185 return TRUE; 186 187 error: 188 g_string_free(string, TRUE); 189 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 190 return FALSE; 191 } 192 193 void smlDevInfAddDataStore(SmlDevInf *devinf, SmlDevInfDataStore *datastore) 194 { 195 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, devinf, datastore); 196 smlAssert(devinf); 197 smlAssert(datastore); 198 199 devinf->datastores = g_list_append(devinf->datastores, datastore); 200 201 202 smlTrace(TRACE_EXIT, "%s", __func__); 203 } 204 205 SmlDevInfDataStore *smlDevInfDataStoreNew(SmlLocation *sourceRef, SmlContentType recvContentType, SmlError **error) 206 { 207 smlTrace(TRACE_ENTRY, "%s(%p, %i, %p)", __func__, sourceRef, error); 208 209 SmlDevInfDataStore *datastore = smlTryMalloc0(sizeof(SmlDevInfDataStore), error); 210 if (!datastore) 211 goto error; 212 213 datastore->sourceRef = smlLocationClone(sourceRef, error); 214 if (!datastore->sourceRef) 215 goto error_free_datastore; 216 217 datastore->recvContentType = recvContentType; 218 219 smlTrace(TRACE_EXIT, "%s: %p", __func__, datastore); 220 return datastore; 221 222 error_free_datastore: 223 g_free(datastore); 224 error: 225 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 226 return NULL; 227 } 228 229 void smlDevInfDataStoreFree(SmlDevInfDataStore *datastore) 230 { 231 smlTrace(TRACE_ENTRY, "%s(%p)", __func__, datastore); 232 smlAssert(datastore); 233 234 g_free(datastore); 235 236 smlTrace(TRACE_EXIT, "%s", __func__); 237 } 238 239 SmlBool smlDevInfDataStoreAssemble(SmlDevInfDataStore *datastore, char **data, unsigned int *size, SmlError **error) 240 { 241 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, datastore, data, size, error); 242 smlAssert(datastore); 243 smlAssert(data); 244 smlAssert(size); 245 246 char *dev = NULL; 247 switch (datastore->recvContentType) { 248 case SML_CONTENT_TYPE_VCARD: 249 dev = g_strdup_printf("<DataStore><SourceRef>%s</SourceRef><MaxGUIDSize>6</MaxGUIDSize><Rx-Pref><CTType>text/x-vcard</CTType><VerCT>2.1</VerCT></Rx-Pref><Tx-Pref><CTType>text/x-vcard</CTType><VerCT>2.1</VerCT></Tx-Pref><SyncCap><SyncType>1</SyncType><SyncType>2</SyncType><SyncType>3</SyncType><SyncType>4</SyncType><SyncType>5</SyncType><SyncType>6</SyncType></SyncCap></DataStore>", datastore->sourceRef->locURI); 250 break; 251 case SML_CONTENT_TYPE_VTODO: 252 case SML_CONTENT_TYPE_VCAL: 253 dev = g_strdup_printf("<DataStore><SourceRef>%s</SourceRef><MaxGUIDSize>8</MaxGUIDSize><Rx-Pref><CTType>text/x-vcalendar</CTType><VerCT>1.0</VerCT></Rx-Pref><Rx><CTType>text/calendar</CTType><VerCT>2.0</VerCT></Rx><Tx-Pref><CTType>text/x-vcalendar</CTType><VerCT>1.0</VerCT></Tx-Pref><SyncCap><SyncType>1</SyncType><SyncType>2</SyncType><SyncType>3</SyncType><SyncType>4</SyncType><SyncType>5</SyncType><SyncType>6</SyncType><SyncType>7</SyncType></SyncCap></DataStore>", datastore->sourceRef->locURI); 254 break; 255 case SML_CONTENT_TYPE_PLAIN: 256 dev = g_strdup_printf("<DataStore><SourceRef>%s</SourceRef><MaxGUIDSize>4</MaxGUIDSize><Rx-Pref><CTType>text/plain</CTType><VerCT>1.0</VerCT></Rx-Pref><Tx-Pref><CTType>text/plain</CTType><VerCT>1.0</VerCT></Tx-Pref><DSMem><SharedMem></SharedMem><MaxID>5000</MaxID></DSMem><SyncCap><SyncType>1</SyncType><SyncType>2</SyncType><SyncType>3</SyncType><SyncType>4</SyncType><SyncType>5</SyncType><SyncType>6</SyncType></SyncCap></DataStore>", datastore->sourceRef->locURI); 257 break; 258 default: 259 smlErrorSet(error, SML_ERROR_GENERIC, "unknown content type"); 260 goto error; 261 } 262 263 *data = dev; 166 264 *size = strlen(dev) + 1; 167 265 … … 169 267 return TRUE; 170 268 171 /*error:172 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 173 return FALSE; */269 error: 270 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 271 return FALSE; 174 272 } 175 273 branches/libsyncml-threaded/libsyncml/sml_devinf.h
r79 r87 21 21 #ifndef _SML_DEVINF_H_ 22 22 #define _SML_DEVINF_H_ 23 24 typedef enum { 25 SML_DEVINF_VERSION_UNKNOWN = 0, 26 SML_DEVINF_VERSION_11 = 1 27 } SmlDevInfVersion; 23 28 24 29 #define SML_DEVINF_ELEMENT_CTCAP "CTCap" … … 67 72 SmlDevInf *smlDevInfParse(const char *data, unsigned int length, SmlError **error); 68 73 SmlBool smlDevInfAssemble(SmlDevInf *devinf, char **data, unsigned int *size, SmlError **error); 74 void smlDevInfAddDataStore(SmlDevInf *devinf, SmlDevInfDataStore *datastore); 69 75 76 SmlDevInfDataStore *smlDevInfDataStoreNew(SmlLocation *sourceRef, SmlContentType recvContentType, SmlError **error); 77 void smlDevInfDataStoreFree(SmlDevInfDataStore *datastore); 78 SmlBool smlDevInfDataStoreAssemble(SmlDevInfDataStore *datastore, char **data, unsigned int *size, SmlError **error); 70 79 #endif //_SML_DEVINF_H_ branches/libsyncml-threaded/libsyncml/sml_devinf_internals.h
r67 r87 23 23 24 24 struct SmlDevInf { 25 int argh; 25 SmlDevInfVersion version; 26 char *manufacturer; 27 char *modell; 28 char *softwareVersion; 29 unsigned int devID; 30 GList *datastores; 31 }; 32 33 struct SmlDevInfDataStore { 34 SmlLocation *sourceRef; 35 unsigned int maxGuidSize; 36 SmlContentType recvContentType; 37 SmlContentType sendContentType; 26 38 }; 27 39 branches/libsyncml-threaded/libsyncml/sml_manager.c
r86 r87 299 299 break; 300 300 case SML_SESSION_EVENT_CHILD_COMMAND: 301 if (!smlManagerDispatchChildCommand(manager, session, parent, command, &locerror)) 302 goto error; 303 break; 301 304 case SML_SESSION_EVENT_COMMAND: 302 305 if (!smlManagerDispatchCommand(manager, session, command, &locerror)) branches/libsyncml-threaded/libsyncml/sml_manager.h
r86 r87 48 48 void smlManagerObjectFree(SmlObject *object); 49 49 SmlObject *smlManagerObjectFind(SmlManager *manager, SmlCommand *cmd); 50 SmlBool smlManagerDispatchChildCommand(SmlManager *manager, SmlSession *session, SmlCommand *parent, SmlCommand *cmd, SmlError **error); 50 51 SmlBool smlManagerDispatchHeader(SmlManager *manager, SmlSession *session, SmlHeader *header, SmlError **error); 51 52 SmlBool smlManagerDispatchCommand(SmlManager *manager, SmlSession *session, SmlCommand *cmd, SmlError **error); branches/libsyncml-threaded/libsyncml/sml_notification.c
r85 r87 51 51 */ 52 52 53 SmlNotification *smlNotificationNew(SmlNotificationVersion version, SmlNotificationUIMode mode, SmlNotificationInitiator init, unsigned int sessionID, const char *identifier, Sml Error **error)54 { 55 smlTrace(TRACE_ENTRY, "%s(% p)", __func__, error);53 SmlNotification *smlNotificationNew(SmlNotificationVersion version, SmlNotificationUIMode mode, SmlNotificationInitiator init, unsigned int sessionID, const char *identifier, SmlMimeType type, SmlError **error) 54 { 55 smlTrace(TRACE_ENTRY, "%s(%i, %i, %i, %i, %s, %i, %p)", __func__, version, mode, init, sessionID, identifier, type, error); 56 56 57 57 SmlNotification *san = smlTryMalloc0(sizeof(SmlNotification), error); … … 64 64 san->sessionID = sessionID; 65 65 san->identifier = g_strdup(identifier); 66 san->type = type; 66 67 67 68 smlTrace(TRACE_EXIT, "%s: %p", __func__, san); … … 252 253 } 253 254 254 static SmlBool _smlNotificationAssemble11(SmlNotification *san, char **data, unsigned int *size, Sml Error **error)255 { 256 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, % p)", __func__, san, data, size, error);255 static SmlBool _smlNotificationAssemble11(SmlNotification *san, char **data, unsigned int *size, SmlProtocolVersion version, SmlError **error) 256 { 257 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %i, %p)", __func__, san, data, size, version, error); 257 258 smlAssert(san); 258 259 smlAssert(data); … … 261 262 SmlCommand *cmd = NULL; 262 263 263 SmlAssembler *assm = smlAssemblerNew( SML_MIMETYPE_WBXML, 0, error);264 SmlAssembler *assm = smlAssemblerNew(san->type, 0, error); 264 265 if (!assm) 265 266 goto error; … … 273 274 goto error_free_assm; 274 275 275 SmlSession *session = smlSessionNew(SML_SESSION_TYPE_SERVER, SML_MIMETYPE_WBXML, SML_VERSION_11, SML_PROTOCOL_SYNCML, source, target, "1", 0, error);276 SmlSession *session = smlSessionNew(SML_SESSION_TYPE_SERVER, san->type, version, SML_PROTOCOL_SYNCML, source, target, "1", 0, error); 276 277 if (!session) { 277 278 smlLocationFree(source); … … 297 298 goto error_free_session; 298 299 299 SmlLocation *loc2 = smlLocationNew("./C\\System\\Data\\Contacts.cdb", NULL, error); 300 if (!loc2) 301 goto error_free_session; 302 303 304 cmd = smlCommandNewAlert(SML_ALERT_TWO_WAY_BY_SERVER, loc2, loc, NULL, NULL, alert->contenttype, error); 300 cmd = smlCommandNewAlert(SML_ALERT_TWO_WAY_BY_SERVER, NULL, loc, NULL, NULL, alert->contenttype, error); 305 301 if (!cmd) { 306 302 smlLocationFree(loc); … … 452 448 case SML_SAN_VERSION_12: 453 449 return _smlNotificationAssemble12(san, data, size, error); 450 case SML_SAN_VERSION_10: 451 return _smlNotificationAssemble11(san, data, size, SML_VERSION_10, error); 454 452 case SML_SAN_VERSION_11: 455 return _smlNotificationAssemble11(san, data, size, error); 453 return _smlNotificationAssemble11(san, data, size, SML_VERSION_11, error); 454 case SML_SAN_VERSION_UNKNOWN:
