Changeset 488

Show
Ignore:
Timestamp:
07/11/08 17:32:06 (4 months ago)
Author:
bellmich
Message:

- enforce error handling in DevInf? code more agressively
- enforce notification handling by manager if a normal SyncML

message is used for notification

- removed unnecessary MaxSize? functions from notification code

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libsyncml/parser/sml_xml_parse.c

    r481 r488  
    24012401                /* determine list item type */ 
    24022402                SmlDevInfCTCapType type; 
    2403                 type = smlDevInfCTCapTypeFromString(elem_name, NULL); 
     2403                type = smlDevInfCTCapTypeFromString(elem_name, error); 
    24042404                value = NULL; 
    24052405                if (type != SML_DEVINF_CTCAP_UNKNOWN) 
     
    25762576                /* determine item type */ 
    25772577                SmlDevInfCTCapType type; 
    2578                 type = smlDevInfCTCapTypeFromString(elem_name, NULL); 
     2578                type = smlDevInfCTCapTypeFromString(elem_name, error); 
    25792579                value = NULL; 
    25802580                if (type != SML_DEVINF_CTCAP_UNKNOWN) 
     
    26572657                /* determine item type */ 
    26582658                SmlDevInfCTCapType type; 
    2659                 type = smlDevInfCTCapTypeFromString(elem_name, NULL); 
     2659                type = smlDevInfCTCapTypeFromString(elem_name, error); 
    26602660                value = NULL; 
    26612661                if (type != SML_DEVINF_CTCAP_UNKNOWN && 
     
    27612761                /* determine item type */ 
    27622762                SmlDevInfCTCapType type; 
    2763                 type = smlDevInfCTCapTypeFromString(elem_name, NULL); 
     2763                type = smlDevInfCTCapTypeFromString(elem_name, error); 
    27642764                value = NULL; 
    27652765                if (type != SML_DEVINF_CTCAP_UNKNOWN && 
  • trunk/libsyncml/sml_devinf.c

    r427 r488  
    4949SmlDevInfDevTyp smlDevInfDevTypeFromString(const char *name, SmlError **error) 
    5050{ 
     51        smlAssert(error); 
     52        smlAssert(*error == NULL); 
     53 
    5154        if (!strcmp(name, SML_ELEMENT_DEVTYP_PAGER)) { 
    5255                return SML_DEVINF_DEVTYPE_PAGER; 
     
    7174const char *smlDevInfDevTypeToString(SmlDevInfDevTyp type, SmlError **error) 
    7275{ 
     76        smlAssert(error); 
     77        smlAssert(*error == NULL); 
     78 
    7379        switch (type) { 
    7480                case SML_DEVINF_DEVTYPE_PAGER: 
     
    97103{ 
    98104        smlAssert(devid); 
     105        smlAssert(error); 
     106        smlAssert(*error == NULL); 
    99107        smlTrace(TRACE_ENTRY, "%s(%s, %i, %p)", __func__, devid, devtyp, error); 
    100108         
     
    365373SmlDevInfDataStore *smlDevInfDataStoreNew(const char *sourceRef, SmlError **error) 
    366374{ 
     375        smlAssert(error); 
     376        smlAssert(*error == NULL); 
    367377        smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, sourceRef, error); 
    368378         
     
    651661        smlTrace(TRACE_ENTRY, "%s(%p, %i, %p, %p)", __func__, cmd, devinf, version, error); 
    652662        smlAssert(cmd); 
     663        smlAssert(error); 
     664        smlAssert(*error == NULL); 
    653665        SmlLocation *source = NULL; 
    654666 
     
    692704        smlTrace(TRACE_ENTRY, "%s(%p, %i, %p)", __func__, devinf, version, error); 
    693705        smlAssert(devinf); 
     706        smlAssert(error); 
     707        smlAssert(*error == NULL); 
    694708        SmlLocation *source = NULL; 
    695709 
     
    740754{ 
    741755        smlTrace(TRACE_ENTRY, "%s(%i, %p)", __func__, version, error); 
     756        smlAssert(error); 
     757        smlAssert(*error == NULL); 
    742758        SmlLocation *target = NULL; 
    743759         
     
    773789        smlAssert(data); 
    774790        smlAssert(length); 
     791        smlAssert(error); 
     792        smlAssert(*error == NULL); 
    775793         
    776794        SmlDevInf *devinf = smlXmlDevInfParse(data, length, error); 
     
    790808        smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, result, error); 
    791809        smlAssert(result); 
     810        smlAssert(error); 
     811        smlAssert(*error == NULL); 
    792812         
    793813        if (result->type != SML_COMMAND_TYPE_RESULTS) { 
     
    821841SmlDevInfCTCapType smlDevInfCTCapTypeFromString(const char *name, SmlError **error) 
    822842{ 
     843        smlAssert(error); 
     844        smlAssert(*error == NULL); 
     845 
    823846        if (!strcmp(name, SML_ELEMENT_CTTYPE)) { 
    824847                return SML_DEVINF_CTCAP_CTTYPE; 
     
    854877const char *smlDevInfCTCapTypeToString(SmlDevInfCTCapType type, SmlError **error) 
    855878{ 
     879        smlAssert(error); 
     880        smlAssert(*error == NULL); 
     881 
    856882        switch (type) { 
    857883                case SML_DEVINF_CTCAP_CTTYPE: 
     
    894920{ 
    895921    smlTrace(TRACE_ENTRY, "%s(%p)", __func__, error); 
     922    smlAssert(error); 
     923    smlAssert(*error == NULL); 
    896924 
    897925    SmlDevInfPropParam *param = smlTryMalloc0(sizeof(SmlDevInfPropParam), error); 
     
    10181046{ 
    10191047    smlTrace(TRACE_ENTRY, "%s(%p)", __func__, error); 
     1048    smlAssert(error); 
     1049    smlAssert(*error == NULL); 
    10201050 
    10211051    SmlDevInfProperty *property = smlTryMalloc0(sizeof(SmlDevInfProperty), error); 
     
    12511281{ 
    12521282    smlTrace(TRACE_ENTRY, "%s(%p)", __func__, error); 
     1283    smlAssert(error); 
     1284    smlAssert(*error == NULL); 
    12531285 
    12541286    SmlDevInfContentType *ct = smlTryMalloc0(sizeof(SmlDevInfContentType), error); 
     
    12981330{ 
    12991331    smlTrace(TRACE_ENTRY, "%s(%p)", __func__, error); 
     1332    smlAssert(error); 
     1333    smlAssert(*error == NULL); 
    13001334 
    13011335    SmlDevInfCTCap *ctcap = smlTryMalloc0(sizeof(SmlDevInfCTCap), error); 
     
    14011435        const SmlDevInfCTCap *ctcap = smlDevInfGetNthCTCap(devinf, nth); 
    14021436        char *type = smlDevInfCTCapGetCTType(ctcap); 
    1403         SmlDevInfCTCapType cttype = smlDevInfCTCapTypeFromString(type, NULL); 
     1437        SmlError *error = NULL; 
     1438        SmlDevInfCTCapType cttype = smlDevInfCTCapTypeFromString(type, &error); 
    14041439        smlSafeCFree(&type); 
    14051440        return cttype; 
  • trunk/libsyncml/sml_manager.c

    r486 r488  
    235235                                if (!(session = smlSessionNew(SML_SESSION_TYPE_SERVER, data->type, header->version, header->protocol, header->source, header->target, header->sessionID, 1, &locerror))) 
    236236                                        goto error_free_header; 
    237                                 if (manager->localMaxMsgSize) 
    238                                         smlSessionSetLocalMaxMsgSize(session, manager->localMaxMsgSize); 
    239                                 if (manager->localMaxObjSize) 
    240                                         smlSessionSetLocalMaxObjSize(session, manager->localMaxObjSize); 
    241                                  
    242237                                if (!smlManagerSessionAdd(manager, session, link, &locerror)) 
    243238                                        goto error_free_header; 
     239                                smlSessionUnref(session); 
    244240                        } 
    245241 
     
    634630        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, manager, session, link, error); 
    635631         
     632        smlSessionRef(session); 
     633 
    636634        if (smlSessionGetSessionID(session)) { 
    637635                //Check if sessionID exists 
     
    646644                        manager->lastSessionID = atoi(smlSessionGetSessionID(session)); 
    647645        } else { 
     646                /* FIXME: This is critical because the session ID is predictable. */ 
     647                g_warning("%s: Using predictable session numbering.", __func__); 
    648648                manager->lastSessionID++; 
    649649                char *lastid = g_strdup_printf("%i", manager->lastSessionID); 
     
    667667         
    668668        manager->sessions = g_list_append(manager->sessions, sess); 
    669          
     669 
     670        /* prepare large object support */ 
     671        if (0 < manager->localMaxMsgSize && 
     672            ( 
     673             manager->localMaxMsgSize < smlSessionGetLocalMaxMsgSize(session) || 
     674             smlSessionGetLocalMaxMsgSize(session) <= 0 
     675            )) 
     676                smlSessionSetLocalMaxMsgSize(session, manager->localMaxMsgSize); 
     677        if (0 < manager->localMaxObjSize && 
     678            ( 
     679             manager->localMaxObjSize < smlSessionGetLocalMaxObjSize(session) || 
     680             smlSessionGetLocalMaxObjSize(session) <= 0 
     681            )) 
     682                smlSessionSetLocalMaxObjSize(session, manager->localMaxObjSize); 
     683        if (smlSessionGetLocalMaxObjSize(session) && 
     684            smlSessionGetLocalMaxMsgSize(session)) 
     685                smlSessionUseLargeObjects(session, TRUE); 
     686        else 
     687                smlSessionUseLargeObjects(session, FALSE); 
     688 
    670689        smlSessionSetEventCallback(session, _event_callback, manager); 
    671690        smlSessionSetDataCallback(session, _data_send_callback, sess); 
     
    677696                 
    678697error: 
     698        smlSessionUnref(session); 
    679699        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
    680700        return FALSE; 
  • trunk/libsyncml/sml_notification.c

    r486 r488  
    2525#include "sml_transport_internals.h" 
    2626#include "sml_command_internals.h" 
     27#include "sml_manager_internals.h" 
    2728 
    2829/** 
     
    9596        // FIXME: this is a hack because the original implementation 
    9697        // FIXME: only support server 
     98        // Only one question which client sends a notification!? 
    9799        san->sessionType = SML_SESSION_TYPE_CLIENT; 
    98100        smlCredRef(cred); 
     
    317319        smlAssert(data); 
    318320        smlAssert(size); 
     321 
     322        /* If a notification is sent via a normal SyncML message 
     323         * then the used session must be managed to guarantee the 
     324         * consistency of the session. 
     325         */ 
     326        smlAssert(san->manager); 
     327 
    319328        SmlSanAlert *alert = NULL; 
    320329        SmlCommand *cmd = NULL; 
     
    328337                goto error_free_assm; 
    329338 
    330         SmlSession *session = smlSessionNew(san->sessionType, san->type, version, SML_PROTOCOL_SYNCML, san->target, source, "1", 0, error); 
     339        guint64 sessionID = (((guint64) g_random_int ()) << 32) + g_random_int (); 
     340        char *sessionString = g_strdup_printf("%lu", sessionID); 
     341        SmlSession *session = smlSessionNew(san->sessionType, san->type, version, SML_PROTOCOL_SYNCML, san->target, source, sessionString, 0, error); 
    331342        if (!session) { 
    332343                smlLocationUnref(source); 
    333344                goto error_free_assm; 
    334345        } 
    335         smlSessionSetLocalMaxMsgSize(session, san->localMaxMsgSize); 
    336         smlSessionSetLocalMaxObjSize(session, san->localMaxObjSize); 
     346        smlManagerSessionAdd(san->manager, session, NULL, error); 
     347        if (san->manager->localMaxMsgSize) 
     348                smlSessionSetLocalMaxMsgSize(session, san->manager->localMaxMsgSize); 
     349        if (san->manager->localMaxObjSize) 
     350                smlSessionSetLocalMaxObjSize(session, san->manager->localMaxObjSize); 
    337351        if (san->cred) 
    338352                smlSessionRegisterCred(session, san->cred); 
    339         if (san->manager) 
    340                 smlManagerSessionAdd(san->manager, session, NULL, error); 
    341353 
    342354        if (!smlAssemblerStart(assm, session, error)) 
     
    618630} 
    619631 
    620 void smlNotificationSetLocalMaxMsgSize(SmlNotification *san, unsigned int size) 
    621 { 
    622         smlAssert(san); 
    623         san->localMaxMsgSize = size; 
    624 } 
    625  
    626 void smlNotificationSetLocalMaxObjSize(SmlNotification *san, unsigned int size) 
    627 { 
    628         smlAssert(san); 
    629         san->localMaxObjSize = size; 
    630 } 
    631  
    632632/*@}*/ 
  • trunk/libsyncml/sml_notification.h

    r486 r488  
    6464const char *smlSanAlertGetServerURI(SmlSanAlert *alert); 
    6565 
    66 void smlNotificationSetLocalMaxMsgSize(SmlNotification *san, unsigned int size); 
    67 void smlNotificationSetLocalMaxObjSize(SmlNotification *san, unsigned int size); 
    68  
    6966#endif //_SML_NOTIFICATION_H_ 
  • trunk/tests/check_san.c

    r486 r488  
    2121#include "support.h" 
    2222 
     23/* If the notification is a normal SyncML message then a manager is 
     24 * required. The easiest way are two function which create and destroy 
     25 * a default manager - only for testing. 
     26 */ 
     27 
     28SmlTransport *_tsp = NULL; 
     29 
     30SmlManager* _start_manager() 
     31{ 
     32        unsigned int defaultMaxMsgSize = 10240; 
     33        unsigned int defaultMaxObjSize = 1024000; 
     34 
     35        SmlError *error = NULL; 
     36        _tsp = smlTransportNew(SML_TRANSPORT_HTTP_SERVER, &error); 
     37        fail_unless(_tsp != NULL, smlErrorPrint(&error)); 
     38        fail_unless(error == NULL, smlErrorPrint(&error)); 
     39         
     40        SmlManager *manager = smlManagerNew(_tsp, &error); 
     41        fail_unless(manager != NULL, smlErrorPrint(&error)); 
     42        fail_unless(error == NULL, smlErrorPrint(&error)); 
     43 
     44        smlManagerSetLocalMaxMsgSize(manager, defaultMaxMsgSize); 
     45        smlManagerSetLocalMaxObjSize(manager, defaultMaxObjSize); 
     46 
     47        return manager; 
     48} 
     49 
     50void *_stop_manager(SmlManager *manager) 
     51{ 
     52        smlManagerFree(manager); 
     53        smlTransportFree(_tsp); 
     54} 
     55 
    2356START_TEST (check_san_new) 
    2457{ 
     
    176209        fail_unless(san != NULL, NULL); 
    177210        fail_unless(error == NULL, NULL); 
     211        SmlManager *manager = _start_manager(); 
     212        smlNotificationSetManager(san, manager); 
    178213         
    179214        fail_unless(smlNotificationNewAlert(san, SML_ALERT_TWO_WAY_BY_SERVER, SML_ELEMENT_TEXT_VCARD, "tttt", &error), NULL); 
    180215        fail_unless(error == NULL, NULL); 
    181         smlNotificationSetLocalMaxMsgSize(san, 1024); 
    182         smlNotificationSetLocalMaxObjSize(san, 102400); 
    183216         
    184217        char *buffer = NULL; 
     
    187220        fail_unless(error == NULL, NULL); 
    188221        smlNotificationFree(san); 
     222 
     223        _stop_manager(manager); 
    189224 
    190225        /* SyncML 1.1 SAN parsing is not supported today. */ 
  • trunk/tests/check_session.c

    r486 r488  
    252252        smlTrace(TRACE_EXIT, "%s", __func__); 
    253253} 
     254 
     255/* If the notification is a normal SyncML message then a manager is 
     256 * required. The easiest way are two function which create and destroy 
     257 * a default manager - only for testing. 
     258 */ 
     259 
     260SmlTransport *_tsp = NULL; 
     261 
     262SmlManager* _start_manager() 
     263{ 
     264        unsigned int defaultMaxMsgSize = 10240; 
     265        unsigned int defaultMaxObjSize = 1024000; 
     266 
     267        SmlError *error = NULL; 
     268        _tsp = smlTransportNew(SML_TRANSPORT_HTTP_SERVER, &error); 
     269        fail_unless(_tsp != NULL, smlErrorPrint(&error)); 
     270        fail_unless(error == NULL, smlErrorPrint(&error)); 
     271         
     272        SmlManager *manager = smlManagerNew(_tsp, &error); 
     273        fail_unless(manager != NULL, smlErrorPrint(&error)); 
     274        fail_unless(error == NULL, smlErrorPrint(&error)); 
     275 
     276        smlManagerSetLocalMaxMsgSize(manager, defaultMaxMsgSize); 
     277        smlManagerSetLocalMaxObjSize(manager, defaultMaxObjSize); 
     278 
     279        return manager; 
     280} 
     281 
     282void *_stop_manager(SmlManager *manager) 
     283{ 
     284        smlManagerFree(manager); 
     285        smlTransportFree(_tsp); 
     286} 
     287 
    254288 
    255289START_TEST (check_session_new) 
     
    25082542         
    25092543        SmlNotification *san = smlNotificationNew(SML_SAN_VERSION_11, SML_SAN_UIMODE_USER, SML_SAN_INITIATOR_SERVER, 65535, "test", "/", SML_MIMETYPE_XML, &error); 
    2510         fail_unless(san != NULL, NULL); 
    2511         fail_unless(error == NULL, NULL); 
    2512         smlNotificationSetLocalMaxMsgSize(san, defaultMaxMsgSize); 
    2513         smlNotificationSetLocalMaxObjSize(san, defaultMaxObjSize); 
     2544        fail_unless(san != NULL, smlErrorPrint(&error)); 
     2545        fail_unless(error == NULL, smlErrorPrint(&error)); 
     2546        SmlManager *manager = _start_manager(); 
     2547        smlNotificationSetManager(san, manager); 
    25142548         
    25152549        fail_unless(smlNotificationNewAlert(san, SML_ALERT_TWO_WAY_BY_SERVER, SML_ELEMENT_TEXT_VCARD, "tttt", &error), NULL); 
     
    25952629        smlSessionUnref(session2); 
    25962630        smlSessionUnref(session); 
     2631 
     2632        _stop_manager(manager); 
    25972633} 
    25982634END_TEST 
  • trunk/tools/syncml-obex-client.c

    r486 r488  
    625625                goto error; 
    626626        smlManagerSetEventCallback(manager, _manager_event, NULL); 
     627        if (useLargeObjs) 
     628        { 
     629                /* This is a server which supports SyncML 1.1 or higher. 
     630                 * So large objects must be supported. 
     631                 */ 
     632                smlManagerSetLocalMaxMsgSize(manager, recvLimit); 
     633                smlManagerSetLocalMaxObjSize(manager, maxObjSize); 
     634        } 
    627635         
    628636        /* The authenticator */ 
     
    660668        if (!san) 
    661669                goto error; 
     670        smlNotificationSetManager(san, manager); 
    662671                 
    663672        for (i = 1; i < argc; i++) { 
     
    756765                goto error; 
    757766 
    758         /* Send notification */ 
    759         if (useLargeObjs) 
    760         { 
    761                 /* This is a server which uses SyncML 1.1 or higher. 
    762                  * So large objects must be supported. 
    763                  */ 
    764                 smlNotificationSetLocalMaxMsgSize(san, recvLimit); 
    765                 smlNotificationSetLocalMaxObjSize(san, maxObjSize); 
    766         } 
    767767        if (!smlNotificationSend(san, client, &error)) 
    768768                goto error;