Changeset 169

Show
Ignore:
Timestamp:
05/24/06 16:43:46 (2 years ago)
Author:
abauer
Message:

Fixed some bugs

ds server can now configure things like largeObject handling,
support for number of changes etc without needing a devinf

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/dev-branch/libsyncml/objects/sml_auth.c

    r160 r169  
    108108        } 
    109109         
    110         if (auth->state == SML_ERROR_AUTH_REJECTED || auth->state == SML_ERROR_AUTH_REQUIRED) 
     110        if (auth->state == SML_ERROR_AUTH_REJECTED || auth->state == SML_ERROR_AUTH_REQUIRED) { 
     111                smlTrace(TRACE_INTERNAL, "Ending session due to wrong / missing creds"); 
    111112                session->end = TRUE; 
     113        } 
    112114         
    113115        reply = smlAuthHeaderReply(session, auth->state, &error); 
  • branches/dev-branch/libsyncml/parser/sml_xml_assm.c

    r166 r169  
    198198} 
    199199 
    200 SmlBool smlItemAssemble(SmlItem *item, SmlXmlAssembler *assm, SmlBool raw, unsigned int complete_size, SmlError **error) 
    201 { 
    202         smlTrace(TRACE_ENTRY, "%s(%p, %p, %i, %i, %p)", __func__, item, assm, raw, complete_size, error); 
     200SmlBool smlItemAssemble(SmlItem *item, SmlXmlAssembler *assm, SmlError **error) 
     201{ 
     202        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, item, assm, error); 
    203203        smlAssert(assm); 
    204204        smlAssert(item); 
     
    222222        } 
    223223         
    224         //Meta 
    225         /*if (complete_size) { 
    226                 if (!_smlXmlAssemblerStartNode(assm, SML_ELEMENT_META, error)) 
    227                         goto error; 
    228                          
    229                 if (!_smlXmlAssemblerAddIDNS(assm, NULL, SML_ELEMENT_SIZE, SML_NAMESPACE_METINF, complete_size, error)) 
    230                         goto error; 
    231          
    232                 //META 
    233                 if (!_smlXmlAssemblerEndNode(assm, error)) 
    234                         goto error; 
    235         }*/ 
    236          
    237224        if (smlItemHasData(item)) { 
    238225                if (item->disabled) { 
    239                         if (!_smlXmlAssemblerAddData(assm, SML_ELEMENT_DATA, "", 0, raw, error)) 
     226                        if (!_smlXmlAssemblerAddData(assm, SML_ELEMENT_DATA, "", 0, item->raw, error)) 
    240227                                goto error; 
    241228                } else { 
     
    245232                                goto error; 
    246233                         
    247                         if (!_smlXmlAssemblerAddData(assm, SML_ELEMENT_DATA, data, size, raw, error)) 
     234                        if (!_smlXmlAssemblerAddData(assm, SML_ELEMENT_DATA, data, size, item->raw, error)) 
    248235                                goto error; 
    249236                } 
     
    347334                goto error; 
    348335         
    349         if (!smlItemAssemble(change->private.access.item, assm, FALSE, 0, error)) 
     336        if (!smlItemAssemble(change->private.access.item, assm, error)) 
    350337                goto error; 
    351338         
     
    381368                goto error; 
    382369         
    383         if (change->size) { 
     370        const char *opt = smlAssemblerGetOption(assm->assembler, "USE_LARGEOBJECTS"); 
     371        SmlBool supportsLargeObjects = (opt && !atoi(opt)) ? FALSE : TRUE; 
     372        if (supportsLargeObjects && change->size) { 
    384373                if (!_smlXmlAssemblerAddIDNS(assm, SML_ELEMENT_SIZE, SML_NAMESPACE_METINF, change->size, error)) 
    385374                        goto error; 
     
    390379                goto error; 
    391380         
    392         const char *opt = smlAssemblerGetOption(assm->assembler, "ONLY_REPLACE"); 
     381        opt = smlAssemblerGetOption(assm->assembler, "ONLY_REPLACE"); 
    393382        if (opt && atoi(opt) && change->type == SML_COMMAND_TYPE_ADD) { 
    394383                change->private.change.item->target = change->private.change.item->source; 
     
    396385        } 
    397386         
    398         if (!smlItemAssemble(change->private.change.item, assm, FALSE, change->size, error)) 
     387        if (!smlItemAssemble(change->private.change.item, assm, error)) 
    399388                goto error; 
    400389         
     
    418407        } 
    419408         
    420         if (assm->session->supportsLargeObjects && assm->session->incomingMaxObjSize && assm->session->version != SML_VERSION_10) { 
     409        const char *opt = smlAssemblerGetOption(assm->assembler, "USE_LARGEOBJECTS"); 
     410        SmlBool supportsLargeObjects = (opt && !atoi(opt)) ? FALSE : TRUE; 
     411        if (supportsLargeObjects && assm->session->incomingMaxObjSize && assm->session->version != SML_VERSION_10) { 
    421412                if (!_smlXmlAssemblerStartNode(assm, SML_ELEMENT_META, error)) 
    422413                        goto error; 
     
    441432                goto error; 
    442433         
    443         /*if (assm->session->supportsNumberOfChanges && assm->session->version != SML_VERSION_10) { 
     434        opt = smlAssemblerGetOption(assm->assembler, "USE_NUMBEROFCHANGES"); 
     435        SmlBool supportsNumberOfChanges = (opt && !atoi(opt)) ? FALSE : TRUE; 
     436        if (supportsNumberOfChanges && assm->session->version != SML_VERSION_10) { 
    444437                if (!_smlXmlAssemblerAddID(assm, SML_ELEMENT_NUMBEROFCHANGES, cmd->private.sync.numChanged, error)) 
    445438                        goto error; 
    446         }*/ 
     439        } 
    447440         
    448441        smlTrace(TRACE_EXIT, "%s", __func__); 
     
    605598                goto error; 
    606599         
    607         if (!smlItemAssemble(cmd->private.results.status->item, assm, TRUE, 0, error)) 
     600        if (!smlItemAssemble(cmd->private.results.status->item, assm, error)) 
    608601                goto error; 
    609602         
     
    712705                goto error_free_writer; 
    713706         
    714         if (session->incomingMaxMsgSize || session->incomingMaxObjSize) { 
     707        //const char *opt = smlAssemblerGetOption(assm->assembler, "USE_LARGEOBJECTS"); 
     708        //SmlBool supportsLargeObjects = (opt && !atoi(opt)) ? FALSE : TRUE; 
     709        if (session->incomingMaxMsgSize) { // || (session->incomingMaxObjSize && supportsLargeObjects)) { 
    715710                if (!_smlXmlAssemblerStartNode(assm, SML_ELEMENT_META, error)) 
    716711                        goto error_free_writer; 
     
    721716                } 
    722717                 
    723                 if (session->incomingMaxObjSize) { 
     718                /*if (supportsLargeObjects && session->incomingMaxObjSize) { 
    724719                        if (!_smlXmlAssemblerAddIDNS(assm, SML_ELEMENT_MAXOBJSIZE, SML_NAMESPACE_METINF, session->incomingMaxObjSize, error)) 
    725720                                goto error_free_writer; 
    726                 } 
     721                }*/ 
    727722                 
    728723                //META 
     
    15561551SmlBool smlXmlAssemblerRun(SmlXmlAssembler *assm, char **data, unsigned int *size, SmlBool *end, SmlBool final, unsigned int maxsize, SmlError **error) 
    15571552{ 
    1558         return smlXmlAssemblerRunFull(assm, data, size, end, final, TRUE, maxsize, error); 
     1553        SmlBool ans = smlXmlAssemblerRunFull(assm, data, size, end, final, TRUE, maxsize, error); 
     1554                 
     1555        smlLog("sent-%i.xml", *data, *size); 
     1556        return ans; 
    15591557} 
    15601558 
  • branches/dev-branch/libsyncml/parser/sml_xml_parse.c

    r166 r169  
    492492} 
    493493 
    494 static SmlBool _smlCommandSyncMetaParse(SmlXmlParser *parser, unsigned int *maxobjsize, SmlError **error) 
     494static SmlBool _smlCommandSyncMetaParse(SmlXmlParser *parser, int *maxobjsize, SmlError **error) 
    495495{ 
    496496        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, parser, maxobjsize, error); 
     
    519519                        goto error; 
    520520                } else if (maxobjsize && !strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_MAXOBJSIZE)) { 
    521                         if (!_smlXmlParserGetID(parser, maxobjsize, SML_ELEMENT_MAXOBJSIZE, error)) 
     521                        unsigned int loc_maxobjsize = 0; 
     522                        if (!_smlXmlParserGetID(parser, &loc_maxobjsize, SML_ELEMENT_MAXOBJSIZE, error)) 
    522523                                goto error; 
     524                        *maxobjsize = loc_maxobjsize; 
    523525                } else { 
    524526                        smlErrorSet(error, SML_ERROR_GENERIC, "wrong initial node: %s", xmlTextReaderConstName(parser->reader)); 
     
    985987        if (!*cmd) 
    986988                goto error; 
     989        (*cmd)->private.sync.maxObjSize = -1; 
    987990         
    988991        while (1) { 
     
    10211024                                goto error_free_cmd; 
    10221025                } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_NUMBEROFCHANGES)) { 
     1026                        (*cmd)->private.sync.hasNumChanged = TRUE; 
    10231027                        if (!_smlXmlParserGetID(parser, &((*cmd)->private.sync.numChanged), SML_ELEMENT_NUMBEROFCHANGES, error)) 
    10241028                                goto error_free_cmd; 
     
    13671371        char *debugstr = smlPrintBinary(data, size); 
    13681372        smlTrace(TRACE_INTERNAL, "Xml input: %s", debugstr); 
     1373        smlLog("received-%i.xml", data, size); 
    13691374        g_free(debugstr); 
    13701375         
     
    20492054        } 
    20502055         
     2056        smlDevInfAddDataStore(devinf, datastore); 
     2057         
    20512058        smlTrace(TRACE_EXIT, "%s", __func__); 
    20522059        return TRUE; 
  • branches/dev-branch/libsyncml/sml_command_internals.h

    r166 r169  
    2929 
    3030typedef struct SmlCommandSyncPrivate { 
    31         unsigned int numChanged; 
     31        int numChanged; 
    3232        unsigned int maxObjSize; 
     33        SmlBool hasNumChanged; 
    3334} SmlCommandSyncPrivate; 
    3435 
  • branches/dev-branch/libsyncml/sml_devinf.c

    r166 r169  
    513513} 
    514514 
     515void smlDevInfConfigureSession(SmlDevInf *devinf, SmlSession *session) 
     516{ 
     517        smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, devinf, session); 
     518        smlAssert(devinf); 
     519        smlAssert(session); 
     520         
     521        if (!devinf->supportsNumberOfChanges) 
     522                smlSessionUseNumberOfChanges(session, FALSE); 
     523                 
     524        if (!devinf->supportsLargeObjs) 
     525                smlSessionUseLargeObjects(session, FALSE); 
     526                 
     527        smlTrace(TRACE_EXIT, "%s", __func__); 
     528} 
     529 
    515530SmlCommand *smlDevInfNewResult(SmlCommand *cmd, SmlDevInf *devinf, SmlDevInfVersion version, SmlError **error) 
    516531{ 
     
    579594                goto error_free_cmd; 
    580595        } 
     596        smlItemSetRaw(cmd->private.access.item, TRUE); 
    581597         
    582598        smlTrace(TRACE_EXIT, "%s: %p", __func__, cmd); 
  • branches/dev-branch/libsyncml/sml_devinf.h

    r160 r169  
    8383SmlCommand *smlDevInfNewGet(SmlDevInfVersion version, SmlError **error); 
    8484 
     85void smlDevInfConfigureSession(SmlDevInf *devinf, SmlSession *session); 
     86 
    8587SmlDevInf *smlDevInfParse(const char *data, unsigned int length, SmlError **error); 
    8688SmlDevInf *smlDevInfFromResult(SmlCommand *result, SmlError **error); 
  • branches/dev-branch/libsyncml/sml_elements.c

    r166 r169  
    507507} 
    508508 
     509void smlItemSetRaw(SmlItem *item, SmlBool raw) 
     510{ 
     511        smlAssert(item); 
     512         
     513        item->raw = raw; 
     514} 
     515 
    509516void smlCredFree(SmlCred *cred) 
    510517{ 
  • branches/dev-branch/libsyncml/sml_elements.h

    r127 r169  
    5050void smlItemSetTarget(SmlItem *item, SmlLocation *target); 
    5151SmlLocation *smlItemGetTarget(SmlItem *item); 
     52void smlItemSetRaw(SmlItem *item, SmlBool raw); 
    5253 
    5354void smlHeaderFree(SmlHeader *header); 
  • branches/dev-branch/libsyncml/sml_elements_internals.h

    r166 r169  
    5050         
    5151        SmlBool disabled; 
     52        /** If set to true, libsyncml will omit the cdata tags */ 
     53        SmlBool raw; 
    5254}; 
    5355 
  • branches/dev-branch/libsyncml/sml_parse.c

    r160 r169  
    121121        smlAssert(size); 
    122122        smlAssert(parser->functions.start); 
    123          
    124         smlLog("received-%i.xml", data, size); 
    125123                 
    126124        if (parser->limit && size > parser->limit) { 
     
    399397        if (!assm->functions.run(assm->assm_userdata, data, size, end, final, smlAssemblerGetLimit(assm), error)) 
    400398                goto error; 
    401                  
    402         smlLog("sent-%i.xml", *data, *size); 
    403399         
    404400        smlTrace(TRACE_EXIT, "%s", __func__); 
  • branches/dev-branch/libsyncml/sml_parse.h

    r152 r169  
    111111void smlAssemblerSetRequestedLimit(SmlAssembler *assm, unsigned int limit); 
    112112void smlAssemblerSetLimit(SmlAssembler *assm, unsigned int limit); 
     113unsigned int smlSessionGetSendingLimit(SmlSession *session); 
    113114SmlBool smlAssemblerGetSpace(SmlAssembler *assm, int *space, SmlCommand *parent, SmlCommand *cmd, SmlError **error); 
    114115unsigned int smlAssemblerGetMaxObjSize(SmlAssembler *assm); 
  • branches/dev-branch/libsyncml/sml_session.c

    r168 r169  
    481481        switch (sesscmd->type) { 
    482482                case SML_SESSION_FLUSH: 
    483                         if (sesscmd->end) 
     483                        if (sesscmd->end) { 
    484484                                session->end = TRUE; 
     485                                smlTrace(TRACE_INTERNAL, "End on flush was set"); 
     486                        } 
    485487                        if (!_smlSessionFlushInternal(session, sesscmd->final, &error)) 
    486488                                goto error; 
     
    571573         
    572574        smlAssemblerSetRequestedLimit(session->assembler, header->maxmsgsize); 
    573         smlAssemblerSetRequestedMaxObjSize(session->assembler, header->maxobjsize); 
     575        //smlAssemblerSetRequestedMaxObjSize(session->assembler, header->maxobjsize); 
    574576         
    575577        /* Reserve the status for header reply. It will always be cmdRef 0 
     
    703705                                        goto error_free_cmd; 
    704706                                } 
     707                                 
     708                                /* If we are a server, we just mimick the behaviour of the client regarding 
     709                                 * large object handling and support of number of changes. This way we dont 
     710                                 * need to parse the devinf */ 
     711                                if (cmd->type == SML_COMMAND_TYPE_SYNC) { 
     712                                        smlTrace(TRACE_INTERNAL, "maxObjSize: %i, numbOfChanges: %i, %i", cmd->private.sync.maxObjSize, cmd->private.sync.hasNumChanged, cmd->private.sync.numChanged); 
     713                                        if (cmd->private.sync.maxObjSize != -1) 
     714                                                smlAssemblerSetRequestedMaxObjSize(session->assembler, cmd->private.sync.maxObjSize); 
     715                                 
     716                                        if (session->sessionType == SML_SESSION_TYPE_SERVER) { 
     717                                                if (cmd->private.sync.maxObjSize == -1) 
     718                                                        smlSessionUseLargeObjects(session, FALSE); 
     719                                                         
     720                                                if (cmd->private.sync.hasNumChanged == FALSE) 
     721                                                        smlSessionUseNumberOfChanges(session, FALSE); 
     722                                        } 
     723                                } 
     724                                 
    705725                                 
    706726                                session->parentCommand = cmd; 
     
    10731093        else 
    10741094                session->lastMessageID = 1; 
    1075                 
     1095         
    10761096        session->end = FALSE; 
    10771097        session->sessionType = sessionType; 
    10781098        session->lastCommandID = 0; 
    1079         session->supportsNumberOfChanges = TRUE; 
    1080         session->supportsLargeObjects = TRUE; 
    10811099         
    10821100        if (sessionType == SML_SESSION_TYPE_CLIENT) 
     
    12691287} 
    12701288 
     1289void smlSessionUseNumberOfChanges(SmlSession *session, SmlBool support) 
     1290{ 
     1291        smlTrace(TRACE_ENTRY, "%s(%p, %i)", __func__, session, support); 
     1292        smlAssert(session); 
     1293         
     1294        smlAssemblerSetOption(session->assembler, "USE_NUMBEROFCHANGES", support ? "1" : "0"); 
     1295         
     1296        smlTrace(TRACE_EXIT, "%s", __func__); 
     1297} 
     1298 
     1299void smlSessionUseLargeObjects(SmlSession *session, SmlBool support) 
     1300{ 
     1301        smlTrace(TRACE_ENTRY, "%s(%p, %i)", __func__, session, support); 
     1302        smlAssert(session); 
     1303         
     1304        smlAssemblerSetOption(session->assembler, "USE_LARGEOBJECTS", support ? "1" : "0"); 
     1305         
     1306        smlTrace(TRACE_EXIT, "%s", __func__); 
     1307} 
     1308 
    12711309void smlSessionUseOnlyReplace(SmlSession *session, SmlBool onlyReplace) 
    12721310{ 
     
    12901328} 
    12911329 
     1330unsigned int smlSessionGetSendingLimit(SmlSession *session) 
     1331{ 
     1332        smlAssert(session); 
     1333        return smlAssemblerGetLimit(session->assembler); 
     1334} 
     1335 
    12921336void smlSessionSetReceivingLimit(SmlSession *session, unsigned int limit) 
    12931337{ 
     
    13081352         
    13091353        smlTrace(TRACE_EXIT, "%s", __func__); 
     1354} 
     1355 
     1356unsigned int smlSessionGetMaxObjSize(SmlSession *session) 
     1357{ 
     1358        smlAssert(session); 
     1359        return smlAssemblerGetMaxObjSize(session->assembler); 
    13101360} 
    13111361 
  • branches/dev-branch/libsyncml/sml_session.h

    r168 r169  
    5252void smlSessionUseStringTable(SmlSession *session, SmlBool useStringtable); 
    5353void smlSessionUseOnlyReplace(SmlSession *session, SmlBool onlyReplace); 
     54void smlSessionUseNumberOfChanges(SmlSession *session, SmlBool support); 
     55void smlSessionUseLargeObjects(SmlSession *session, SmlBool support); 
    5456void smlSessionSetSendingLimit(SmlSession *session, unsigned int limit); 
    5557void smlSessionSetReceivingLimit(SmlSession *session, unsigned int limit); 
    5658void smlSessionSetSendingMaxObjSize(SmlSession *session, unsigned int limit); 
     59unsigned int smlSessionGetMaxObjSize(SmlSession *session); 
    5760void smlSessionSetReceivingMaxObjSize(SmlSession *session, unsigned int limit); 
    5861const char *smlSessionGetSessionID(SmlSession *session); 
  • branches/dev-branch/libsyncml/sml_session_internals.h

    r168 r169  
    3131        SmlAssembler *assembler; 
    3232        SmlBool onlyReplace; 
    33          
    34         SmlBool supportsNumberOfChanges; 
    35         SmlBool supportsLargeObjects; 
    3633         
    3734        SmlSessionEventCallback eventCallback; 
  • branches/dev-branch/libsyncml/sml_support.c

    r127 r169  
    7373        char *logfile = NULL; 
    7474        for (;;i = i + 1) { 
    75                 logfile = g_strdup_printf(logname, i); 
     75                char *logfile_tmp = g_strdup_printf("%s/%s", trace, logname); 
     76                logfile = g_strdup_printf(logfile_tmp, i); 
     77                g_free(logfile_tmp); 
    7678                if (!g_file_test(logfile, G_FILE_TEST_EXISTS)) 
    7779                        break; 
  • branches/dev-branch/tests/check_obex.c

    r127 r169  
    307307        smlTransportDataDeref(data); 
    308308 
     309        while (server_receives < 1) { usleep(50); }; 
     310 
    309311        fail_unless(smlTransportDisconnect(client, NULL, &error), NULL); 
    310312        fail_unless(error == NULL, NULL); 
    311313         
    312         while (client_disconnect_done < 1 && client_errors < 2) { usleep(50); }; 
     314        while (client_disconnect_done < 2 && client_errors < 1) { usleep(50); }; 
    313315         
    314316        fail_unless(client_receives == 0, NULL); 
    315317        fail_unless(server_receives == 1, NULL); 
    316318        fail_unless(client_connect_done == 2, NULL); 
    317         fail_unless(client_disconnect_done == 1, NULL); 
    318         fail_unless(client_errors == 2, NULL); 
     319        fail_unless(client_disconnect_done == 2, NULL); 
     320        fail_unless(client_errors == 1, NULL); 
    319321         
    320322        smlTransportStop(client); 
     
    566568        fail_unless(error == NULL, NULL); 
    567569         
    568         while (client_disconnect_done < 2) { usleep(50); }; 
     570        while (client_disconnect_done < 6) { usleep(50); }; 
    569571         
    570572        fail_unless(client_receives == 3, NULL); 
     
    805807        fail_unless(error == NULL, NULL); 
    806808         
    807         while (client_disconnect_done < 1 || client_errors < 2) { usleep(50); }; 
     809        while (client_disconnect_done < 1 || client_errors < 1) { usleep(50); }; 
    808810         
    809811        fail_unless(client_receives == 0, NULL); 
     
    811813        fail_unless(client_connect_done == 1, NULL); 
    812814        fail_unless(client_disconnect_done == 1, NULL); 
    813         fail_unless(client_errors == 2, NULL); 
     815        fail_unless(client_errors == 1, NULL); 
    814816         
    815817        smlTransportStop(client); 
  • branches/dev-branch/tests/check_sync.c

    r166 r169  
    2626#include <libsyncml/transports/http_client.h> 
    2727#include <libsyncml/transports/http_server.h> 
     28 
     29#include <libsyncml/objects/sml_devinf_obj.h> 
    2830 
    2931#define NUM_SESSIONS 30 
     
    224226        smlTrace(TRACE_ENTRY, "%s()", __func__); 
    225227         
     228        fail_unless(numChanges != 87, NULL); 
    226229        syncs_received++; 
    227230                 
     
    10381041END_TEST 
    10391042 
     1043/* client -- 3 * alert ---> server 
     1044 * server -- statuses, 3 * alert ---> client 
     1045 * client -- statuses, num * add, num * replace, num * delete ---> server 
     1046 * server -- statuses ---> client 
     1047 */ 
     1048START_TEST (sync_multi_conf_from_devinf) 
     1049{ 
     1050        int num_items = 1; 
     1051         
     1052        init_alerts_received = 0; 
     1053        alerts_received = 0; 
     1054        syncs_received = 0; 
     1055        sync_ends_received = 0; 
     1056        changes_received = 0; 
     1057        replies_received = 0; 
     1058        adds_received = 0; 
     1059        add_replies_received = 0; 
     1060        deletes_received = 0; 
     1061        delete_replies_received = 0; 
     1062        modifies_received = 0; 
     1063        modify_replies_received = 0; 
     1064        session_ends = 0; 
     1065         
     1066        transport_errors = 0; 
     1067        num_sessions = 0; 
     1068        num_finals = 0; 
     1069        num_end = 0; 
     1070        session_errors = 0; 
     1071 
     1072        setup_testbed(NULL); 
     1073         
     1074        SmlError *error = NULL; 
     1075        SmlTransport *server = smlTransportNew(SML_TRANSPORT_HTTP_SERVER, &error); 
     1076        SmlTransport *client = smlTransportNew(SML_TRANSPORT_HTTP_CLIENT, &error); 
     1077         
     1078        SmlTransportHttpClientConfig clientConfig; 
     1079        clientConfig.port = 12004; 
     1080        clientConfig.url = "http://127.0.0.1:12004"; 
     1081        clientConfig.proxy = NULL; 
     1082         
     1083        SmlTransportHttpServerConfig serverConfig; 
     1084        serverConfig.port = 12004; 
     1085        serverConfig.url = NULL; 
     1086        serverConfig.interface = NULL; 
     1087         
     1088        managerTracker *clienttracker = g_malloc0(sizeof(managerTracker)); 
     1089        SmlManager *clientmanager = clienttracker->manager = smlManagerNew(client, &error); 
     1090        smlManagerSetEventCallback(clienttracker->manager, _manager_event, clienttracker); 
     1091        managerTracker *servertracker = g_malloc0(sizeof(managerTracker)); 
     1092        SmlManager *servermanager = servertracker->manager = smlManagerNew(server, &error); 
     1093        smlManagerSetEventCallback(servertracker->manager, _manager_event, servertracker); 
     1094         
     1095        fail_unless(smlTransportInitialize(client, &clientConfig, &error), NULL); 
     1096        fail_unless(smlTransportInitialize(server, &serverConfig, &error), NULL); 
     1097 
     1098        fail_unless(smlManagerStart(clientmanager, &error), NULL); 
     1099        fail_unless(error == NULL, NULL); 
     1100        fail_unless(smlManagerStart(servermanager, &error), NULL); 
     1101        fail_unless(error == NULL, NULL); 
     1102 
     1103        SmlLocation *loc = smlLocationNew("test", NULL, &error); 
     1104        fail_unless(loc != NULL, NULL); 
     1105        fail_unless(error == NULL, NULL); 
     1106         
     1107        SmlLocation *loc1 = smlLocationNew("test1", NULL, &error); 
     1108        fail_unless(loc1 != NULL, NULL); 
     1109        fail_unless(error == NULL, NULL); 
     1110         
     1111        SmlLocation *loc2 = smlLocationNew("test2", NULL, &error); 
     1112        fail_unless(loc2 != NULL, NULL); 
     1113        fail_unless(error == NULL, NULL); 
     1114         
     1115        SmlLocation *loc3 = smlLocationNew("test3", NULL, &error); 
     1116        fail_unless(loc3 != NULL, NULL); 
     1117        fail_unless(error == NULL, NULL); 
     1118         
     1119        clienttracker->ds[0] = smlDsClientNew(SML_ELEMENT_TEXT_VCARD, loc1, loc1, &error); 
     1120        clienttracker->ds[1] = smlDsClientNew(SML_ELEMENT_TEXT_VCAL, loc2, loc2, &error); 
     1121        clienttracker->ds[2] = smlDsClientNew(SML_ELEMENT_TEXT_PLAIN, loc3, loc3, &error); 
     1122        smlDsServerRegister(clienttracker->ds[0], clientmanager, &error); 
     1123        smlDsServerRegister(clienttracker->ds[1], clientmanager, &error); 
     1124        smlDsServerRegister(clienttracker->ds[2], clientmanager, &error); 
     1125                                 
     1126        servertracker->ds[0] = smlDsServerNew(SML_ELEMENT_TEXT_VCARD, loc1, &error); 
     1127        servertracker->ds[1] = smlDsServerNew(SML_ELEMENT_TEXT_VCAL, loc2, &error); 
     1128        servertracker->ds[2] = smlDsServerNew(SML_ELEMENT_TEXT_PLAIN, loc3, &error); 
     1129        smlDsServerSetConnectCallback(servertracker->ds[0], _recv_init_alert, servertracker); 
     1130        smlDsServerSetConnectCallback(servertracker->ds[1], _recv_init_alert, servertracker); 
     1131        smlDsServerSetConnectCallback(servertracker->ds[2], _recv_init_alert, servertracker); 
     1132        smlDsServerRegister(servertracker->ds[0], servermanager, &error); 
     1133        smlDsServerRegister(servertracker->ds[1], servermanager, &error); 
     1134        smlDsServerRegister(servertracker->ds[2], servermanager, &error); 
     1135         
     1136        /* The devinf obj */ 
     1137        SmlDevInf *devinf = smlDevInfNew("LibSyncmML", SML_DEVINF_DEVTYPE_WORKSTATION, &error); 
     1138        smlDevInfSetSupportsNumberOfChanges(devinf, FALSE); 
     1139        smlDevInfSetSupportsLargeObjs(devinf, FALSE); 
     1140        smlDevInfSetSupportsUTC(devinf, FALSE); 
     1141        SmlDevInfAgent *clientagent = smlDevInfAgentNew(devinf, &error); 
     1142        smlDevInfAgentRegister(clientagent, clientmanager, &error); 
     1143 
     1144        /* And we also add the devinfo to the devinf agent */ 
     1145        SmlDevInfDataStore *datastore = smlDevInfDataStoreNew(smlLocationGetURI(loc1), &error); 
     1146        smlDevInfDataStoreSetRxPref(datastore, SML_ELEMENT_TEXT_VCARD, "2.1"); 
     1147        smlDevInfDataStoreSetTxPref(datastore, SML_ELEMENT_TEXT_VCARD, "2.1"); 
     1148        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); 
     1149        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); 
     1150        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); 
     1151        smlDevInfAddDataStore(devinf, datastore); 
     1152         
     1153        datastore = smlDevInfDataStoreNew(smlLocationGetURI(loc2), &error); 
     1154        smlDevInfDataStoreSetRxPref(datastore, SML_ELEMENT_TEXT_VCAL, "2.0"); 
     1155        smlDevInfDataStoreSetTxPref(datastore, SML_ELEMENT_TEXT_VCAL, "2.0"); 
     1156        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); 
     1157        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); 
     1158        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); 
     1159        smlDevInfAddDataStore(devinf, datastore); 
     1160         
     1161        datastore = smlDevInfDataStoreNew(smlLocationGetURI(loc3), &error); 
     1162        smlDevInfDataStoreSetRxPref(datastore, SML_ELEMENT_TEXT_PLAIN, "1.0"); 
     1163        smlDevInfDataStoreSetTxPref(datastore, SML_ELEMENT_TEXT_PLAIN, "1.0"); 
     1164        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); 
     1165        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); 
     1166        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); 
     1167        smlDevInfAddDataStore(devinf, datastore); 
     1168         
     1169        devinf = smlDevInfNew("LibSyncmML", SML_DEVINF_DEVTYPE_SERVER, &error); 
     1170        smlDevInfSetSupportsNumberOfChanges(devinf, FALSE); 
     1171        smlDevInfSetSupportsLargeObjs(devinf, FALSE); 
     1172        smlDevInfSetSupportsUTC(devinf, FALSE); 
     1173        SmlDevInfAgent *serveragent = smlDevInfAgentNew(devinf, &error); 
     1174        smlDevInfAgentRegister(serveragent, servermanager, &error); 
     1175         
     1176        datastore = smlDevInfDataStoreNew(smlLocationGetURI(loc1), &error); 
     1177        smlDevInfDataStoreSetRxPref(datastore, SML_ELEMENT_TEXT_VCARD, "2.1"); 
     1178        smlDevInfDataStoreSetTxPref(datastore, SML_ELEMENT_TEXT_VCARD, "2.1"); 
     1179        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); 
     1180        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); 
     1181        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); 
     1182        smlDevInfAddDataStore(devinf, datastore); 
     1183         
     1184        datastore = smlDevInfDataStoreNew(smlLocationGetURI(loc2), &error); 
     1185        smlDevInfDataStoreSetRxPref(datastore, SML_ELEMENT_TEXT_VCAL, "2.0"); 
     1186        smlDevInfDataStoreSetTxPref(datastore, SML_ELEMENT_TEXT_VCAL, "2.0"); 
     1187        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); 
     1188        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); 
     1189        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); 
     1190        smlDevInfAddDataStore(devinf, datastore); 
     1191         
     1192        datastore = smlDevInfDataStoreNew(smlLocationGetURI(loc3), &error); 
     1193        smlDevInfDataStoreSetRxPref(datastore, SML_ELEMENT_TEXT_PLAIN, "1.0"); 
     1194        smlDevInfDataStoreSetTxPref(datastore, SML_ELEMENT_TEXT_PLAIN, "1.0"); 
     1195        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); 
     1196        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); 
     1197        smlDevInfDataStoreSetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); 
     1198        smlDevInfAddDataStore(devinf, datastore); 
     1199         
     1200        smlLocationUnref(loc1); 
     1201        smlLocationUnref(loc2); 
     1202        smlLocationUnref(loc3); 
     1203         
     1204        /* The authenticator */ 
     1205        SmlAuthenticator *auth = smlAuthNew(&error); 
     1206        smlAuthSetEnable(auth, FALSE); 
     1207        smlAuthRegister(auth, clientmanager, &error); 
     1208         
     1209        /* The authenticator */ 
     1210        SmlAuthenticator *auth2 = smlAuthNew(&error); 
     1211        smlAuthSetEnable(auth2, FALSE); 
     1212        smlAuthRegister(auth2, servermanager, &error); 
     1213         
     1214        clienttracker->session = smlSessionNew(SML_SESSION_TYPE_CLIENT, SML_MIMETYPE_XML, SML_VERSION_12, SML_PROTOCOL_SYNCML, loc, loc, NULL, 0, &error); 
     1215        smlSessionSetReceivingLimit(clienttracker->session, 76400); 
     1216        smlSessionSetReceivingMaxObjSize(clienttracker->session, 76500); 
     1217         
     1218        smlDevInfConfigureSession(devinf, clienttracker->session); 
     1219         
     1220        fail_unless(smlManagerSessionAdd(clientmanager, clienttracker->session, NULL, &error), NULL); 
     1221        fail_unless(error == NULL, NULL); 
     1222         
     1223        smlLocationUnref(loc); 
     1224         
     1225        clienttracker->dssessions[0] = smlDsServerSendAlert(clienttracker->ds[0], clienttracker->session, SML_ALERT_TWO_WAY, "last", "next", _alert_reply, GINT_TO_POINTER(1), &error); 
     1226        clienttracker->dssessions[1] = smlDsServerSendAlert(clienttracker->ds[1], clienttracker->session, SML_ALERT_TWO_WAY, "last", "next", _alert_reply, GINT_TO_POINTER(1), &error); 
     1227        clienttracker->dssessions[2] = smlDsServerSendAlert(clienttracker->ds[2], clienttracker->session, SML_ALERT_TWO_WAY, "last", "next", _alert_reply, GINT_TO_POINTER(1), &error); 
     1228         
     1229        fail_unless(smlDevInfAgentSendDevInf(clientagent, clienttracker->session, &error), NULL); 
     1230        fail_unless(error == NULL, NULL); 
     1231         
     1232        fail_unless(smlSessionFlush(clienttracker->session, TRUE, &error), NULL); 
     1233        fail_unless(error == NULL, NULL); 
     1234         
     1235        while (init_alerts_received != 3 || num_sessions != 2) { 
     1236                smlManagerDispatch(servermanager); 
     1237                smlManagerDispatch(clientmanager); 
     1238                usleep(100); 
     1239        } 
     1240         
     1241        fail_unless(smlSessionGetSendingLimit(servertracker->session) == 76400, NULL); 
     1242        fail_unless(smlSessionGetMaxObjSize(servertracker->session) != 76500, NULL); 
     1243        smlSessionSetReceivingLimit(servertracker->session, 76400); 
     1244        smlSessionSetReceivingMaxObjSize(servertracker->session, 76500); 
     1245         
     1246        smlDsSessionGetAlert(servertracker->dssessions[0], _recv_alert, GINT_TO_POINTER(1)); 
     1247        smlDsSessionGetAlert(servertracker->dssessions[1], _recv_alert, GINT_TO_POINTER(1)); 
     1248        smlDsSessionGetAlert(servertracker->dssessions[2], _recv_alert, GINT_TO_POINTER(1)); 
     1249         
     1250        SmlDevInf *recvClientDevInf = smlDevInfAgentGetDevInf(serveragent); 
     1251        fail_unless(smlDevInfNumDataStores(recvClientDevInf) == 3, NULL); 
     1252        fail_unless(smlDevInfSupportsNumberOfChanges(recvClientDevInf) == FALSE, NULL); 
     1253        fail_unless(smlDevInfSupportsLargeObjs(recvClientDevInf) == FALSE, NULL); 
     1254        fail_unless(smlDevInfSupportsUTC(recvClientDevInf) == FALSE, NULL); 
     1255         
     1256        fail_unless(smlDevInfAgentSendDevInf(serveragent, servertracker->session, &error), NULL); 
     1257        fail_unless(error == NULL, NULL); 
     1258         
     1259        smlDsSessionSendAlert(servertracker->dssessions[0], SML_ALERT_TWO_WAY, "last", "next", _alert_reply, GINT_TO_POINTER(1), &error); 
     1260        smlDsSessionSendAlert(servertracker->dssessions[1], SML_ALERT_TWO_WAY, "last", "next", _alert_reply, GINT_TO_POINTER(1), &error); 
     1261        smlDsSessionSendAlert(servertracker->dssessions[2], SML_ALERT_TWO_WAY, "last", "next", _alert_reply, GINT_TO_POINTER(1), &error); 
     1262         
     1263        fail_unless(servertracker->session != NULL, NULL); 
     1264        fail_unless(smlSessionFlush(servertracker->session, TRUE, &error), NULL); 
     1265         
     1266        smlDsSessionGetAlert(clienttracker->dssessions[0], _recv_alert, GINT_TO_POINTER(1)); 
     1267        smlDsSessionGetAlert(clienttracker->dssessions[1], _recv_alert, GINT_TO_POINTER(1)); 
     1268        smlDsSessionGetAlert(clienttracker->dssessions[2], _recv_alert, GINT_TO_POINTER(1)); 
     1269         
     1270        while (alerts_received != 6) { 
     1271                smlDsSessionDispatch(servertracker->dssessions[0]); 
     1272                smlDsSessionDispatch(servertracker->dssessions[1]); 
     1273                smlDsSessionDispatch(servertracker->dssessions[2]); 
     1274                 
     1275                smlDsSessionDispatch(clienttracker->dssessions[0]); 
     1276                smlDsSessionDispatch(clienttracker->dssessions[1]); 
     1277                smlDsSessionDispatch(clienttracker->dssessions[2]); 
     1278                 
     1279                smlManagerDispatch(servermanager); 
     1280                smlManagerDispatch(clientmanager); 
     1281                usleep(100); 
     1282        } 
     1283         
     1284        fail_unless(smlSessionGetSendingLimit(clienttracker->session) == 76400, NULL); 
     1285        fail_unless(smlSessionGetMaxObjSize(clienttracker->session) == 0, NULL); 
     1286         
     1287        SmlDevInf *recvServerDevInf = smlDevInfAgentGetDevInf(clientagent); 
     1288        fail_unless(smlDevInfNumDataStores(recvServerDevInf) == 3, NULL); 
     1289        fail_unless(smlDevInfSupportsNumberOfChanges(recvServerDevInf) == FALSE, NULL); 
     1290        fail_unless(smlDevInfSupportsLargeObjs(recvServerDevInf) == FALSE, NULL); 
     1291        fail_unless(smlDevInfSupportsUTC(recvServerDevInf) == FALSE, NULL); 
     1292         
     1293        smlDsSessionSendSync(clienttracker->dssessions[0], 87, _sync_reply, GINT_TO_POINTER(1), &error); 
     1294        smlDsSessionSendSync(clienttracker->dssessions[1], 87, _sync_reply, GINT_TO_POINTER(1), &error); 
     1295        smlDsSessionSendSync(clienttracker->dssessions[2], 87, _sync_reply, GINT_TO_POINTER(1), &error); 
     1296         
     1297        int i = 0; 
     1298        for (i = 0; i < num_items; i++) { 
     1299                fail_unless(smlDsSessionQueueChange(clienttracker->dssessions[0], SML_CHANGE_ADD, "uid", "data", 4, SML_ELEMENT_TEXT_VCARD, _add_reply, GINT_TO_POINTER(2), &error), NULL); 
     1300                fail_unless(error == NULL, NULL); 
     1301                fail_unless(smlDsSessionQueueChange(clienttracker->dssessions[0], SML_CHANGE_REPLACE, "uid", "newdata", 7, SML_ELEMENT_TEXT_VCARD, _modify_reply, GINT_TO_POINTER(1), &error), NULL); 
     1302                fail_unless(error == NULL, NULL); 
     1303                fail_unless(smlDsSessionQueueChange(clienttracker->dssessions[0], SML_CHANGE_DELETE, "uid", NULL, 0, SML_ELEMENT_TEXT_VCARD, _delete_reply, GINT_TO_POINTER(1), &error), NULL); 
     1304                fail_unless(error == NULL, NULL); 
     1305                fail_unless(smlDsSessionQueueChange(clienttracker->dssessions[1], SML_CHANGE_ADD, "uid", "data", 4, SML_ELEMENT_TEXT_VCAL, _add_reply, GINT_TO_POINTER(2), &error), NULL); 
     1306                fail_unless(error == NULL, NULL); 
     1307                fail_unless(smlDsSessionQueueChange(clienttracker->dssessions[1], SML_CHANGE_REPLACE, "uid", "newdata", 7, SML_ELEMENT_TEXT_VCAL, _modify_reply, GINT_TO_POINTER(1), &error), NULL); 
     1308                fail_unless(error == NULL, NULL); 
     1309                fail_unless(smlDsSessionQueueChange(clienttracker->dssessions[1], SML_CHANGE_DELETE, "uid", NULL, 0, SML_ELEMENT_TEXT_VCAL, _delete_reply, GINT_TO_POINTER(1), &error), NULL); 
     1310