ANSC_HANDLE
AnscXmlDomNodeGetHeadChild
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus  = ANSC_STATUS_SUCCESS;
    PANSC_XML_DOM_NODE_OBJECT       pXmlNode      = (PANSC_XML_DOM_NODE_OBJECT)hThisObject;
    PANSC_XML_DOM_NODE_OBJECT       pChildNode    = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry   = NULL;

    if( AnscQueueQueryDepth(&pXmlNode->ChildNodeQueue) == 0)
    {
        if( pXmlNode->ChildNodeQueue.Next.Next != NULL)
        {
            PANSC_XML_ATTRIBUTE                     pNameAttr = NULL;

            pNameAttr = (PANSC_XML_ATTRIBUTE)AnscXmlDomNodeGetFirstAttr(pXmlNode);

            if( pNameAttr == NULL || pNameAttr->StringData == NULL)
            {
                AnscXmlWarning("The child node queue of XML node is corrupted.\n");
            }
            else
            {
                AnscXmlWarning
                    (
                        "The child node queue of XML node '%s' is corrupted.\n",
                        (PCHAR)pNameAttr->StringData
                    );
            }
        }

        return NULL;
    }

    AnscAcquireXmlLock(&pXmlNode->ChildNodeQueueLock);
    pSLinkEntry = AnscQueueGetFirstEntry(&pXmlNode->ChildNodeQueue);
    AnscReleaseXmlLock(&pXmlNode->ChildNodeQueueLock);

    if ( pSLinkEntry )
    {
        pChildNode = ACCESS_ANSC_XML_DOM_NODE_OBJECT(pSLinkEntry);
    }

    return  (ANSC_HANDLE)pChildNode;
}
ANSC_HANDLE
AnscXmlDomNodeCopy
    (
        ANSC_HANDLE                 hNode
    )
{
    CHAR                            pNodeName[128]  = { 0 };
    ULONG                           uNodeLength     = 128;

    PANSC_XML_DOM_NODE_OBJECT       pOld            = (PANSC_XML_DOM_NODE_OBJECT)hNode;
    PANSC_XML_DOM_NODE_OBJECT       pCopy           = NULL;

    PANSC_XML_ATTRIBUTE             pFirst          = NULL;
    PANSC_XML_ATTRIBUTE             pNewAttribute   = NULL;

    PANSC_XML_DOM_NODE_OBJECT       pFirstNode      = NULL;
    ANSC_HANDLE                     hCopy, hChild;

    if( hNode == NULL)
    {
        return (ANSC_HANDLE)NULL;
    }

    /* create a new node with the node name */
    pCopy = (PANSC_XML_DOM_NODE_OBJECT)AnscXmlDomNodeCreate(pOld->hOwnerContext);
    if( pCopy == NULL)
    {
        return (ANSC_HANDLE)NULL;
    }

    hCopy = (ANSC_HANDLE)pCopy;

    AnscXmlDomNodeSetName(hCopy, AnscXmlDomNodeGetName(hNode));

    /* copy all the attributes */
    pFirst = (PANSC_XML_ATTRIBUTE)AnscXmlDomNodeGetFirstAttr(hNode);
    while ( pFirst != NULL)
    {
        /*
         * generate a new tree Attribute
         */
        pNewAttribute = (PANSC_XML_ATTRIBUTE)AnscAllocateMemory(sizeof(ANSC_XML_ATTRIBUTE));

        if ( !pNewAttribute )
        {
        	AnscXmlDomNodeRemove( hCopy );
            ANSC_XML_TRACE("Failed to allocate attribute structure for in ALXMLCopyHandle\n");

            return (ANSC_HANDLE)NULL;
        }

        AnscZeroMemory(pNewAttribute, sizeof(ANSC_XML_ATTRIBUTE));
        pNewAttribute->hParentNode   = (ANSC_HANDLE)pCopy;
        pNewAttribute->hXMLContext   = pCopy->hXMLContext;
        pNewAttribute->DataSize      = pFirst->DataSize;
        pNewAttribute->StringData    = AnscAllocateMemory( pFirst->DataSize + 1);

        if( pNewAttribute->StringData != NULL)
        {
            AnscZeroMemory(pNewAttribute->StringData,pFirst->DataSize + 1);

            /* copy the attribute name and value */
            AnscCopyString(pNewAttribute->Name, pFirst->Name);

            if( pFirst->StringData != NULL)
            {
                AnscCopyMemory(pNewAttribute->StringData, pFirst->StringData, pNewAttribute->DataSize);
            }

            /* add the attribute to the list */
            AnscAcquireXmlLock(&pCopy->AttributesListLock);
            AnscQueuePushEntry(&pCopy->AttributesList, &pNewAttribute->Linkage);
            AnscReleaseXmlLock(&pCopy->AttributesListLock);
        }
        else
        {
            AnscFreeMemory(pNewAttribute);
        }

        /* goto next attribute */
        pFirst = (PANSC_XML_ATTRIBUTE)AnscXmlDomNodeGetNextAttr(hNode, (ANSC_HANDLE)pFirst);
    }

     /* copy the text value */
    if( pOld->DataSize > 0 && pOld->StringData != NULL)
    {
        pCopy->DataSize   = pOld->DataSize;
        pCopy->StringData = AnscAllocateMemory( pOld->DataSize + 1);

        if( pCopy->StringData != NULL)
        {
            AnscZeroMemory(pCopy->StringData, pOld->DataSize + 1);
            AnscCopyMemory(pCopy->StringData, pOld->StringData, pOld->DataSize);
        }
        else
        {
            pCopy->DataSize = 0;
        }
    }

    /* create and copy all the child node */
    pFirstNode  = AnscXmlDomNodeGetHeadChild(hNode);

    while( pFirstNode )
    {
        hChild  = AnscXmlDomNodeCopy((ANSC_HANDLE)pFirstNode);
        if (hChild)
        	AnscXmlDomNodeAddChild(hCopy, hChild);

        /* goto the next node */
        pFirstNode = AnscXmlDomNodeGetNextChild(hNode, (ANSC_HANDLE)pFirstNode);
    }

    return hCopy;
}
/**********************************************************************

    prototype:

        ANSC_STATUS
        CcspCwmpSoappoUtilGetParamValue
            (
                ANSC_HANDLE                 hXmlHandle,
                ANSC_HANDLE                 hParamHandle
            );

    description:

        This function is called to get the parameter value from the
        xml handle.

    argument:
                ANSC_HANDLE                 hXmlHandle,
                The XML node;

                ANSC_HANDLE                 hParamHandle
                The parameter handle

    return:     the status of the operation.

**********************************************************************/
ANSC_STATUS
CcspCwmpSoappoUtilGetParamValue
    (
        ANSC_HANDLE                 hCcspCwmpMcoIf,
        ANSC_HANDLE                 hXmlHandle,
        ANSC_HANDLE                 hParamHandle
    )
{
    PCCSP_CWMP_MCO_INTERFACE        pCcspCwmpMcoIf = (PCCSP_CWMP_MCO_INTERFACE)hCcspCwmpMcoIf;
    PANSC_XML_DOM_NODE_OBJECT       pXmlNode     = (PANSC_XML_DOM_NODE_OBJECT)hXmlHandle;
    PANSC_XML_DOM_NODE_OBJECT       pNameNode    = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    PANSC_XML_DOM_NODE_OBJECT       pValueNode   = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    PCCSP_CWMP_PARAM_VALUE          pCwmpParam   = (PCCSP_CWMP_PARAM_VALUE)hParamHandle;
    PSLAP_VARIABLE                  pSlapVariable= (PSLAP_VARIABLE)NULL;
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    CHAR                            pValue[1024] = { 0 };
    ULONG                           dataType     = CCSP_CWMP_TR069_DATA_TYPE_Unspecified;
    ULONG                           length       = 1024;
    ULONG                           uLongValue   = 0;
    LONG                            longValue    = 0;
    BOOL                            bBool        = FALSE;
    BOOL                            bIsInteger   = FALSE;
    PANSC_XML_ATTRIBUTE             pAttribute   = NULL;
	char*							pDataType    = NULL;
    char                            pTemp[64]    = { 0 };
    CHAR                            pHugeValue[32000]
                                                 = { 0 };  /* Config file value could be as big as 32K */

    pCwmpParam->Value          = NULL;

    /***************************************************************************
    * Argument     | Type         | Description                               *
    ***************************************************************************
    * Name         | string(256)  | This is the name of a Parameter.          *
    *-------------------------------------------------------------------------*
    * Value        | any          | Teh is the value to be set               .*
    ***************************************************************************/

    pNameNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetHeadChild(pXmlNode);

    pValueNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetTailChild(pXmlNode);

    if( pNameNode == NULL || pValueNode == NULL || pNameNode == pValueNode)
    {
        CcspTr069PaTraceError(("Invalid arguments for ParameterValueStruct.\n"));

        return ANSC_STATUS_FAILURE;
    }

    /*
     * Get the name first;
     */
    length = 256;

    returnStatus =
    	AnscXmlDomNodeGetDataString
            (
                pNameNode,
                NULL,
                pValue,
                &length
            );

    if( returnStatus != ANSC_STATUS_SUCCESS)
    {
        CcspTr069PaTraceError(("Failed to get the parameter name.\n"));

        return returnStatus;
    }

	if( length == 0)
	{
		CcspTr069PaTraceError(("Empty parameter name in SetParameterValues.\n"));

		return ANSC_STATUS_FAILURE;
	}

    pCwmpParam->Name = CcspTr069PaCloneString(pValue);

    length = 1024;
    AnscZeroMemory(pValue, length);

    pSlapVariable = (PSLAP_VARIABLE)CcspTr069PaAllocateMemory(sizeof(SLAP_VARIABLE));

    if ( !pSlapVariable )
    {
        return ANSC_STATUS_RESOURCES;
    }

    SlapInitVariable(pSlapVariable);

    pCwmpParam->Value          = pSlapVariable;

    pSlapVariable->Name        = NULL;
    pSlapVariable->ContentType = 0;
    pSlapVariable->UsageType   = 0;

    /* check the value */
    length = 32000;

    returnStatus =
        AnscXmlDomNodeGetDataString
            (
                pValueNode,
                NULL,
                pHugeValue,
                &length
            );

    if( returnStatus != ANSC_STATUS_SUCCESS)
    {
        CcspTr069PaTraceError(("Failed to get the string parameter value.\n"));

        CcspTr069PaFreeMemory(pSlapVariable);

        pCwmpParam->Value = NULL;
    }
    else
    {
        pSlapVariable->ContentType       = SLAP_CONTENT_TYPE_UNSPECIFIED;
        pSlapVariable->UsageType         = 0;
        pSlapVariable->Syntax            = SLAP_VAR_SYNTAX_string;
        pSlapVariable->Variant.varString = CcspTr069PaCloneString(pHugeValue);
    }

    pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Unspecified;

    /* retrieve data type */
    if ( TRUE )
    {
        PANSC_XML_ATTRIBUTE         pAttribute;
        
        pCwmpParam->Tr069DataType  = pCcspCwmpMcoIf->GetParamDataType(pCcspCwmpMcoIf->hOwnerContext, pCwmpParam->Name);
        pAttribute = (PANSC_XML_ATTRIBUTE)AnscXmlDomNodeGetFirstAttr(pValueNode);
        if ( pAttribute )
        {
            char*                   pDataType;

            AnscCopyMemory(pValue, pAttribute->StringData, pAttribute->DataSize);

            pDataType = _ansc_strstr(pValue, ":");

            if ( !pDataType )
            {
                pDataType = pValue;
            }
            else
            {
                pDataType ++;
            }

            if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_string, TRUE) )
            {
                pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_String;
            }
            else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_int, TRUE) )
            {
                pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Int;
            }
            else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_unsignedInt, TRUE) )
            {
                pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_UnsignedInt;
            }
            else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_boolean, TRUE) )
            {
                pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Boolean;
            }
            else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_dateTime, TRUE) )
            {
                pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_DateTime;
            }
            else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_base64, TRUE) )
            {
                pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Base64;
            }
            else
            {
                pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Unspecified;
            }
        }
    }    

    if ( pCwmpParam->Tr069DataType == CCSP_CWMP_TR069_DATA_TYPE_Unspecified )
    {
        return  ANSC_STATUS_BAD_PARAMETER;
    }

    return ANSC_STATUS_SUCCESS;
}