Changeset 258

Show
Ignore:
Timestamp:
10/27/07 22:14:12 (1 year ago)
Author:
dgollub
Message:

Finally merged patch to support parsing/assembling SyncML 1.2 DevInf?.

Patch based on Patches from pieterpalmers and Marc Nieper-Wisskirchen.
Thanks a lot!

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libsyncml/objects/sml_devinf_obj.c

    r245 r258  
    9898                        if (smlSessionGetVersion(session) == SML_VERSION_10) 
    9999                                result = smlDevInfNewResult(get, agent->devinf, SML_DEVINF_VERSION_10, error); 
     100                        else if (smlSessionGetVersion(session) == SML_VERSION_12) 
     101                                result = smlDevInfNewResult(get, agent->devinf, SML_DEVINF_VERSION_12, error); 
    100102                        else 
    101103                                result = smlDevInfNewResult(get, agent->devinf, SML_DEVINF_VERSION_11, error); 
     
    124126                        if (smlSessionGetVersion(session) == SML_VERSION_10) 
    125127                                cmd = smlDevInfNewPut(agent->devinf, SML_DEVINF_VERSION_10, error); 
     128                        else if (smlSessionGetVersion(session) == SML_VERSION_12) 
     129                                cmd = smlDevInfNewPut(agent->devinf, SML_DEVINF_VERSION_12, error); 
    126130                        else 
    127131                                cmd = smlDevInfNewPut(agent->devinf, SML_DEVINF_VERSION_11, error); 
     
    282286        if (smlSessionGetVersion(session) == SML_VERSION_10) 
    283287                get = smlDevInfNewGet(SML_DEVINF_VERSION_10, error); 
     288        else if (smlSessionGetVersion(session) == SML_VERSION_12) 
     289                get = smlDevInfNewGet(SML_DEVINF_VERSION_12, error); 
    284290        else 
    285291                get = smlDevInfNewGet(SML_DEVINF_VERSION_11, error); 
     
    309315        smlAssert(manager); 
    310316 
     317        SmlLocation *devinf12 = smlLocationNew("./devinf12", NULL, error); 
    311318        SmlLocation *devinf11 = smlLocationNew("./devinf11", NULL, error); 
    312319        SmlLocation *devinf10 = smlLocationNew("./devinf10", NULL, error); 
    313320 
    314         if (!devinf11 || !devinf10) 
     321        if (!devinf12 || !devinf11 || !devinf10) 
    315322                goto error; 
    316323 
     
    319326        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, session, NULL, devinf11, NULL, _recv_devinf, NULL, agent, error)) 
    320327                goto error_free_loc; 
     328        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, session, NULL, devinf12, NULL, _recv_devinf, NULL, agent, error)) 
     329                goto error_free_loc; 
    321330 
    322331        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, session, devinf10, NULL, NULL, _request_devinf, NULL, agent, error)) 
    323332                goto error_free_loc; 
    324333        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, session, devinf11, NULL, NULL, _request_devinf, NULL, agent, error)) 
     334                goto error_free_loc; 
     335        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, session, devinf12, NULL, NULL, _request_devinf, NULL, agent, error)) 
    325336                goto error_free_loc; 
    326337 
    327338        smlLocationUnref(devinf10); 
    328339        smlLocationUnref(devinf11); 
     340        smlLocationUnref(devinf12); 
    329341 
    330342        smlTrace(TRACE_EXIT, "%s", __func__); 
     
    336348        if (devinf11) 
    337349                smlLocationUnref(devinf11); 
     350        if (devinf12) 
     351                smlLocationUnref(devinf11); 
    338352error: 
    339353        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
  • trunk/libsyncml/parser/sml_xml_assm.c

    r254 r258  
    18731873        //Verdtd 
    18741874        switch (version) { 
     1875                case SML_DEVINF_VERSION_12: 
     1876                        if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_VERDTD, "1.2", error)) 
     1877                                goto error_free_writer; 
     1878                        break; 
    18751879                case SML_DEVINF_VERSION_11: 
    18761880                        if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_VERDTD, "1.1", error)) 
  • trunk/libsyncml/parser/sml_xml_parse.c

    r247 r258  
    193193                goto error_free_buffer; 
    194194        } 
     195 
     196        /* SyncML 1.2 allows empty data elements <Data /> */ 
     197        if (xmlTextReaderIsEmptyElement(parser->reader)) 
     198                goto out; 
    195199                 
    196200        while (1) { 
     
    21062110} 
    21072111 
     2112static SmlBool _smlXmlDevInfDataStoreParseCTCap(SmlXmlParser *parser, SmlDevInf *devinf, SmlError **error) 
     2113{ 
     2114        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, parser, devinf, error); 
     2115        smlAssert(parser); 
     2116        smlAssert(devinf); 
     2117         
     2118        if (!_smlXmlParserStep(parser)) { 
     2119                smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); 
     2120                goto error; 
     2121        } 
     2122         
     2123        while (1) { 
     2124                /* Contrary to previous versions, SyncML 1.2 encloses properties in <PropName>-tags and parameters 
     2125                   and parameters in <ParamName>-tags, so we will ignore these tags */ 
     2126 
     2127                const char *elem_name; 
     2128                elem_name = (const char*)xmlTextReaderConstName(parser->reader); 
     2129 
     2130                smlTrace(TRACE_INTERNAL, "read: %s\n", elem_name); 
     2131                if (!strcmp(elem_name, SML_ELEMENT_CTCAP) && 
     2132                        xmlTextReaderNodeType(parser->reader) == XML_NODE_CLOSE) { 
     2133                        break; 
     2134                } 
     2135 
     2136                SmlDevInfCTCapType type; 
     2137                type = smlDevInfCTCapTypeFromString(elem_name, NULL); 
     2138                if (xmlTextReaderNodeType(parser->reader) != XML_NODE_START && 
     2139                        type != SML_DEVINF_CTCAP_NOTRUNCATE && 
     2140                        type != SML_DEVINF_CTCAP_PROPERTY && type != SML_DEVINF_CTCAP_PROPPARAM) { 
     2141                        smlErrorSet(error, SML_ERROR_GENERIC, "Not a start node: %s", (char *)xmlTextReaderConstName(parser->reader)); 
     2142                        goto error; 
     2143                } 
     2144 
     2145                char *value = NULL; 
     2146                if (type != SML_DEVINF_CTCAP_UNKNOWN && 
     2147                        type != SML_DEVINF_CTCAP_PROPERTY && 
     2148                        type != SML_DEVINF_CTCAP_PROPPARAM) { 
     2149                        _smlXmlParserGetString(parser, &value, elem_name, error); 
     2150                        smlDevInfAddCTCap(devinf, type, value); 
     2151                        g_free(value); 
     2152                } 
     2153         
     2154                if (!_smlXmlParserStep(parser)) { 
     2155                        smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); 
     2156                        goto error; 
     2157                } 
     2158        } 
     2159         
     2160        smlTrace(TRACE_EXIT, "%s", __func__); 
     2161        return TRUE; 
     2162 
     2163error: 
     2164        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
     2165        return FALSE; 
     2166} 
     2167 
    21082168static SmlBool _smlXmlDevInfDataStoreParseRxTx(SmlXmlParser *parser, const char *element, char **cttype, char **version, SmlError **error) 
    21092169{ 
     
    22162276                        if (!_smlXmlDevInfDataStoreParseRxTx(parser, SML_ELEMENT_TX, &(datastore->txContentType), &(datastore->txVersion), error)) 
    22172277                                goto error_free_datastore; 
     2278                } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTCAP)) { 
     2279                        if (!_smlXmlDevInfDataStoreParseCTCap(parser, devinf, error)) 
     2280                                goto error_free_datastore; 
    22182281                } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_SYNCCAP)) { 
    22192282                        if (!_smlXmlDevInfDataStoreParseSyncCap(parser, datastore, error)) 
     
    23022365                        else if (verdtd && !strcmp(verdtd, "1.0")) 
    23032366                                devinf->version = SML_DEVINF_VERSION_10; 
     2367                        else if (verdtd && !strcmp(verdtd, "1.2")) 
     2368                                devinf->version = SML_DEVINF_VERSION_12; 
    23042369                        else { 
    23052370                                g_free(verdtd); 
     
    24032468                                goto error_free_devinf; 
    24042469                } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTCAP)) { 
    2405                         if (!_smlXmlParserStep(parser)) { 
    2406                                 smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); 
     2470                        if (!_smlXmlDevInfDataStoreParseCTCap(parser, devinf, error)) 
    24072471                                goto error_free_devinf; 
    2408                         } 
    2409                          
    2410                         while (1) { 
    2411                                 if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTCAP) && 
    2412                                     xmlTextReaderNodeType(parser->reader) == XML_NODE_CLOSE) { 
    2413                                         break; 
    2414                                 } else if (xmlTextReaderNodeType(parser->reader) != XML_NODE_START) { 
    2415                                         smlErrorSet(error, SML_ERROR_GENERIC, "Not a start node"); 
    2416                                         goto error_free_devinf; 
    2417                                 } 
    2418                                  
    2419                                 const char *elem_name; 
    2420                                 char *value = NULL; 
    2421                                 SmlDevInfCTCapType type; 
    2422                                  
    2423                                 elem_name = (const char*)xmlTextReaderConstName(parser->reader); 
    2424                                 type = smlDevInfCTCapTypeFromString(elem_name, NULL); 
    2425                                 if (type != SML_DEVINF_CTCAP_UNKNOWN) { 
    2426                                         _smlXmlParserGetString(parser, &value, elem_name, error); 
    2427                                         smlDevInfAddCTCap(devinf, type, value); 
    2428                                         g_free(value); 
    2429                                 } 
    2430  
    2431                                 if (!_smlXmlParserStep(parser)) { 
    2432                                         smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); 
    2433                                         goto error_free_devinf; 
    2434                                 } 
    2435                         } 
    24362472                } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_EXT)) { 
    24372473                        /* Ignored for now */ 
  • trunk/libsyncml/sml_devinf.c

    r241 r258  
    8686                case SML_DEVINF_DEVTYPE_WORKSTATION: 
    8787                        return SML_ELEMENT_DEVTYP_WORKSTATION; 
    88                 default: 
    89                         ; 
    9088        } 
    9189                 
     
    555553        if (version == SML_DEVINF_VERSION_10) 
    556554                source = smlLocationNew("./devinf10", NULL, error); 
     555        else if (version == SML_DEVINF_VERSION_12) 
     556                source = smlLocationNew("./devinf12", NULL, error); 
    557557        else 
    558558                source = smlLocationNew("./devinf11", NULL, error); 
     
    589589        if (version == SML_DEVINF_VERSION_10) 
    590590                source = smlLocationNew("./devinf10", NULL, error); 
     591        else if (version == SML_DEVINF_VERSION_12) 
     592                source = smlLocationNew("./devinf12", NULL, error); 
    591593        else 
    592594                source = smlLocationNew("./devinf11", NULL, error); 
     
    631633        if (version == SML_DEVINF_VERSION_10) 
    632634                target = smlLocationNew("./devinf10", NULL, error); 
     635        else if (version == SML_DEVINF_VERSION_12) 
     636                target = smlLocationNew("./devinf12", NULL, error); 
    633637        else 
    634638                target = smlLocationNew("./devinf11", NULL, error); 
     
    762766        } else if (!strcmp(name, SML_ELEMENT_PARAMNAME)) { 
    763767                return SML_DEVINF_CTCAP_PARAMNAME; 
     768        } else if (!strcmp(name, SML_ELEMENT_VERCT)) { 
     769                return SML_DEVINF_CTCAP_VERCT; 
     770        } else if (!strcmp(name, SML_ELEMENT_PROPERTY)) { 
     771                return SML_DEVINF_CTCAP_PROPERTY; 
     772        } else if (!strcmp(name, SML_ELEMENT_PROPPARAM)) { 
     773                return SML_DEVINF_CTCAP_PROPPARAM; 
     774        } else if (!strcmp(name, SML_ELEMENT_NOTRUNCATE)) { 
     775                return SML_DEVINF_CTCAP_NOTRUNCATE; 
     776        } else if (!strcmp(name, SML_ELEMENT_MAXOCCUR)) { 
     777                return SML_DEVINF_CTCAP_MAXOCCUR; 
    764778        } 
    765779         
     
    786800                case SML_DEVINF_CTCAP_PARAMNAME: 
    787801                        return SML_ELEMENT_PARAMNAME; 
    788                 default: 
    789                         ; 
     802                case SML_DEVINF_CTCAP_NOTRUNCATE: 
     803                        return SML_ELEMENT_NOTRUNCATE; 
     804                case SML_DEVINF_CTCAP_MAXOCCUR: 
     805                        return SML_ELEMENT_MAXOCCUR; 
    790806        } 
    791807