[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;

+}