Index: libsyncml/parser/sml_xml_parse.c =================================================================== --- libsyncml/parser/sml_xml_parse.c (revision 241) +++ libsyncml/parser/sml_xml_parse.c (working copy) @@ -2103,6 +2103,52 @@ return FALSE; } +static SmlBool _smlXmlDevInfDataStoreParseCTCap(SmlXmlParser *parser, SmlDevInf *devinf, SmlError **error) +{ + smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, parser, devinf, error); + smlAssert(parser); + smlAssert(devinf); + + if (!_smlXmlParserStep(parser)) { + smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); + goto error; + } + + while (1) { + if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTCAP) && + xmlTextReaderNodeType(parser->reader) == XML_NODE_CLOSE) { + break; + } else if (xmlTextReaderNodeType(parser->reader) != XML_NODE_START) { + smlErrorSet(error, SML_ERROR_GENERIC, "Not a start node"); + goto error; + } + + const char *elem_name; + char *value = NULL; + SmlDevInfCTCapType type; + + elem_name = (const char*)xmlTextReaderConstName(parser->reader); + type = smlDevInfCTCapTypeFromString(elem_name, NULL); + if (type != SML_DEVINF_CTCAP_UNKNOWN) { + _smlXmlParserGetString(parser, &value, elem_name, error); + smlDevInfAddCTCap(devinf, type, value); + g_free(value); + } + + if (!_smlXmlParserStep(parser)) { + smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); + goto error; + } + } + + smlTrace(TRACE_EXIT, "%s", __func__); + return TRUE; + +error: + smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); + return FALSE; +} + static SmlBool _smlXmlDevInfDataStoreParseRxTx(SmlXmlParser *parser, const char *element, char **cttype, char **version, SmlError **error) { smlTrace(TRACE_ENTRY, "%s(%p, %s, %p, %p, %p)", __func__, parser, element, cttype, version, error); @@ -2213,6 +2259,9 @@ } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_TX)) { if (!_smlXmlDevInfDataStoreParseRxTx(parser, SML_ELEMENT_TX, &(datastore->txContentType), &(datastore->txVersion), error)) goto error_free_datastore; + } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTCAP)) { + if (!_smlXmlDevInfDataStoreParseCTCap(parser, devinf, error)) + goto error_free_datastore; } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_SYNCCAP)) { if (!_smlXmlDevInfDataStoreParseSyncCap(parser, datastore, error)) goto error_free_datastore; @@ -2400,37 +2449,8 @@ if (!_smlXmlDevInfDataStoreParse(parser, devinf, error)) goto error_free_devinf; } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTCAP)) { - if (!_smlXmlParserStep(parser)) { - smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); + if (!_smlXmlDevInfDataStoreParseCTCap(parser, devinf, error)) goto error_free_devinf; - } - - while (1) { - if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTCAP) && - xmlTextReaderNodeType(parser->reader) == XML_NODE_CLOSE) { - break; - } else if (xmlTextReaderNodeType(parser->reader) != XML_NODE_START) { - smlErrorSet(error, SML_ERROR_GENERIC, "Not a start node"); - goto error_free_devinf; - } - - const char *elem_name; - char *value = NULL; - SmlDevInfCTCapType type; - - elem_name = (const char*)xmlTextReaderConstName(parser->reader); - type = smlDevInfCTCapTypeFromString(elem_name, NULL); - if (type != SML_DEVINF_CTCAP_UNKNOWN) { - _smlXmlParserGetString(parser, &value, elem_name, error); - smlDevInfAddCTCap(devinf, type, value); - g_free(value); - } - - if (!_smlXmlParserStep(parser)) { - smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); - goto error_free_devinf; - } - } } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_EXT)) { /* Ignored for now */ smlTrace(TRACE_INTERNAL, "Skipping ext node");