ANSC_STATUS
DslhObjroDelAllObjRecords
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PDSLH_OBJ_RECORD_OBJECT         pMyObject       = (PDSLH_OBJ_RECORD_OBJECT)hThisObject;
    PDSLH_OBJ_ENTITY_OBJECT         pObjEntity      = (PDSLH_OBJ_ENTITY_OBJECT)pMyObject->hDslhObjEntity;
    PDSLH_OBJ_RECORD_OBJECT         pChildObjRecord = (PDSLH_OBJ_RECORD_OBJECT)NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry     = (PSINGLE_LINK_ENTRY     )NULL;

    pSLinkEntry = AnscQueuePopEntry(&pMyObject->ObjroQueue);

    while ( pSLinkEntry )
    {
        pChildObjRecord = ACCESS_DSLH_OBJ_RECORD_OBJECT(pSLinkEntry);
        pSLinkEntry     = AnscQueuePopEntry(&pMyObject->ObjroQueue);

        pChildObjRecord->Destroy((ANSC_HANDLE)pChildObjRecord);
        pChildObjRecord->Reset  ((ANSC_HANDLE)pChildObjRecord);
        pChildObjRecord->Remove ((ANSC_HANDLE)pChildObjRecord);
    }

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
DslhWmpdoReset
(
    ANSC_HANDLE                 hThisObject
)
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PDSLH_WMP_DATABASE_OBJECT       pMyObject      = (PDSLH_WMP_DATABASE_OBJECT  )hThisObject;
    PDSLH_WMP_DATABASE_PROPERTY     pProperty      = (PDSLH_WMP_DATABASE_PROPERTY)&pMyObject->Property;
    PDSLH_OBJ_RECORD_OBJECT         pRootObjRecord = (PDSLH_OBJ_RECORD_OBJECT    )pMyObject->hRootObjRecord;
    PDSLH_OBJ_ENTITY_OBJECT         pRootObjEntity = (PDSLH_OBJ_ENTITY_OBJECT    )pMyObject->hRootObjEntity;
    PDSLH_WMPDO_MONITOR_PARAM       pMonitorParam  = (PDSLH_WMPDO_MONITOR_PARAM  )NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry    = (PSINGLE_LINK_ENTRY         )NULL;

    pMyObject->ResetObjVarArray(hThisObject);

    if ( pMyObject->LockedEntity )
    {
        AnscFreeMemory(pMyObject->LockedEntity);

        pMyObject->LockedEntity = NULL;
    }

    if ( pMyObject->pRootObjName)
    {
        AnscFreeMemory(pMyObject->pRootObjName);

        pMyObject->pRootObjName = NULL;
    }

    if ( pRootObjRecord )
    {
        pRootObjRecord->Remove((ANSC_HANDLE)pRootObjRecord);

        pMyObject->hRootObjRecord = (ANSC_HANDLE)NULL;
    }

    if ( pRootObjEntity )
    {
        pRootObjEntity->Remove((ANSC_HANDLE)pRootObjEntity);

        pMyObject->hRootObjEntity = (ANSC_HANDLE)NULL;
    }

    AnscAcquireLock(&pMyObject->MpoQueueLock);

    pSLinkEntry = AnscQueuePopEntry(&pMyObject->MpoQueue);

    while ( pSLinkEntry )
    {
        pMonitorParam = ACCESS_DSLH_WMPDO_MONITOR_PARAM(pSLinkEntry);
        pSLinkEntry   = AnscQueuePopEntry(&pMyObject->MpoQueue);

        DslhWmpdoFreeMonitorParam(pMonitorParam);
    }

    AnscReleaseLock(&pMyObject->MpoQueueLock);

    return  ANSC_STATUS_SUCCESS;
}
SLAP_VARIABLE*
DslhObjroRvqGetParamValue
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pParamName
    )
{
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PDSLH_OBJ_RECORD_OBJECT         pMyObject       = (PDSLH_OBJ_RECORD_OBJECT)hThisObject;
    PDSLH_OBJ_ENTITY_OBJECT         pObjEntity      = (PDSLH_OBJ_ENTITY_OBJECT)pMyObject->hDslhObjEntity;
    PDSLH_VAR_RECORD_OBJECT         pChildVarRecord = (PDSLH_VAR_RECORD_OBJECT)NULL;

    pChildVarRecord =
        (PDSLH_VAR_RECORD_OBJECT)pMyObject->GetVarRecord
            (
                (ANSC_HANDLE)pMyObject,
                pParamName
            );

    if ( !pChildVarRecord )
    {
        return  NULL;
    }

    return  pChildVarRecord->TempParamValueTrans? pChildVarRecord->TempParamValueTrans : pChildVarRecord->TempParamValue;
}
ANSC_STATUS
DslhObjroRvqClearParamUpdated
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pParamName
    )
{
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PDSLH_OBJ_RECORD_OBJECT         pMyObject       = (PDSLH_OBJ_RECORD_OBJECT)hThisObject;
    PDSLH_OBJ_ENTITY_OBJECT         pObjEntity      = (PDSLH_OBJ_ENTITY_OBJECT)pMyObject->hDslhObjEntity;
    PDSLH_VAR_RECORD_OBJECT         pChildVarRecord = (PDSLH_VAR_RECORD_OBJECT)NULL;

    pChildVarRecord =
        (PDSLH_VAR_RECORD_OBJECT)pMyObject->GetVarRecord
            (
                (ANSC_HANDLE)pMyObject,
                pParamName
            );

    if ( !pChildVarRecord )
    {
        return  ANSC_STATUS_FAILURE;
    }

    pChildVarRecord->bAlreadySet = TRUE;

    return  ANSC_STATUS_SUCCESS;
}
BOOL
DslhObjroRvqIsParamUpdated
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pParamName
    )
{
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PDSLH_OBJ_RECORD_OBJECT         pMyObject       = (PDSLH_OBJ_RECORD_OBJECT)hThisObject;
    PDSLH_OBJ_ENTITY_OBJECT         pObjEntity      = (PDSLH_OBJ_ENTITY_OBJECT)pMyObject->hDslhObjEntity;
    PDSLH_VAR_RECORD_OBJECT         pChildVarRecord = (PDSLH_VAR_RECORD_OBJECT)NULL;

    pChildVarRecord =
        (PDSLH_VAR_RECORD_OBJECT)pMyObject->GetVarRecord
            (
                (ANSC_HANDLE)pMyObject,
                pParamName
            );

    if ( !pChildVarRecord )
    {
        return  FALSE;
    }
    else if ( !pChildVarRecord->TempParamValue )
    {
        return  FALSE;
    }
    else if ( pChildVarRecord->bAlreadySet )
    {
        return FALSE;
    }

    return  TRUE;
}
ANSC_STATUS
DslhObjroAddObjRecord
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hObjRecord
    )
{
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PDSLH_OBJ_RECORD_OBJECT         pMyObject       = (PDSLH_OBJ_RECORD_OBJECT)hThisObject;
    PDSLH_OBJ_ENTITY_OBJECT         pObjEntity      = (PDSLH_OBJ_ENTITY_OBJECT)pMyObject->hDslhObjEntity;
    PDSLH_OBJ_RECORD_OBJECT         pChildObjRecord = (PDSLH_OBJ_RECORD_OBJECT)hObjRecord;
    char                            next_ins_name[16];

    AnscQueuePushEntry(&pMyObject->ObjroQueue, &pChildObjRecord->Linkage);

    if ( pObjEntity->ObjDescr && (pObjEntity->ObjDescr->Type == DSLH_CWMP_OBJECT_TYPE_table) )
    {
        pMyObject->NextInstanceNumber = (ULONG)_ansc_atoi(pChildObjRecord->LastName);

        do
        {
            pMyObject->NextInstanceNumber++;

            if ( pMyObject->NextInstanceNumber == 0 )
            {
                pMyObject->NextInstanceNumber = 1;
            }

            AnscZeroMemory(next_ins_name, 16);
            _ansc_itoa(pMyObject->NextInstanceNumber, next_ins_name, 10);

            pChildObjRecord =
                (PDSLH_OBJ_RECORD_OBJECT)pMyObject->GetObjRecord
                    (
                        (ANSC_HANDLE)pMyObject,
                        next_ins_name
                    );
        }
        while ( pChildObjRecord );
    }

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
DslhWmpdoCancel
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus       = ANSC_STATUS_SUCCESS;
    PDSLH_WMP_DATABASE_OBJECT       pMyObject          = (PDSLH_WMP_DATABASE_OBJECT    )hThisObject;
    PDSLH_WMP_DATABASE_PROPERTY     pProperty          = (PDSLH_WMP_DATABASE_PROPERTY  )&pMyObject->Property;
    PDSLH_CPE_CONTROLLER_OBJECT     pDslhCpeController = (PDSLH_CPE_CONTROLLER_OBJECT  )pMyObject->hDslhCpeController;
    PDSLH_OBJ_RECORD_OBJECT         pRootObjRecord     = (PDSLH_OBJ_RECORD_OBJECT      )pMyObject->hRootObjRecord;
    PDSLH_OBJ_ENTITY_OBJECT         pRootObjEntity     = (PDSLH_OBJ_ENTITY_OBJECT      )pMyObject->hRootObjEntity;
    PANSC_TIMER_DESCRIPTOR_OBJECT   pMonitorTimerObj   = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hMonitorTimerObj;

    if ( !pMyObject->bActive )
    {
        return  ANSC_STATUS_SUCCESS;
    }
    else
    {
        pMyObject->bActive = FALSE;
    }

    pMonitorTimerObj->Stop((ANSC_HANDLE)pMonitorTimerObj);

    if ( pRootObjRecord )
    {
        pRootObjRecord->Remove((ANSC_HANDLE)pRootObjRecord);

        pMyObject->hRootObjRecord = (ANSC_HANDLE)NULL;
    }

    if ( pRootObjEntity )
    {
        pRootObjEntity->Remove((ANSC_HANDLE)pRootObjEntity);

        pMyObject->hRootObjEntity = (ANSC_HANDLE)NULL;
    }

    returnStatus = pMyObject->CloseEnv((ANSC_HANDLE)pMyObject);

    return  returnStatus;
}
ANSC_HANDLE
DslhObjroGetObjRecord2
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hTokenChain
    )
{
    ANSC_STATUS                     returnStatus        = ANSC_STATUS_SUCCESS;
    PDSLH_OBJ_RECORD_OBJECT         pMyObject           = (PDSLH_OBJ_RECORD_OBJECT    )hThisObject;
    PANSC_TOKEN_CHAIN               pObjNameTokens      = (PANSC_TOKEN_CHAIN          )hTokenChain;
    PANSC_STRING_TOKEN              pObjNameToken       = (PANSC_STRING_TOKEN         )NULL;
    PDSLH_OBJ_RECORD_OBJECT         pChildObjRecord     = (PDSLH_OBJ_RECORD_OBJECT    )NULL;
    PDSLH_OBJ_ENTITY_OBJECT         pChildObjEntity     = (PDSLH_OBJ_ENTITY_OBJECT    )NULL;
    PDSLH_OBJ_CONTROLLER_OBJECT     pChildObjController = (PDSLH_OBJ_CONTROLLER_OBJECT)NULL;
    PDSLH_OBJCO_TABLE_OBJECT        pChildObjcoTable    = (PDSLH_OBJCO_TABLE_OBJECT   )NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry         = (PSINGLE_LINK_ENTRY         )NULL;
    BOOL                            bObjRecordFound     = FALSE;

    if ( !pObjNameTokens )
    {
        return  (ANSC_HANDLE)NULL;
    }
    else
    {
        pObjNameToken = AnscTcUnlinkToken(pObjNameTokens);
    }

    if ( !pObjNameToken )
    {
        return  (ANSC_HANDLE)NULL;
    }

    pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->ObjroQueue);

    while ( pObjNameToken->Name && pSLinkEntry )
    {
        pChildObjRecord = ACCESS_DSLH_OBJ_RECORD_OBJECT(pSLinkEntry);
        pSLinkEntry     = AnscQueueGetNextEntry(pSLinkEntry);

        if ( pChildObjRecord->LastName && AnscEqualString
                (
                    pChildObjRecord->LastName,
                    pObjNameToken->Name,
                    TRUE
                ) )
        {
            bObjRecordFound = TRUE;

            break;
        }
    }

    AnscFreeMemory(pObjNameToken);

    if ( bObjRecordFound )
    {
        pChildObjEntity     = (PDSLH_OBJ_ENTITY_OBJECT    )pChildObjRecord->hDslhObjEntity;
        pChildObjController = (PDSLH_OBJ_CONTROLLER_OBJECT)pChildObjRecord->hDslhObjController;
        pChildObjcoTable    = (PDSLH_OBJCO_TABLE_OBJECT   )pChildObjController;

        if ( AnscTcGetTokenCount(pObjNameTokens) == 0 )
        {
            if ( pChildObjEntity->ObjDescr->bDynamic && pChildObjEntity->ObjDescr->Type == DSLH_CWMP_OBJECT_TYPE_table)
            {
                if ( pChildObjcoTable->IsUpdated((ANSC_HANDLE)pChildObjcoTable) )
                {
					AnscTrace("Delete and Repopulate the record in '%s'\n", pChildObjEntity->LastName);

                    pChildObjRecord->DelAllObjRecords  ((ANSC_HANDLE)pChildObjRecord);

                    pChildObjcoTable->Lock(pChildObjcoTable);
                    pChildObjRecord->PopulateObjRecords((ANSC_HANDLE)pChildObjRecord);
                    pChildObjRecord->PopulateVarRecords((ANSC_HANDLE)pChildObjRecord);
                    pChildObjcoTable->Unlock(pChildObjcoTable);

   				    AnscTrace("End of the repopulation in '%s'\n", pChildObjEntity->LastName);

                }
            }

            return  (ANSC_HANDLE)pChildObjRecord;
        }
        else
        {
            /*
             * If this obj record is a dynamic table object, we need to check whether the table
             * content has been updated. If it has, we need to remove all child objects and para-
             * meters under this object and re-populate them.
             */
            if ( pChildObjEntity->ObjDescr->bDynamic && pChildObjEntity->ObjDescr->Type == DSLH_CWMP_OBJECT_TYPE_table)
            {
                if ( pChildObjcoTable->IsUpdated((ANSC_HANDLE)pChildObjcoTable) )
                {
					AnscTrace("Delete and Repopulate the record in '%s'\n", pChildObjEntity->LastName);

                    pChildObjRecord->DelAllObjRecords  ((ANSC_HANDLE)pChildObjRecord);

                    pChildObjcoTable->Lock(pChildObjcoTable);
                    pChildObjRecord->PopulateObjRecords((ANSC_HANDLE)pChildObjRecord);
                    pChildObjRecord->PopulateVarRecords((ANSC_HANDLE)pChildObjRecord);
                    pChildObjcoTable->Unlock(pChildObjcoTable);

                    AnscTrace("End of the repopulation in '%s'\n", pChildObjEntity->LastName);

                }
            }

            return  pChildObjRecord->GetObjRecord2
                        (
                            (ANSC_HANDLE)pChildObjRecord,
                            (ANSC_HANDLE)pObjNameTokens
                        );
        }
    }

    return  (ANSC_HANDLE)NULL;
}
ANSC_STATUS
DslhWmpdoEngage
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus       = ANSC_STATUS_SUCCESS;
    PDSLH_WMP_DATABASE_OBJECT       pMyObject          = (PDSLH_WMP_DATABASE_OBJECT    )hThisObject;
    PDSLH_WMP_DATABASE_PROPERTY     pProperty          = (PDSLH_WMP_DATABASE_PROPERTY  )&pMyObject->Property;
    PDSLH_CPE_CONTROLLER_OBJECT     pDslhCpeController = (PDSLH_CPE_CONTROLLER_OBJECT  )pMyObject->hDslhCpeController;
    PDSLH_OBJ_RECORD_OBJECT         pRootObjRecord     = (PDSLH_OBJ_RECORD_OBJECT      )pMyObject->hRootObjRecord;
    PDSLH_OBJ_ENTITY_OBJECT         pRootObjEntity     = (PDSLH_OBJ_ENTITY_OBJECT      )pMyObject->hRootObjEntity;
    PANSC_TIMER_DESCRIPTOR_OBJECT   pMonitorTimerObj   = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hMonitorTimerObj;

    if ( pMyObject->bActive )
    {
        return  ANSC_STATUS_SUCCESS;
    }
    else if ( !pDslhCpeController )
    {
        return  ANSC_STATUS_NOT_READY;
    }

    if ( !pRootObjEntity )
    {
        pRootObjEntity =
            (PDSLH_OBJ_ENTITY_OBJECT)DslhCreateObjEntity
                (
                    pMyObject->hContainerContext,
                    (ANSC_HANDLE)pMyObject,
                    (ANSC_HANDLE)NULL
                );

        if  ( !pRootObjEntity )
        {
            return  ANSC_STATUS_RESOURCES;
        }
        else
        {
            pMyObject->hRootObjEntity = (ANSC_HANDLE)pRootObjEntity;
        }
    }

    if ( !pRootObjRecord )
    {
        pRootObjRecord =
            (PDSLH_OBJ_RECORD_OBJECT)DslhCreateObjRecord
                (
                    pMyObject->hContainerContext,
                    (ANSC_HANDLE)pMyObject,
                    (ANSC_HANDLE)NULL
                );

        if  ( !pRootObjRecord )
        {
            return  ANSC_STATUS_RESOURCES;
        }
        else
        {
            pMyObject->hRootObjRecord = (ANSC_HANDLE)pRootObjRecord;
        }

        pRootObjRecord->hParentObjRecord    = NULL;
        pRootObjRecord->hDslhCpeController  = (ANSC_HANDLE)pDslhCpeController;
        pRootObjRecord->hDslhObjController  = NULL;
        pRootObjRecord->SetDslhObjEntity    ((ANSC_HANDLE)pRootObjRecord, (ANSC_HANDLE)pRootObjEntity    );
    }

    returnStatus = pMyObject->SetupEnv((ANSC_HANDLE)pMyObject);

    if ( returnStatus != ANSC_STATUS_SUCCESS )
    {
        return  returnStatus;
    }

    pMyObject->bActive = TRUE;

    return  returnStatus;
}