Changeset 87

Show
Ignore:
Timestamp:
02/25/06 18:05:05 (3 years ago)
Author:
abauer
Message:

Made further improvments to the obex tool to allow more
flexibility.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libsyncml-threaded/libsyncml/Makefile.am

    r75 r87  
    6464        parser/libsyncml-wbxml.la \ 
    6565        objects/libauth.la \ 
     66        objects/libdevinf.la \ 
    6667        objects/libdsserver.la  
  • branches/libsyncml-threaded/libsyncml/objects/Makefile.am

    r22 r87  
    99libsyncmlinclude_HEADERS = \ 
    1010        sml_auth.h \ 
    11         sml_ds_server.h 
     11        sml_ds_server.h \ 
     12        sml_devinf_obj.h 
    1213         
    1314EXTRA_DIST = \ 
    1415        sml_auth_internals.h \ 
    15         sml_ds_server_internals.h 
     16        sml_ds_server_internals.h \ 
     17        sml_devinf_obj_internals.h 
    1618         
    17 noinst_LTLIBRARIES = libauth.la libdsserver.la 
     19noinst_LTLIBRARIES = libauth.la libdevinf.la libdsserver.la 
    1820 
    1921libauth_la_SOURCES = sml_auth.c 
     
    2224libdsserver_la_SOURCES = sml_ds_server.c 
    2325libdsserver_la_LDFLAGS = @PACKAGE_LIBS@ 
     26 
     27libdevinf_la_SOURCES = sml_devinf_obj.c 
     28libdevinf_la_LDFLAGS = @PACKAGE_LIBS@ 
  • branches/libsyncml-threaded/libsyncml/objects/sml_ds_server.c

    r86 r87  
    5151        SmlDsSession *dsession = userdata; 
    5252         
    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          
    6253        if (dsession->sentAlertCallback) 
    6354                dsession->sentAlertCallback(session, status, dsession->sentAlertCallbackUserdata); 
     
    6960} 
    7061 
    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  
    7862static void _sync_reply(SmlSession *session, SmlStatus *status, void *userdata) 
    7963{ 
     
    8165        SmlDsSession *dsession = userdata; 
    8266         
    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          
    9267        if (dsession->sentSyncCallback) 
    9368                dsession->sentSyncCallback(session, status, dsession->sentSyncCallbackUserdata); 
     
    10883        dsession->location = smlLocationClone(cmd->target, NULL); 
    10984        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; 
    12085         
    12186        smlTrace(TRACE_EXIT, "%s", __func__); 
     
    268233} 
    269234 
    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         } else 
    299                 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  
    334235SmlDsSession *smlDsServerRecvAlert(SmlDsServer *server, SmlSession *session, SmlCommand *cmd) 
    335236{ 
     
    500401} 
    501402 
    502 SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlBool 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); 
     403SmlDsSession *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); 
    505406        smlAssert(server); 
    506407        smlAssert(session); 
    507          
    508408         
    509409        SmlDsSession *dsession = smlDsSessionNew(server, session, error); 
     
    515415                goto error_free_session; 
    516416         
    517         if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, send_devinf, error)) 
     417        if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, error)) 
    518418                goto error_free_target; 
    519          
    520         dsession->state = SML_DS_STATE_SENT_ALERT; 
    521419         
    522420        smlTrace(TRACE_EXIT, "%s", __func__); 
     
    532430} 
    533431 
    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  
    544432SmlDsSession *smlDsSessionNew(SmlDsServer *server, SmlSession *session, SmlError **error) 
    545433{ 
     
    552440 
    553441        dsession->server = server; 
    554         dsession->state = SML_DS_STATE_IDLE; 
    555442        dsession->session = session; 
    556443        dsession->lock = g_mutex_new(); 
     
    596483                         
    597484                dsession->alertCommand = NULL; 
    598                  
    599                 dsession->state = SML_DS_STATE_RECV_ALERT; 
    600485 
    601486                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__);    
    622487        } else if (dsession->recvSync && dsession->recvSyncCallback) { 
    623                 smlTrace(TRACE_ENTRY, "%s(%p)", __func__, dsession); 
     488                smlTrace(TRACE_ENTRY, "%s(%p): Dispatching sync", __func__, dsession); 
    624489                 
    625490                dsession->recvSyncCallback(dsession, ((SmlCommand *)(dsession->recvSync->data))->private.sync.numChanged, dsession->changesCallbackUserdata); 
     
    640505                dsession->syncReply = SML_NO_ERROR; 
    641506                 
    642                 dsession->state = SML_DS_STATE_RECV_CHANGES; 
    643                  
    644507                g_list_free(dsession->recvSync); 
    645508                dsession->recvSync = NULL; 
     
    647510                smlTrace(TRACE_EXIT, "%s", __func__); 
    648511        } else if (dsession->recvChanges && dsession->changesCallback) { 
    649                 smlTrace(TRACE_ENTRY, "%s(%p)", __func__, dsession); 
     512                smlTrace(TRACE_ENTRY, "%s(%p): Dispatching changes", __func__, dsession); 
    650513                 
    651514                g_mutex_lock(dsession->lock); 
     
    655518                        if (cmd) { 
    656519                                SmlItem *item = cmd->private.change.item; 
    657                                 if (!item) { 
     520                                if (!item || (!item->source && !item->target)) { 
    658521                                        smlErrorSet(&error, SML_ERROR_GENERIC, "No item"); 
    659522                                        goto error_unlock; 
    660523                                } 
    661524                                 
    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; 
    665530                                                 
     531                                if (cmd->private.change.type == SML_CHANGE_ADD) 
    666532                                        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 
    671534                                        reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error); 
    672                                 } 
    673535                                 
    674536                                if (!reply) 
     
    700562{ 
    701563        if ((dsession->alertCommand && dsession->recvAlertCallback) || \ 
    702                 (dsession->recvDevInf && dsession->recvDevinfCallback) || \ 
    703564                (dsession->recvSync && dsession->recvSyncCallback) || \ 
    704565                (dsession->recvChanges && dsession->changesCallback)) 
     
    745606 * @returns TRUE if the call was successful, FALSE otherwise 
    746607 */ 
    747 SmlBool smlDsSessionSendAlert(SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlBool send_devinf, SmlError **error) 
    748 { 
    749         smlTrace(TRACE_ENTRY, "%s(%p, %i, %s, %s, %i, %p)", __func__, dsession, type, last, next, send_devinf, error); 
     608SmlBool 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); 
    750611        smlAssert(dsession); 
    751612         
     
    760621                goto error; 
    761622         
    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          
    772623        smlTrace(TRACE_EXIT, "%s", __func__); 
    773624        return TRUE; 
     
    776627        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
    777628        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__); 
    792629} 
    793630 
     
    1030867                goto error_free_dsession; 
    1031868         
    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          
    1048869        smlTrace(TRACE_EXIT, "%s", __func__); 
    1049870        return; 
  • branches/libsyncml-threaded/libsyncml/objects/sml_ds_server.h

    r86 r87  
    3333typedef void (* SmlDsSessionConnectCb) (SmlDsSession *dsession, void *userdata); 
    3434typedef SmlBool (* SmlDsSessionAlertCb) (SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, void *userdata); 
    35 typedef void (* SmlDsSessionDevinfCb) (SmlDsSession *dsession, SmlDevInf *devinf, void *userdata); 
    3635typedef void (* SmlDsSessionSyncCb) (SmlDsSession *dsession, unsigned int numchanges, void *userdata); 
    3736typedef SmlBool (* SmlDsSessionChangesCb) (SmlDsSession *dsession, SmlChangeType type, const char *uid, char *data, unsigned int size, SmlContentType contenttype, void *userdata, SmlError **error); 
     
    4746const char *smlDsServerGetLocation(SmlDsServer *server); 
    4847SmlContentType 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); 
     48SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error); 
    5149 
    5250void smlDsSessionDispatch(SmlDsSession *dsession); 
    5351SmlBool smlDsSessionCheck(SmlDsSession *dsession); 
    5452void smlDsSessionGetAlert(SmlDsSession *dsession, SmlDsSessionAlertCb callback, void *userdata); 
    55 SmlBool smlDsSessionSendAlert(SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlBool send_devinf, SmlError **error); 
     53SmlBool smlDsSessionSendAlert(SmlDsSession *dsession, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error); 
    5654void smlDsSessionGetChanges(SmlDsSession *dsession, SmlDsSessionChangesCb chgCallback, void *userdata); 
    5755void smlDsSessionGetSync(SmlDsSession *dsession, SmlDsSessionSyncCb chgCallback, void *userdata); 
     
    6260SmlBool smlDsSessionCloseMap(SmlDsSession *dsession, SmlStatusReplyCb callback, void *userdata, SmlError **error); 
    6361const char *smlDsSessionGetLocation(SmlDsSession *dsession); 
    64 void smlDsSessionGetDevinf(SmlDsSession *dsession, SmlDsSessionDevinfCb callback, void *userdata); 
    6562 
    6663#endif //_SML_DS_SERVER_H_ 
  • branches/libsyncml-threaded/libsyncml/objects/sml_ds_server_internals.h

    r86 r87  
    2222#define _SML_DS_SERVER_INTERNALS_H_ 
    2323 
    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_ERROR 
    33 } SmlDsSessionState; 
    34  
    3524struct SmlDsSession { 
    3625        SmlDsServer *server; 
     
    4029        SmlLocation *location; 
    4130         
    42         /** Defines the state that the ds server is currently in */ 
    43         SmlDsSessionState state; 
    44          
    4531        /** Callback that will receive the alert once it is received */ 
    4632        SmlDsSessionAlertCb recvAlertCallback; 
     
    4834        SmlCommand *alertCommand; 
    4935         
    50         SmlDsSessionDevinfCb recvDevinfCallback; 
    51         void *recvDevinfCallbackUserdata; 
    52         SmlCommand *recvDevInf; 
    53          
    5436        /** Callback that will receive the reply to the alert */ 
    5537        SmlStatusReplyCb sentAlertCallback; 
    5638        void *sentAlertCallbackUserdata; 
    57         SmlBool sent_devinf; 
    5839         
    5940        /** Callback that will receive the sync command */ 
     
    9475        SmlDsSessionConnectCb connectCallback; 
    9576        void *connectCallbackUserdata; 
    96          
    97         SmlDevInf *ownDevInf; 
    9877}; 
    9978 
    10079void smlDsSessionRecvAlert(SmlSession *session, SmlCommand *cmd, void *userdata); 
    101 void smlDsSessionRecvDevinf(SmlSession *session, SmlCommand *cmd, void *userdata); 
    10280void smlDsSessionRecvSync(SmlSession *session, SmlCommand *cmd, void *userdata); 
    10381void smlDsSessionRecvChange(SmlSession *session, SmlCommand *cmd, void *userdata); 
  • branches/libsyncml-threaded/libsyncml/parser/sml_xml_assm.c

    r85 r87  
    10801080} 
    10811081 
     1082SmlBool 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         
     1106error: 
     1107        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
     1108        return FALSE; 
     1109} 
     1110 
    10821111SmlBool smlXmlAssemblerReserveStatus(SmlXmlAssembler *assm, unsigned int cmdRef, unsigned int msgRef, unsigned int cmdID, SmlError **error) 
    10831112{ 
     
    13521381        for (b = assm->statuses; b; b = b->next) { 
    13531382                SmlXmlAssemblerStatus *status = b->data; 
    1354                 if (!status->buffer) { 
     1383                if (!status->buffer && !status->isResult) { 
    13551384                        smlTrace(TRACE_INTERNAL, "Reserved status %i is missing", status->cmdRef); 
    13561385                        missingstatus = TRUE; 
     
    13581387                } 
    13591388                 
     1389                if (!status->buffer) 
     1390                        continue; 
     1391                         
    13601392                buffersize += xmlBufferLength(status->buffer); 
    13611393                if (maxsize && buffersize > maxsize) 
     
    15261558        functions->add_status = (SmlAssemblerStatusFunction)smlXmlAssemblerAddStatus; 
    15271559        functions->rem_status = (SmlAssemblerRemStatusFunction)smlXmlAssemblerRemStatus; 
     1560        functions->reserve_result = (SmlAssemblerReserveResultFunction)smlXmlAssemblerReserveResult; 
    15281561        functions->reserve_status = (SmlAssemblerReserveStatusFunction)smlXmlAssemblerReserveStatus; 
    15291562        functions->missing_status = (SmlAssemblerStatusMissingFunction)smlXmlAssemblerMissingStatus; 
  • branches/libsyncml-threaded/libsyncml/parser/sml_xml_assm_internals.h

    r84 r87  
    5555        /** The command id.*/ 
    5656        unsigned int cmdID; 
     57        SmlBool isResult; 
    5758} SmlXmlAssemblerStatus; 
    5859 
  • branches/libsyncml-threaded/libsyncml/sml_defines.h

    r75 r87  
    164164        SML_CONTENT_TYPE_VCAL = 2, 
    165165        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 
    167168} SmlContentType; 
    168169 
  • branches/libsyncml-threaded/libsyncml/sml_devinf.c

    r79 r87  
    7171} 
    7272 
    73  
    7473SmlStatus *smlDevInfNewResult(SmlCommand *cmd, SmlLocation *source, SmlDevInf *devinf, SmlError **error) 
    7574{ 
     
    161160                goto error;*/ 
    162161                 
    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         
     187error: 
     188        g_string_free(string, TRUE); 
     189        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
     190        return FALSE; 
     191
     192 
     193void 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 
     205SmlDevInfDataStore *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 
     222error_free_datastore: 
     223        g_free(datastore); 
     224error: 
     225        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
     226        return NULL;     
     227
     228 
     229void 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 
     239SmlBool 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; 
    166264        *size = strlen(dev) + 1; 
    167265         
     
    169267        return TRUE; 
    170268         
    171 /*error: 
    172         smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
    173         return FALSE;*/ 
     269error: 
     270        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
     271        return FALSE; 
    174272} 
    175273 
  • branches/libsyncml-threaded/libsyncml/sml_devinf.h

    r79 r87  
    2121#ifndef _SML_DEVINF_H_ 
    2222#define _SML_DEVINF_H_ 
     23 
     24typedef enum  { 
     25        SML_DEVINF_VERSION_UNKNOWN = 0, 
     26        SML_DEVINF_VERSION_11 = 1 
     27} SmlDevInfVersion; 
    2328 
    2429#define SML_DEVINF_ELEMENT_CTCAP "CTCap" 
     
    6772SmlDevInf *smlDevInfParse(const char *data, unsigned int length, SmlError **error); 
    6873SmlBool smlDevInfAssemble(SmlDevInf *devinf, char **data, unsigned int *size, SmlError **error); 
     74void smlDevInfAddDataStore(SmlDevInf *devinf, SmlDevInfDataStore *datastore); 
    6975 
     76SmlDevInfDataStore *smlDevInfDataStoreNew(SmlLocation *sourceRef, SmlContentType recvContentType, SmlError **error); 
     77void smlDevInfDataStoreFree(SmlDevInfDataStore *datastore); 
     78SmlBool smlDevInfDataStoreAssemble(SmlDevInfDataStore *datastore, char **data, unsigned int *size, SmlError **error); 
    7079#endif //_SML_DEVINF_H_ 
  • branches/libsyncml-threaded/libsyncml/sml_devinf_internals.h

    r67 r87  
    2323 
    2424struct 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 
     33struct SmlDevInfDataStore { 
     34        SmlLocation *sourceRef; 
     35        unsigned int maxGuidSize; 
     36        SmlContentType recvContentType; 
     37        SmlContentType sendContentType; 
    2638}; 
    2739 
  • branches/libsyncml-threaded/libsyncml/sml_manager.c

    r86 r87  
    299299                        break; 
    300300                case SML_SESSION_EVENT_CHILD_COMMAND: 
     301                        if (!smlManagerDispatchChildCommand(manager, session, parent, command, &locerror)) 
     302                                goto error; 
     303                        break; 
    301304                case SML_SESSION_EVENT_COMMAND: 
    302305                        if (!smlManagerDispatchCommand(manager, session, command, &locerror)) 
  • branches/libsyncml-threaded/libsyncml/sml_manager.h

    r86 r87  
    4848void smlManagerObjectFree(SmlObject *object); 
    4949SmlObject *smlManagerObjectFind(SmlManager *manager, SmlCommand *cmd); 
     50SmlBool smlManagerDispatchChildCommand(SmlManager *manager, SmlSession *session, SmlCommand *parent, SmlCommand *cmd, SmlError **error); 
    5051SmlBool smlManagerDispatchHeader(SmlManager *manager, SmlSession *session, SmlHeader *header, SmlError **error); 
    5152SmlBool smlManagerDispatchCommand(SmlManager *manager, SmlSession *session, SmlCommand *cmd, SmlError **error); 
  • branches/libsyncml-threaded/libsyncml/sml_notification.c

    r85 r87  
    5151 */ 
    5252 
    53 SmlNotification *smlNotificationNew(SmlNotificationVersion version, SmlNotificationUIMode mode, SmlNotificationInitiator init, unsigned int sessionID, const char *identifier, SmlError **error) 
    54 { 
    55         smlTrace(TRACE_ENTRY, "%s(%p)", __func__, error); 
     53SmlNotification *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); 
    5656 
    5757        SmlNotification *san = smlTryMalloc0(sizeof(SmlNotification), error); 
     
    6464        san->sessionID = sessionID; 
    6565        san->identifier = g_strdup(identifier); 
     66        san->type = type; 
    6667         
    6768        smlTrace(TRACE_EXIT, "%s: %p", __func__, san); 
     
    252253} 
    253254 
    254 static SmlBool _smlNotificationAssemble11(SmlNotification *san, char **data, unsigned int *size, SmlError **error) 
    255 { 
    256         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, san, data, size, error); 
     255static 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); 
    257258        smlAssert(san); 
    258259        smlAssert(data); 
     
    261262        SmlCommand *cmd = NULL; 
    262263 
    263         SmlAssembler *assm = smlAssemblerNew(SML_MIMETYPE_WBXML, 0, error); 
     264        SmlAssembler *assm = smlAssemblerNew(san->type, 0, error); 
    264265        if (!assm) 
    265266                goto error; 
     
    273274                goto error_free_assm; 
    274275         
    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); 
    276277        if (!session) { 
    277278                smlLocationFree(source); 
     
    297298                        goto error_free_session; 
    298299                 
    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); 
    305301                if (!cmd) { 
    306302                        smlLocationFree(loc); 
     
    452448                case SML_SAN_VERSION_12: 
    453449                        return _smlNotificationAssemble12(san, data, size, error); 
     450                case SML_SAN_VERSION_10: 
     451                        return _smlNotificationAssemble11(san, data, size, SML_VERSION_10, error); 
    454452                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: