[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/cwmp/netcwmp/libxmlet/src/document.c b/ap/app/cwmp/netcwmp/libxmlet/src/document.c
new file mode 100755
index 0000000..c0aeff5
--- /dev/null
+++ b/ap/app/cwmp/netcwmp/libxmlet/src/document.c
@@ -0,0 +1,1033 @@
+///////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2003 Intel Corporation
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither name of Intel Corporation nor the names of its contributors
+// may be used to endorse or promote products derived from this software
+// without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+///////////////////////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "xmlparser.h"
+
+/*================================================================
+* XmlDocumentInit
+* It initialize the document structure.
+* External function.
+*
+*=================================================================*/
+void
+XmlDocumentInit( XmlDocument * doc )
+{
+ memset( doc, 0, sizeof( XmlDocument ) );
+}
+
+/*================================================================
+* XmlDocumentFree
+* It XFREEs the whole document tree.
+* External function.
+*
+*=================================================================*/
+void
+XmlDocumentFree(
+ Pool * pool,
+ XmlDocument * doc )
+{
+ if ( doc != NULL )
+ {
+ XmlNodeFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ ( XmlNode * ) doc );
+ }
+
+}
+
+/*================================================================
+* XmlDocSetOwnerDocument
+*
+* When this function is called first time, nodeptr is the root
+* of the subtree, so it is not necessay to do two steps
+* recursion.
+*
+* Internal function called by XmlDocImportNode
+*
+*=================================================================*/
+void
+XmlDocSetOwnerDocument( XmlDocument * doc,
+ XmlNode * nodeptr )
+{
+ if ( nodeptr != NULL )
+ {
+ nodeptr->ownerDocument = doc;
+ XmlDocSetOwnerDocument( doc,
+ XmlNodeGetFirstChild( nodeptr ) );
+ XmlDocSetOwnerDocument( doc,
+ XmlNodeGetNextSibling
+ ( nodeptr ) );
+ }
+}
+
+/*================================================================
+* XmlDocImportNode
+* Imports a node from another document to this document. The
+* returned node has no parent; (parentNode is null). The source
+* node is not altered or removed from the original document;
+* this method creates a new copy of the source node.
+
+* For all nodes, importing a node creates a node object owned
+* by the importing document, with attribute values identical to
+* the source node's nodeName and nodeType, plus the attributes
+* related to namespaces (prefix, localName, and namespaceURI).
+* As in the cloneNode operation on a node, the source node is
+* not altered.
+*
+* External function.
+*
+*=================================================================*/
+int
+XmlDocImportNode(
+ Pool * pool,
+
+ XmlDocument * doc,
+ XmlNode * importNode,
+ IN BOOL deep,
+ OUT XmlNode ** rtNode )
+{
+ unsigned short nodeType;
+ XmlNode * newNode;
+
+ *rtNode = NULL;
+
+ if ( ( doc == NULL ) || ( importNode == NULL ) )
+ {
+ return XML_INVALID_PARAMETER;
+ }
+
+ nodeType = XmlNodeGetNodeType( importNode );
+ if ( nodeType == XML_DOCUMENT_NODE )
+ {
+ return XML_NOT_SUPPORTED_ERR;
+ }
+
+ newNode = XmlNodeCloneNode(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ importNode, deep );
+ if ( newNode == NULL )
+ {
+ return XML_FAILED;
+ }
+
+ XmlDocSetOwnerDocument( doc, newNode );
+ *rtNode = newNode;
+
+ return XML_OK;
+}
+
+/*================================================================
+* XmlDocCreateElementEx
+* Creates an element of the type specified.
+* External function.
+* Parameters:
+* doc: pointer to document
+* tagName: The name of the element, it is case-sensitive.
+* Return Value:
+* XML_OK
+* XML_INVALID_PARAMETER: if either doc or tagName is NULL
+* XML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations.
+*
+*=================================================================*/
+int
+#ifdef USE_CWMP_MEMORY_POOL
+XmlDocCreateElementEx(Pool * pool, XmlDocument * doc,
+#else
+XmlDocCreateElementEx( XmlDocument * doc,
+#endif
+
+ IN char * tagName,
+ OUT XmlElement ** rtElement )
+{
+
+ int errCode = XML_OK;
+ XmlElement *newElement = NULL;
+
+ if ( ( doc == NULL ) || ( tagName == NULL ) )
+ {
+ errCode = XML_INVALID_PARAMETER;
+ goto ErrorHandler;
+ }
+
+ newElement = ( XmlElement * ) PMALLOC( sizeof( XmlElement ) );
+ if ( newElement == NULL )
+ {
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ XmlElementInit( newElement );
+ newElement->tagName = PSTRDUP( tagName );
+ if ( newElement->tagName == NULL )
+ {
+ XmlElementFree(
+#ifdef USE_CWMP_MEMORY_POOL
+
+ pool ,
+#endif
+ newElement );
+ newElement = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+ // set the node fields
+ newElement->node.nodeType = XML_ELEMENT_NODE;
+ newElement->node.nodeName = PSTRDUP( tagName );
+ if ( newElement->node.nodeName == NULL )
+ {
+ XmlElementFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ newElement );
+ newElement = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ newElement->node.ownerDocument = doc;
+
+ErrorHandler:
+ *rtElement = newElement;
+ return errCode;
+
+}
+
+/*================================================================
+* XmlDocCreateElement
+* Creates an element of the type specified.
+* External function.
+* Parameters:
+* doc: pointer to document
+* tagName: The name of the element, it is case-sensitive.
+* Return Value:
+* A new element object with the nodeName set to tagName, and
+* localName, prefix and namespaceURI set to null.
+*
+*=================================================================*/
+XmlElement *
+
+XmlDocCreateElement(
+ Pool * pool,
+ XmlDocument * doc,
+ IN char * tagName )
+{
+ XmlElement *newElement = NULL;
+
+ XmlDocCreateElementEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ doc, tagName, &newElement );
+ return newElement;
+
+}
+
+/*================================================================
+* XmlDocCreateDocumentEx
+* Creates an document object
+* Internal function.
+* Parameters:
+* rtDoc: the document created or NULL on failure
+* Return Value:
+* XML_OK
+* XML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations.
+*
+*=================================================================*/
+int
+XmlDocCreateDocumentEx(
+ Pool * pool,
+ OUT XmlDocument ** rtDoc )
+{
+ XmlDocument *doc;
+ int errCode = XML_OK;
+
+ doc = NULL;
+ doc = ( XmlDocument * ) PMALLOC( sizeof( XmlDocument ) );
+ if ( doc == NULL )
+ {
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ XmlDocumentInit( doc );
+
+ doc->node.nodeName = PSTRDUP( DOCUMENTNODENAME );
+ if ( doc->node.nodeName == NULL )
+ {
+ XmlDocumentFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ doc );
+ doc = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ doc->node.nodeType = XML_DOCUMENT_NODE;
+ doc->node.ownerDocument = doc;
+
+ErrorHandler:
+ *rtDoc = doc;
+ return errCode;
+}
+
+/*================================================================
+* XmlDocCreateDocument
+* Creates an document object
+* Internal function.
+* Parameters:
+* none
+* Return Value:
+* A new document object with the nodeName set to "#document".
+*
+*=================================================================*/
+XmlDocument *
+XmlDocCreateDocument(
+#ifdef USE_CWMP_MEMORY_POOL
+ Pool * pool
+#endif
+)
+{
+ XmlDocument *doc = NULL;
+
+ XmlDocCreateDocumentEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ &doc );
+
+ return doc;
+
+}
+
+/*================================================================
+* XmlDocCreateTextNodeEx
+* Creates an text node.
+* External function.
+* Parameters:
+* data: text data for the text node. It is stored in nodeValue field.
+* Return Value:
+* XML_OK
+* XML_INVALID_PARAMETER: if either doc or data is NULL
+* XML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations.
+*
+*=================================================================*/
+int
+#ifdef USE_CWMP_MEMORY_POOL
+XmlDocCreateTextNodeEx(Pool * pool, XmlDocument * doc,
+#else
+XmlDocCreateTextNodeEx( XmlDocument * doc,
+#endif
+ IN char *data,
+ OUT XmlNode ** textNode )
+{
+ XmlNode * returnNode;
+ int rc = XML_OK;
+
+ returnNode = NULL;
+ if ( ( doc == NULL ) || ( data == NULL ) )
+ {
+ rc = XML_INVALID_PARAMETER;
+ goto ErrorHandler;
+ }
+
+ returnNode = ( XmlNode * ) PMALLOC( sizeof( XmlNode ) );
+ if ( returnNode == NULL )
+ {
+ rc = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+ // initialize the node
+ XmlNodeInit( returnNode );
+
+ returnNode->nodeName = PSTRDUP( TEXTNODENAME );
+ if ( returnNode->nodeName == NULL )
+ {
+ XmlNodeFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ returnNode );
+ returnNode = NULL;
+ rc = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+ // add in node value
+// if ( data != NULL ) // kw 3
+ {
+ returnNode->nodeValue = XmlStrduptrim(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ data );
+ if ( returnNode->nodeValue == NULL )
+ {
+ XmlNodeFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ returnNode );
+ returnNode = NULL;
+ rc = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+ }
+
+ returnNode->nodeType = XML_TEXT_NODE;
+ returnNode->ownerDocument = doc;
+
+ErrorHandler:
+ *textNode = returnNode;
+ return rc;
+
+}
+
+/*================================================================
+* XmlDocCreateTextNode
+* Creates an text node.
+* External function.
+* Parameters:
+* data: text data for the text node. It is stored in nodeValue field.
+* Return Value:
+* The new text node.
+*
+*=================================================================*/
+XmlNode *
+XmlDocCreateTextNode(
+ Pool * pool,
+
+ XmlDocument * doc,
+ IN char *data )
+{
+ XmlNode * returnNode = NULL;
+
+ XmlDocCreateTextNodeEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ doc, data, &returnNode );
+
+ return returnNode;
+}
+
+/*================================================================
+* XmlDocCreateAttributeEx
+* Creates an attribute of the given name.
+* External function.
+* Parameters:
+* name: The name of the Attribute node.
+* Return Value:
+* XML_OK
+* XML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations.
+*
+================================================================*/
+int
+#ifdef USE_CWMP_MEMORY_POOL
+XmlDocCreateAttributeEx(Pool * pool, XmlDocument * doc,
+#else
+XmlDocCreateAttributeEx( XmlDocument * doc,
+#endif
+
+ const char *name,
+ XmlAttribute ** rtAttr )
+{
+ XmlAttribute *attrNode = NULL;
+ int errCode = XML_OK;
+
+ attrNode = ( XmlAttribute * ) PMALLOC( sizeof( XmlAttribute ) );
+ if ( attrNode == NULL )
+ {
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ if ( ( doc == NULL ) || ( name == NULL ) )
+ {
+ XmlAttrFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ attrNode );
+ attrNode = NULL;
+ errCode = XML_INVALID_PARAMETER;
+ goto ErrorHandler;
+ }
+
+ XmlAttrInit( attrNode );
+
+ attrNode->node.nodeType = XML_ATTRIBUTE_NODE;
+
+ // set the node fields
+ attrNode->node.nodeName = PSTRDUP( name );
+ if ( attrNode->node.nodeName == NULL )
+ {
+ XmlAttrFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ attrNode );
+ attrNode = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ attrNode->node.ownerDocument = doc;
+
+ErrorHandler:
+ *rtAttr = attrNode;
+ return errCode;
+
+}
+
+/*================================================================
+* XmlDocCreateAttribute
+* Creates an attribute of the given name.
+* External function.
+* Parameters:
+* name: The name of the Attribute node.
+* Return Value:
+* A new attr object with the nodeName attribute set to the
+* given name, and the localName, prefix and namespaceURI set to NULL.
+* The value of the attribute is the empty string.
+*
+================================================================*/
+XmlAttribute *
+XmlDocCreateAttribute(
+ Pool * pool,
+ XmlDocument * doc,
+ IN char *name )
+{
+ XmlAttribute *attrNode = NULL;
+
+ XmlDocCreateAttributeEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ doc, name, &attrNode );
+ return attrNode;
+
+}
+
+/*================================================================
+* XmlDocCreateAttributeNSEx
+* Creates an attrbute of the given name and namespace URI
+* External function.
+* Parameters:
+* namespaceURI: the namespace fo the attribute to create
+* qualifiedName: qualifiedName of the attribute to instantiate
+* Return Value:
+* XML_OK
+* XML_INVALID_PARAMETER: if either doc,namespaceURI or qualifiedName is NULL
+* XML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations.
+*
+*=================================================================*/
+int
+XmlDocCreateAttributeNSEx(
+ Pool * pool,
+
+ XmlDocument * doc,
+ const char * namespaceURI,
+ const char * qualifiedName,
+ OUT XmlAttribute ** rtAttr )
+{
+ XmlAttribute *attrNode = NULL;
+ int errCode = XML_OK;
+
+ if ( ( doc == NULL ) || ( namespaceURI == NULL )
+ || ( qualifiedName == NULL ) )
+ {
+ errCode = XML_INVALID_PARAMETER;
+ goto ErrorHandler;
+ }
+
+ errCode =
+ XmlDocCreateAttributeEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ doc, qualifiedName, &attrNode );
+ if ( errCode != XML_OK )
+ {
+ goto ErrorHandler;
+ }
+ // set the namespaceURI field
+ attrNode->node.namespaceURI = PSTRDUP( namespaceURI );
+ if ( attrNode->node.namespaceURI == NULL )
+ {
+ XmlAttrFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ attrNode );
+ attrNode = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+ // set the localName and prefix
+ errCode =
+ XmlNodeSetNodeName(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ ( XmlNode * ) attrNode, qualifiedName );
+ if ( errCode != XML_OK )
+ {
+ XmlAttrFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ attrNode );
+ attrNode = NULL;
+ goto ErrorHandler;
+ }
+
+ErrorHandler:
+ *rtAttr = attrNode;
+ return errCode;
+
+}
+
+/*================================================================
+* XmlDocCreateAttributeNS
+* Creates an attrbute of the given name and namespace URI
+* External function.
+* Parameters:
+* namespaceURI: the namespace fo the attribute to create
+* qualifiedName: qualifiedName of the attribute to instantiate
+* Return Value:
+* Creates an attribute node with the given namespaceURI and
+* qualifiedName. The prefix and localname are extracted from
+* the qualifiedName. The node value is empty.
+*
+*=================================================================*/
+XmlAttribute *
+XmlDocCreateAttributeNS(
+ Pool * pool,
+
+ XmlDocument * doc,
+ IN char * namespaceURI,
+ IN char * qualifiedName )
+{
+ XmlAttribute *attrNode = NULL;
+
+ XmlDocCreateAttributeNSEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ doc, namespaceURI, qualifiedName,
+ &attrNode );
+ return attrNode;
+}
+
+/*================================================================
+* XmlDocCreateCDATASectionEx
+* Creates an CDATASection node whose value is the specified string
+* External function.
+* Parameters:
+* data: the data for the CDATASection contents.
+* Return Value:
+* XML_OK
+* XML_INVALID_PARAMETER: if either doc or data is NULL
+* XML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations.
+*
+*=================================================================*/
+int
+#ifdef USE_CWMP_MEMORY_POOL
+XmlDocCreateCDATASectionEx(Pool * pool, XmlDocument * doc,
+#else
+XmlDocCreateCDATASectionEx( XmlDocument * doc,
+#endif
+ IN char * data,
+ OUT XmlCDATASection ** rtCD )
+{
+ int errCode = XML_OK;
+ XmlCDATASection *cDSectionNode = NULL;
+
+ if ( ( doc == NULL ) || ( data == NULL ) )
+ {
+ errCode = XML_INVALID_PARAMETER;
+ goto ErrorHandler;
+ }
+
+ cDSectionNode =
+ ( XmlCDATASection * ) PMALLOC( sizeof( XmlCDATASection ) );
+ if ( cDSectionNode == NULL )
+ {
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ XmlCDATASectionInit( cDSectionNode );
+
+ cDSectionNode->node.nodeType = XML_CDATA_SECTION_NODE;
+ cDSectionNode->node.nodeName = PSTRDUP( CDATANODENAME );
+ if ( cDSectionNode->node.nodeName == NULL )
+ {
+ XmlCDATASectionFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ cDSectionNode );
+ cDSectionNode = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ cDSectionNode->node.nodeValue = XmlStrduptrim(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ data );
+ if ( cDSectionNode->node.nodeValue == NULL )
+ {
+ XmlCDATASectionFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ cDSectionNode );
+ cDSectionNode = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ cDSectionNode->node.ownerDocument = doc;
+
+ErrorHandler:
+ *rtCD = cDSectionNode;
+ return errCode;
+
+}
+
+/*================================================================
+* XmlDocCreateCDATASection
+* Creates an CDATASection node whose value is the specified string
+* External function.
+* Parameters:
+* data: the data for the CDATASection contents.
+* Return Value:
+* The new CDATASection object.
+*
+*=================================================================*/
+XmlCDATASection *
+XmlDocCreateCDATASection(
+ Pool * pool,
+
+ XmlDocument * doc,
+ IN char * data )
+{
+
+ XmlCDATASection *cDSectionNode = NULL;
+
+ XmlDocCreateCDATASectionEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ doc, data, &cDSectionNode );
+ return cDSectionNode;
+}
+
+/*================================================================
+* XmlDocCreateElementNSEx
+* Creates an element of the given qualified name and namespace URI.
+* External function.
+* Parameters:
+* namespaceURI: the namespace URI of the element to create.
+* qualifiedName: the qualified name of the element to instantiate.
+* Return Value:
+* Return Value:
+* XML_OK
+* XML_INVALID_PARAMETER: if either doc,namespaceURI or qualifiedName is NULL
+* XML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations.
+*
+*=================================================================*/
+int
+XmlDocCreateElementNSEx(
+ Pool * pool,
+
+ XmlDocument * doc,
+ IN char * namespaceURI,
+ IN char * qualifiedName,
+ OUT XmlElement ** rtElement )
+{
+
+ XmlElement *newElement = NULL;
+ int errCode = XML_OK;
+
+ if ( ( doc == NULL ) || ( namespaceURI == NULL )
+ || ( qualifiedName == NULL ) )
+ {
+ errCode = XML_INVALID_PARAMETER;
+ goto ErrorHandler;
+ }
+
+ errCode =
+ XmlDocCreateElementEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ doc, qualifiedName, &newElement );
+ if ( errCode != XML_OK )
+ {
+ goto ErrorHandler;
+ }
+ // set the namespaceURI field
+ newElement->node.namespaceURI = PSTRDUP( namespaceURI );
+ if ( newElement->node.namespaceURI == NULL )
+ {
+ XmlElementFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ newElement );
+ newElement = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+ // set the localName and prefix
+ errCode =
+ XmlNodeSetNodeName(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ ( XmlNode * ) newElement, qualifiedName );
+ if ( errCode != XML_OK )
+ {
+ XmlElementFree(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ newElement );
+ newElement = NULL;
+ errCode = XML_INSUFFICIENT_MEMORY;
+ goto ErrorHandler;
+ }
+
+ newElement->node.nodeValue = NULL;
+
+ErrorHandler:
+ *rtElement = newElement;
+ return errCode;
+
+}
+
+/*================================================================
+* XmlDocCreateElementNS
+* Creates an element of the given qualified name and namespace URI.
+* External function.
+* Parameters:
+* namespaceURI: the namespace URI of the element to create.
+* qualifiedName: the qualified name of the element to instantiate.
+* Return Value:
+* The new element object with tagName qualifiedName, prefix and
+* localName extraced from qualfiedName, nodeName of qualfiedName,
+* namespaceURI of namespaceURI.
+*
+*=================================================================*/
+XmlElement *
+XmlDocCreateElementNS(
+ Pool * pool,
+
+ XmlDocument * doc,
+ IN char * namespaceURI,
+ IN char * qualifiedName )
+{
+ XmlElement *newElement = NULL;
+
+ XmlDocCreateElementNSEx(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+
+ doc, namespaceURI, qualifiedName,
+ &newElement );
+ return newElement;
+}
+
+/*================================================================
+* XmlDocGetElementsByTagName
+* Returns a nodeList of all the Elements with a given tag name
+* in the order in which they are encountered in a preorder traversal
+* of the document tree.
+* External function.
+* Parameters:
+* tagName: the name of the tag to match on. The special value "*"
+* matches all tags.
+* Return Value:
+* A new nodeList object containing all the matched Elements.
+*
+*=================================================================*/
+XmlNodeList *
+XmlDocGetElementsByTagName(
+ Pool * pool,
+ XmlDocument * doc,
+ IN char *tagName )
+{
+ XmlNodeList *returnNodeList = NULL;
+
+ if ( ( doc == NULL ) || ( tagName == NULL ) )
+ {
+ return NULL;
+ }
+
+ XmlNodeGetElementsByTagName(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ ( XmlNode * ) doc, tagName,
+ &returnNodeList );
+ return returnNodeList;
+}
+
+/*================================================================
+* XmlDocGetElementsByTagNameNS
+* Returns a nodeList of all the Elements with a given local name and
+* namespace URI in the order in which they are encountered in a
+* preorder traversal of the document tree.
+* External function.
+* Parameters:
+* namespaceURI: the namespace of the elements to match on. The special
+* value "*" matches all namespaces.
+* localName: the local name of the elements to match on. The special
+* value "*" matches all local names.
+* Return Value:
+* A new nodeList object containing all the matched Elements.
+*
+*=================================================================*/
+XmlNodeList *
+XmlDocGetElementsByTagNameNS(
+ Pool * pool,
+ XmlDocument * doc,
+ IN char * namespaceURI,
+ IN char * localName )
+{
+ XmlNodeList *returnNodeList = NULL;
+
+ if ( ( doc == NULL ) || ( namespaceURI == NULL )
+ || ( localName == NULL ) )
+ {
+ return NULL;
+ }
+
+ XmlNodeGetElementsByTagNameNS(
+#ifdef USE_CWMP_MEMORY_POOL
+ pool ,
+#endif
+ ( XmlNode * ) doc, namespaceURI,
+ localName, &returnNodeList );
+ return returnNodeList;
+}
+
+/*================================================================
+* XmlDocGetElementById
+* Returns the element whose ID is given by tagName. If no such
+* element exists, returns null.
+* External function.
+* Parameter:
+* tagName: the tag name for an element.
+* Return Values:
+* The matching element.
+*
+*=================================================================*/
+XmlElement *
+XmlDocGetElementById( XmlDocument * doc,
+ IN char * tagName )
+{
+ XmlElement *rtElement = NULL;
+ XmlNode * nodeptr = ( XmlNode * ) doc;
+ const char *name;
+
+ if ( ( nodeptr == NULL ) || ( tagName == NULL ) )
+ {
+ return rtElement;
+ }
+
+ if ( XmlNodeGetNodeType( nodeptr ) == XML_ELEMENT_NODE )
+ {
+ name = XmlNodeGetNodeName( nodeptr );
+ if ( name == NULL )
+ {
+ return rtElement;
+ }
+
+ if ( strcmp( tagName, name ) == 0 )
+ {
+ rtElement = ( XmlElement * ) nodeptr;
+ return rtElement;
+ }
+ else
+ {
+ rtElement = XmlDocGetElementById( ( XmlDocument * )
+ XmlNodeGetFirstChild
+ ( nodeptr ),
+ tagName );
+ if ( rtElement == NULL )
+ {
+ rtElement = XmlDocGetElementById( ( XmlDocument
+ * )
+ XmlNodeGetNextSibling
+ ( nodeptr ),
+ tagName );
+ }
+ }
+ }
+ else
+ {
+ rtElement = XmlDocGetElementById( ( XmlDocument * )
+ XmlNodeGetFirstChild
+ ( nodeptr ), tagName );
+ if ( rtElement == NULL )
+ {
+ rtElement = XmlDocGetElementById( ( XmlDocument * )
+ XmlNodeGetNextSibling
+ ( nodeptr ),
+ tagName );
+ }
+ }
+
+ return rtElement;
+}