rendered paste bodyIndex: 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");