BOOL
SlapVhoEqualParamLists
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 list1,
        ANSC_HANDLE                 list2,
        BOOL                        b_syntax_only
    )
{
    PSLAP_PARAMETER_LIST            param_list1 = (PSLAP_PARAMETER_LIST)list1;
    PSLAP_PARAMETER_LIST            param_list2 = (PSLAP_PARAMETER_LIST)list2;
    BOOL                            b_equal_pl  = TRUE;
    ULONG                           ii          = 0;
    BOOL                            b_same_var  = FALSE;
    SLAP_VARIABLE*                  slap_var1   = NULL;
    SLAP_VARIABLE*                  slap_var2   = NULL;

    do
    {
        if ( param_list1->ParamCount != param_list2->ParamCount )
        {
            b_equal_pl = FALSE;

            break;
        }

        for ( ii = 0; ii < param_list1->ParamCount; ii++ )
        {
            slap_var1 = &param_list1->ParamArray[ii];
            slap_var2 = &param_list2->ParamArray[ii];

            if ( b_syntax_only )
            {
                b_same_var = (slap_var1->Syntax == slap_var2->Syntax);
            }
            else
            {
                SlapEqualVariables(slap_var1, slap_var2, b_same_var);
            }

            if ( !b_same_var )
            {
                b_equal_pl = FALSE;

                break;
            }
        }

        break;
    }
    while ( FALSE );

    return  b_equal_pl;
}
ANSC_STATUS
DslhWmpdoMonitorTimerInvoke
    (
        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_WMPDO_MONITOR_PARAM       pMonitorParam      = (PDSLH_WMPDO_MONITOR_PARAM  )NULL;
    PDSLH_VAR_RECORD_OBJECT         pDslhVarRecord     = (PDSLH_VAR_RECORD_OBJECT    )NULL;
    PDSLH_VAR_ENTITY_OBJECT         pDslhVarEntity     = (PDSLH_VAR_ENTITY_OBJECT    )NULL;
    PDSLH_CWMP_PARAM_DESCR          pParamDesp         = (PDSLH_CWMP_PARAM_DESCR     )NULL;
    PSLAP_VARIABLE                  pNewParamValue     = (PSLAP_VARIABLE             )NULL;
    BOOL                            bValueNotUpdated   = (BOOL                       )TRUE;
    char*                           pParamFullName     = (char*                      )NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry        = (PSINGLE_LINK_ENTRY         )NULL;
    BOOL                            bActiveNotify      = FALSE;
    int                             oldValue           = 0; /* Only for notification with threshold */
    int                             newValue           = 0; /* Only for notification with threshold */

    AnscAcquireLock(&pMyObject->MpoQueueLock);

    pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->MpoQueue);

    while ( pSLinkEntry )
    {
        pMonitorParam  = ACCESS_DSLH_WMPDO_MONITOR_PARAM(pSLinkEntry);
        pDslhVarRecord = (PDSLH_VAR_RECORD_OBJECT)pMonitorParam->hVarRecord;
        pSLinkEntry    = AnscQueueGetNextEntry(pSLinkEntry);

        /*
         * DO NOT synchronize the value if value-changing is in progress...
         */
        if ( pDslhVarRecord->TempParamValue )
        {
            continue;
        }

        /*
         * DO NOT synchronize the value if the active notification parameter is rate-regulated and
         * the last update was notified less than "NotificationLimit" seconds ago.
         */
        if ( (pDslhVarRecord->Notification      == DSLH_CWMP_NOTIFICATION_active) &&
             (pMonitorParam ->NotificationLimit >  0                            ) )
        {
            if ( (AnscGetTickInSeconds() - pMonitorParam->Timestamp) < pMonitorParam->NotificationLimit )
            {
                continue;
            }
        }

        if ( pMonitorParam->PreviousValue )
        {
            pNewParamValue   = pDslhVarRecord->GetValue((ANSC_HANDLE)pDslhVarRecord);
            bValueNotUpdated = TRUE;

            if ( !pNewParamValue )
            {
                continue;
            }
            else
            {
            	SlapEqualVariables(pMonitorParam->PreviousValue, pNewParamValue, bValueNotUpdated);
            }

            if ( !bValueNotUpdated )
            {
                /* Notificatoin with threshold check */
                pDslhVarEntity = (PDSLH_VAR_ENTITY_OBJECT)pDslhVarRecord->hDslhVarEntity;
                pParamDesp     = (PDSLH_CWMP_PARAM_DESCR )pDslhVarEntity->ParamDescr;
                
                if ( pParamDesp && pParamDesp->bThresholdEnabled == TRUE )
                {
                    oldValue  = pMonitorParam ->PreviousValue->Variant.varInt;
                    newValue  = pNewParamValue->Variant.varInt;
                    
                    if ( 
                           (oldValue < pParamDesp->NotifyThresholdMin && newValue < pParamDesp->NotifyThresholdMin) ||
                           (oldValue > pParamDesp->NotifyThresholdMax && newValue > pParamDesp->NotifyThresholdMax) ||
                           (oldValue >= pParamDesp->NotifyThresholdMin && oldValue <= pParamDesp->NotifyThresholdMax && newValue >= pParamDesp->NotifyThresholdMin && newValue <= pParamDesp->NotifyThresholdMax)
                       )
                    {
                        if ( pMonitorParam->PreviousValue )
                        {
                            SlapFreeVariable(pMonitorParam->PreviousValue);
                        }
                        
                        pMonitorParam->PreviousValue = pNewParamValue;
                        continue;
                    }
                }
                
                /* save the previous value as old */
                if( pDslhVarRecord->OldParamValue != NULL)
                {
                    SlapFreeVariable(pDslhVarRecord->OldParamValue);
                }

                pDslhVarRecord->OldParamValue = pMonitorParam->PreviousValue;
                /* SlapFreeVariable(pMonitorParam->PreviousValue); */

                pMonitorParam->PreviousValue = pNewParamValue;
                pParamFullName               = pDslhVarRecord->GetFullName((ANSC_HANDLE)pDslhVarRecord);

                if ( pParamFullName )
                {
                    bActiveNotify |= (pDslhVarRecord->Notification == DSLH_CWMP_NOTIFICATION_active);					 
                    pMonitorParam->Timestamp = AnscGetTickInSeconds();

                    pDslhVarRecord->NotifyValueChanged(pDslhVarRecord);

                    AnscTraceWarning(("DslhWmpdoMonitorTimerInvoke - value change detected on parameter <%s>.\n", pParamFullName));
					pDslhVarRecord->ReqSenderID = 0;
					pMonitorParam->PreviousValue->ReqSenderID = 0;
                    AnscFreeMemory(pParamFullName);
                }
            }
            else
            {
                SlapFreeVariable(pNewParamValue);
            }
        }
        else
        {
            pMonitorParam->PreviousValue = pDslhVarRecord->GetValue((ANSC_HANDLE)pDslhVarRecord);
        }
    }

    AnscReleaseLock(&pMyObject->MpoQueueLock);

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
SlapScoGalSetVariable
    (
        ANSC_HANDLE                 hThisObject,
        SLAP_PARAMETER_LIST*        param_list
    )
{
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PSLAP_SCO_GALLERY_OBJECT        pMyObject       = (PSLAP_SCO_GALLERY_OBJECT)hThisObject;
    PANSC_ATOM_TABLE_OBJECT         pAtoVariable    = (PANSC_ATOM_TABLE_OBJECT )pMyObject->hAtoVariable;
    PANSC_ATOM_DESCRIPTOR           pAtomDescriptor = (PANSC_ATOM_DESCRIPTOR   )NULL;
    PSLAP_VARIABLE                  pGalVariable    = (PSLAP_VARIABLE          )NULL;
    PSLAP_VARIABLE                  pTbsVariable    = (PSLAP_VARIABLE          )NULL;
    BOOL                            bSameVar        = FALSE;

    if ( !param_list || (param_list->ParamCount < 2) )
    {
        return  ANSC_STATUS_BAD_PARAMETER;
    }
    else if ( param_list->ParamArray[0].Syntax != SLAP_VAR_SYNTAX_string )
    {
        return  ANSC_STATUS_BAD_PARAMETER;
    }
    else if ( !param_list->ParamArray[0].Variant.varString )
    {
        return  ANSC_STATUS_BAD_PARAMETER;
    }
    else
    {
        pTbsVariable = &param_list->ParamArray[1];
    }

    pAtomDescriptor =
        (PANSC_ATOM_DESCRIPTOR)pAtoVariable->GetAtomByName
            (
                (ANSC_HANDLE)pAtoVariable,
                param_list->ParamArray[0].Variant.varString
            );

    if ( !pAtomDescriptor )
    {
        returnStatus =
            pMyObject->AddVariable
                (
                    (ANSC_HANDLE)pMyObject,
                    param_list
                );

        return  returnStatus;
    }
    else
    {
        pGalVariable = (PSLAP_VARIABLE)pAtomDescriptor->hContext;
    }

    if ( !pGalVariable )
    {
        pGalVariable = (PSLAP_VARIABLE)AnscAllocateMemory(sizeof(SLAP_VARIABLE));

        if ( !pGalVariable )
        {
            return  ANSC_STATUS_RESOURCES;
        }
        else
        {
            SlapInitVariable(pGalVariable);

            pAtomDescriptor->hContext = (ANSC_HANDLE)pGalVariable;
        }

        bSameVar = FALSE;
    }
    else
    {
        SlapEqualVariables(pGalVariable, pTbsVariable, bSameVar);
    }

    if ( bSameVar )
    {
        return  ANSC_STATUS_SUCCESS;
    }
    else
    {
        returnStatus =
            pMyObject->QuitGallery
                (
                    (ANSC_HANDLE)pMyObject,
                    pGalVariable
                );

        SlapCleanVariable(pGalVariable);
        SlapInitVariable (pGalVariable);
    }

    SlapCloneVariable(pTbsVariable, pGalVariable);

    returnStatus =
        pMyObject->JoinGallery
            (
                (ANSC_HANDLE)pMyObject,
                pGalVariable
            );

    return  returnStatus;
}