All pastes #617965 Raw Edit

Untitled

public text v1 · immutable
·published 2007-07-13 16:53 UTC
rendered paste body
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");