ANSC_HANDLE
AnscXmlDomNodeGetChildByName
    (
        ANSC_HANDLE                 hThisObject,
        char*                       name
    )
{
    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;

    while ( pChildNode =
                (PANSC_XML_DOM_NODE_OBJECT)AnscXmlDomNodeGetNextChild
                    (
                        (ANSC_HANDLE)pXmlNode,
                        (ANSC_HANDLE)pChildNode
                    ) )
    {
        if ( AnscEqualString(AnscXmlDomNodeGetName((ANSC_HANDLE)pChildNode), name, FALSE) )
        {
            return  (ANSC_HANDLE)pChildNode;
        }
    }

    return  (ANSC_HANDLE)NULL;
}
/**********************************************************************

    prototype:

        ANSC_HANDLE
        CcspCwmpSoappoUtilFindChildNode
            (
                ANSC_HANDLE                 hXmlNode,
                PCHAR                       pInputName
            );

    description:

        This function is called to find the child node with the
        specified node name (ignore namespace);

    argument:
                ANSC_HANDLE                 hXmlNode
                The xml node;

                PCHAR                       pInputName
                The input node name;

    return:     the node found;

**********************************************************************/
ANSC_HANDLE
CcspCwmpSoappoUtilFindChildNode
    (
        ANSC_HANDLE                 hXmlNode,
        PCHAR                       pInputName
    )
{
    PANSC_XML_DOM_NODE_OBJECT       pTempNode       = (PANSC_XML_DOM_NODE_OBJECT)hXmlNode;
    PANSC_XML_DOM_NODE_OBJECT       pChildNode      = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    PCHAR                           pNodeName       = NULL;

    pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetHeadChild(pTempNode);

    while(pChildNode != NULL)
    {
        pNodeName =
            CcspCwmpSoappoUtilGetNodeNameWithoutNS
                (
                	AnscXmlDomNodeGetName(pChildNode)
                );

        if( pNodeName != NULL && AnscEqualString(pNodeName, pInputName, TRUE))
        {
            return pChildNode;
        }

        pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
			AnscXmlDomNodeGetNextChild(pTempNode, pChildNode);
    }

    return NULL;
}
static ANSC_STATUS  
CcspTr069PaSsp_XML_GetMultipleItemWithSameName
    (
        PANSC_XML_DOM_NODE_OBJECT   pRootNode,
        char*                       ItemName,
        char**                      retVal
    )
{
    ANSC_STATUS                     returnStatus       = ANSC_STATUS_SUCCESS;
    PANSC_XML_DOM_NODE_OBJECT       pChildNode         = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    char                            buffer[512]        = {0};
    ULONG                           uLength            = 511; 
    
    if (pRootNode && ItemName && retVal)
    {
        if(*retVal) { CcspTr069PaFreeMemory(*retVal); *retVal = NULL; }
        
        pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
            AnscXmlDomNodeGetChildByName(pRootNode, ItemName);
        
        while( pChildNode != NULL)
        {
            if (AnscEqualString(pChildNode->Name, ItemName, TRUE))
            {
                uLength = 511;  // uLength: passes in max buffer length; gets out actual length
                
                if (pChildNode->GetDataString(pChildNode, NULL, buffer, &uLength) == ANSC_STATUS_SUCCESS && 
                    uLength > 0) 
                {
                    if(*retVal) 
                    {
                        char* sptr = (char*)CcspTr069PaAllocateMemory(AnscSizeOfString(*retVal)+1+uLength+1);
                        if(sptr == NULL) 
                        {
                            CcspTr069PaTraceWarning(("Failed to reallocate returnCA\n"));
                            CcspTr069PaFreeMemory(*retVal);
                            *retVal = NULL;
                            returnStatus =  ANSC_STATUS_RESOURCES;
                            goto EXIT;
                        }

                        _ansc_sprintf(sptr, "%s,%s", *retVal, buffer);
                        CcspTr069PaFreeMemory(*retVal);
                        *retVal = sptr;
                    }
                    else *retVal = CcspTr069PaCloneString(buffer);
                }
            }
            
            pChildNode = (PANSC_XML_DOM_NODE_OBJECT) AnscXmlDomNodeGetNextChild(pRootNode, pChildNode);
        }
        CcspTr069PaTraceDebug(("%s: %s = %s\n", __FUNCTION__, (ItemName)?(ItemName):"NULL", (*retVal)?(*retVal):"NULL"));
        //        fprintf(stderr, "%s: %s = %s\n", __FUNCTION__, (ItemName)?(ItemName):"NULL", (*retVal)?(*retVal):"NULL");
    }

 EXIT:
    return returnStatus;
}
BOOL
AnscXmlDomNodeEnumChild
    (
        ANSC_HANDLE                 hNode,
        PFN_XML_NODE_ENUM_KID_PROC  EnumProc,
        PVOID                       pData
    )
{
    PANSC_XML_DOM_NODE_OBJECT       pXmlNode    = (PANSC_XML_DOM_NODE_OBJECT)hNode;
    PANSC_XML_DOM_NODE_OBJECT       pKid;

    pKid    = AnscXmlDomNodeGetHeadChild((ANSC_HANDLE)pXmlNode);

    while (pKid)
    {
        if (!EnumProc(pKid, pData))
            return FALSE;

        pKid    = AnscXmlDomNodeGetNextChild((ANSC_HANDLE)pXmlNode, (ANSC_HANDLE)pKid);
    }

    return TRUE;
}
void
AnscXmlDomNodeSetLevel
    (
        ANSC_HANDLE                 hNode,
        ULONG                       ulLevel
    )
{
    PANSC_XML_DOM_NODE_OBJECT       pKid;
    PANSC_XML_DOM_NODE_OBJECT       pXmlNode    = (PANSC_XML_DOM_NODE_OBJECT)hNode;

    if (pXmlNode)
    {
        pXmlNode->Level = ulLevel;

        pKid    = AnscXmlDomNodeGetHeadChild(hNode);

        while (pKid)
        {
        	AnscXmlDomNodeSetLevel((ANSC_HANDLE)pKid, ulLevel + 1);

            pKid    = AnscXmlDomNodeGetNextChild(hNode, (ANSC_HANDLE)pKid);
        }
    }
}
Exemple #6
0
/**********************************************************************

    prototype:

        BOOL
        CcspCrLoadDeviceProfile
            (
                ANSC_HANDLE                                 hCcspCr
            );

    description:

        This function is called to load device profile for CR.

    argument:   ANSC_HANDLE                                 hCcspCr
                the handle of CCSP CR component;

    return:     Succeeded or not;

**********************************************************************/
BOOL
CcspCrLoadDeviceProfile
    (
        ANSC_HANDLE                                 hCcspCr
    )
{
    PCCSP_CR_MANAGER_OBJECT         pMyObject          = (PCCSP_CR_MANAGER_OBJECT)hCcspCr;
    PCCSP_NAMESPACE_MGR_OBJECT      pNSMgr             = (PCCSP_NAMESPACE_MGR_OBJECT)pMyObject->hCcspNamespaceMgr;
    ANSC_HANDLE                     pFileHandle        = NULL;
    char*                           pXMLContent        = NULL;
    char*                           pBackContent       = NULL;
    ULONG                           uXMLLength         = 0;
    PANSC_XML_DOM_NODE_OBJECT       pXmlNode           = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    PANSC_XML_DOM_NODE_OBJECT       pListNode          = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    PANSC_XML_DOM_NODE_OBJECT       pChildNode         = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    BOOL                            bStatus            = TRUE;
    ULONG                           uFileLength        = 0;
    ULONG                           uBufferSize        = 0;
    char                            buffer[512]        = { 0 };
    ULONG                           uLength            = 511;
    PCCSP_COMPONENT_INFO            pCompInfo          = (PCCSP_COMPONENT_INFO)NULL;

    /* load from the file */
    pFileHandle =
        AnscOpenFile
        (
            CCSP_CR_DEVICE_PROFILE_XML_FILE,
            ANSC_FILE_O_BINARY | ANSC_FILE_O_RDONLY,
            ANSC_FILE_S_IREAD
        );

    if( pFileHandle == NULL)
    {
        AnscTrace("Failed to load the file : '%s'\n", CCSP_CR_DEVICE_PROFILE_XML_FILE);

        return FALSE;
    }

    uFileLength = AnscGetFileSize( pFileHandle);

    pXMLContent = (char*)AnscAllocateMemory( uFileLength + 8);

    if( pXMLContent == NULL)
    {
        return FALSE;
    }

    uBufferSize = uFileLength + 8;

    if( AnscReadFile( pFileHandle, pXMLContent, &uBufferSize) != ANSC_STATUS_SUCCESS)
    {
        AnscFreeMemory(pXMLContent);

        return FALSE;
    }

    if( pFileHandle != NULL)
    {
        AnscCloseFile(pFileHandle);
    }

    /* parse the XML content */
    pBackContent = pXMLContent;

    pXmlNode = (PANSC_XML_DOM_NODE_OBJECT)
        AnscXmlDomParseString((ANSC_HANDLE)NULL, (PCHAR*)&pXMLContent, uBufferSize);

    AnscFreeMemory(pBackContent);

    if( pXmlNode == NULL)
    {
        AnscTraceWarning(("Failed to parse the CR profile file.\n"));

        return FALSE;
    }

    /* load CR name */
    pChildNode  = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetChildByName(pXmlNode, CCSP_CR_XML_NODE_crName); 

    if( pChildNode != NULL && pChildNode->GetDataString(pChildNode, NULL, buffer, &uLength) == ANSC_STATUS_SUCCESS && uLength > 0)
    {
        pMyObject->pCRName = AnscCloneString(buffer);
    }
    else
    {
        pMyObject->pCRName = AnscCloneString(CCSP_CR_NAME);
    }

    AnscTraceWarning(("CR Name: %s\n", pMyObject->pCRName));

#if 0
    /* load prefix name */
    /* Prefix will be set from command line instead */
    uLength            = 511;
    AnscZeroMemory(buffer, 512);

    pChildNode  = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetChildByName(pXmlNode, CCSP_CR_XML_NODE_prefix); 

    if( pChildNode != NULL && pChildNode->GetDataString(pChildNode, NULL, buffer, &uLength) == ANSC_STATUS_SUCCESS && uLength > 0)
    {
        pMyObject->pPrefix = AnscCloneString(buffer);

        pNSMgr->SubsysPrefix = AnscCloneString(buffer);

        AnscTraceWarning(("CR Prefix: %s\n", pMyObject->pPrefix));
    }
#endif

    /* get remote cr array */
    pListNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetChildByName(pXmlNode, CCSP_CR_XML_NODE_remote);

    if( pListNode != NULL)
    {
        pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		    AnscXmlDomNodeGetHeadChild(pListNode);

        while(pChildNode != NULL)
        {
            /* load remote cr information */
            if(!CcspCrLoadRemoteCRInfo(hCcspCr, (ANSC_HANDLE)pChildNode))
            {
                AnscTraceWarning(("Failed to load remote cr infor.\n"));
            }

            pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		        AnscXmlDomNodeGetNextChild(pListNode, pChildNode);
        }
    }


    /* get the component array node */
    pListNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetChildByName(pXmlNode, CCSP_CR_XML_NODE_components);

    if( pListNode != NULL)
    {
        pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		    AnscXmlDomNodeGetHeadChild(pListNode);

        while(pChildNode != NULL)
        {
            /* load component information */
            if(!CcspCrLoadComponentProfile(hCcspCr, (ANSC_HANDLE)pChildNode))
            {
                AnscTraceWarning(("Failed to load component profile.\n"));
            }

            pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		        AnscXmlDomNodeGetNextChild(pListNode, pChildNode);
        }
    }

    if( pXmlNode != NULL)
    {
        pXmlNode->Remove(pXmlNode);
    }


    /* create a Component Info for CR itself */
    pCompInfo = (PCCSP_COMPONENT_INFO)CcspCrAllocateMemory(sizeof(CCSP_COMPONENT_INFO));

    if( pCompInfo != NULL)
    {
        pCompInfo->pComponentName = CcspCrCloneString(CCSP_CR_NAME);
        pCompInfo->uVersion       = CCSP_CR_VERSION;
        pCompInfo->uStatus        = CCSP_Component_NotRegistered;

        AnscQueuePushEntry(&pMyObject->CompInfoQueue, &pCompInfo->Linkage);
    }

    return bStatus;
}
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
        CcspCwmpSoappoUtilGetParamAttribute
            (
                ANSC_HANDLE                 hXmlHandle,
                ANSC_HANDLE                 hAttrHandle
            );

    description:

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

    argument:
                ANSC_HANDLE                 hXmlHandle,
                The XML node;

                ANSC_HANDLE                 hAttrHandle
                The parameter attribute handle

    return:     the status of the operation.

**********************************************************************/
ANSC_STATUS
CcspCwmpSoappoUtilGetParamAttribute
    (
        ANSC_HANDLE                 hXmlHandle,
        ANSC_HANDLE                 hAttrHandle
    )
{
    PANSC_XML_DOM_NODE_OBJECT       pXmlNode     = (PANSC_XML_DOM_NODE_OBJECT)hXmlHandle;
    PANSC_XML_DOM_NODE_OBJECT       pListNode    = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    PANSC_XML_DOM_NODE_OBJECT       pChildNode   = (PANSC_XML_DOM_NODE_OBJECT)NULL;
    PCCSP_CWMP_SET_PARAM_ATTRIB     pParamAttr   = (PCCSP_CWMP_SET_PARAM_ATTRIB)hAttrHandle;
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    CHAR                            pValue[2048] = { 0 };
    PCHAR                           pBegin       = NULL;
    ULONG                           length       = 2048;
    ULONG                           uLeft        = 2048;

    /***************************************************************************
    * Argument     | Type         | Description                               *
    ***************************************************************************
    * Name         | string(256)  | This is the name of a Parameter.          *
    *-------------------------------------------------------------------------*
    * Notification | boolean      | notification update                      .*
    * Change       |              |     .                                     *
    *-------------------------------------------------------------------------*
    * Notification | int(0:2)     | notification value                       .*
    *-------------------------------------------------------------------------*
    * AccessList   | boolean      | change accesslist or not                 .*
    * Change       |              |     .                                     *
    *-------------------------------------------------------------------------*
    * AccesList    | string(64)[] | array of access list                     .*
    ***************************************************************************/

    /*
     * Get the name first;
     */
    pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetHeadChild(pXmlNode);

    if( pChildNode == NULL)
    {
        CcspTr069PaTraceError(("Invalid arguments for ParameterAttributeStruct.\n"));

        return ANSC_STATUS_FAILURE;
    }

    length = 256;

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

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

        return returnStatus;
    }

    pParamAttr->Name = CcspTr069PaCloneString(pValue);

    /*
     * Get the notification change flag
     */
    pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetNextChild(pXmlNode, pChildNode);

    if( pChildNode == NULL)
    {
        CcspTr069PaTraceError(("Invalid arguments for ParameterAttributeStruct.\n"));

        return ANSC_STATUS_FAILURE;
    }

    returnStatus =
    	AnscXmlDomNodeGetDataBoolean
            (
                pChildNode,
                NULL,
                &pParamAttr->bNotificationChange
            );

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

        return returnStatus;
    }

    /*
     * Get the notificateion value
     */
    pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetNextChild(pXmlNode, pChildNode);

    if( pChildNode == NULL)
    {
        CcspTr069PaTraceError(("Invalid arguments for ParameterAttributeStruct.\n"));

        return ANSC_STATUS_FAILURE;
    }

    returnStatus =
    	AnscXmlDomNodeGetDataUlong
            (
                pChildNode,
                NULL,
                &pParamAttr->Notification
            );

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

        return returnStatus;
    }

    /*
     * Get the accesslist change flag
     */
    pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetNextChild(pXmlNode, pChildNode);

    if( pChildNode == NULL)
    {
        CcspTr069PaTraceError(("Invalid arguments for ParameterAttributeStruct.\n"));

        return ANSC_STATUS_FAILURE;
    }

    returnStatus =
    	AnscXmlDomNodeGetDataBoolean
            (
                pChildNode,
                NULL,
                &pParamAttr->bAccessListChange
            );

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

        return returnStatus;
    }

    /*
     * Get the accesslist
     */
    pParamAttr->AccessList = NULL;

    pListNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetNextChild(pXmlNode, pChildNode);

    if( pListNode == NULL)
    {
        return ANSC_STATUS_SUCCESS;
    }

    length                 = 2048;
    AnscZeroMemory(pValue, length);

    pBegin                 = pValue;

    pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
		AnscXmlDomNodeGetHeadChild(pListNode);

    while( pChildNode != NULL)
    {
        if( pBegin != pValue)
        {
            AnscCopyMemory(pBegin, CCSP_CWMP_COMMA, AnscSizeOfString(CCSP_CWMP_COMMA));
            pBegin += AnscSizeOfString(CCSP_CWMP_COMMA);
            uLeft  -= AnscSizeOfString(CCSP_CWMP_COMMA);
            length  = uLeft;
        }

        returnStatus =
        	AnscXmlDomNodeGetDataString
                (
                    pChildNode,
                    NULL,
                    pBegin,
                    &length
                );

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

            return returnStatus;
        }

        pBegin += length;
        uLeft  -= length;
        length  = uLeft;


        pChildNode = (PANSC_XML_DOM_NODE_OBJECT)
			AnscXmlDomNodeGetNextChild(pListNode, pChildNode);
    }

    if( pBegin != pValue)
    {
        pParamAttr->AccessList = CcspTr069PaCloneString(pValue);
    }

    return returnStatus;
}