ANSC_HANDLE
AnscXmlDomNodeGetTailChild
    (
        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)
    {
        return NULL;
    }

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

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

    return  (ANSC_HANDLE)pChildNode;
}
ULONG
DslhObjroGetObjRecordCount
    (
        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;

    return  AnscQueueQueryDepth(&pMyObject->ObjroQueue);
}
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;
}
ULONG
DslhObjroGetVarRecordCount
    (
        ANSC_HANDLE                 hThisObject,
        BOOL                        bExcludeHidden
    )
{
    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;
    PDSLH_VAR_ENTITY_OBJECT         pChildVarEntity = (PDSLH_VAR_ENTITY_OBJECT)NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry     = (PSINGLE_LINK_ENTRY     )NULL;
    ULONG                           ulVarRecordCount = 0;

    if( bExcludeHidden )
    {
        pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->VarroTable);

        while ( pSLinkEntry )
        {
            pChildVarRecord = ACCESS_DSLH_VAR_RECORD_OBJECT(pSLinkEntry);
            pChildVarEntity = (PDSLH_VAR_ENTITY_OBJECT)pChildVarRecord->hDslhVarEntity;
            pSLinkEntry     = AnscQueueGetNextEntry(pSLinkEntry);

            if( pChildVarEntity->ParamDescr && !pChildVarEntity->ParamDescr->bInvisible)
            {
                ulVarRecordCount ++;
            }
        }

    }
    else
    {
        /* include all the parameters */
        ulVarRecordCount += AnscQueueQueryDepth(&pMyObject->VarroTable);
    }

    return  ulVarRecordCount;
}
ULONG
AnscLpccoGetPartyCount
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PANSC_LPC_CONNECTOR_OBJECT      pMyObject    = (PANSC_LPC_CONNECTOR_OBJECT)hThisObject;
    ULONG                           ulPartyCount = 0;
    ULONG                           i            = 0;

    AnscAcquireLock(&pMyObject->PartyTableLock);

    for ( i = 0; i < ANSC_LPCCO_PARTY_TABLE_SIZE; i++ )
    {
        ulPartyCount += AnscQueueQueryDepth(&pMyObject->PartyTable[i]);
    }

    AnscReleaseLock(&pMyObject->PartyTableLock);

    return  ulPartyCount;
}
ANSC_HANDLE
SlapOmoGetObjProxy2
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hTokenChain
    )
{
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PSLAP_OBJ_MAPPER_OBJECT         pMyObject       = (PSLAP_OBJ_MAPPER_OBJECT  )hThisObject;
    PSLAP_OBJ_MAPPER_PROPERTY       pProperty       = (PSLAP_OBJ_MAPPER_PROPERTY)&pMyObject->Property;
    PSLAP_OBJ_BROKER_OBJECT         pRootObjBroker  = (PSLAP_OBJ_BROKER_OBJECT  )pMyObject->hRootObjBroker;
    PSLAP_OBJ_BROKER_OBJECT         pThisObjBroker  = (PSLAP_OBJ_BROKER_OBJECT  )pRootObjBroker;
    PSLAP_OBJ_BROKER_OBJECT         pNextObjBroker  = (PSLAP_OBJ_BROKER_OBJECT  )NULL;
    PSLAP_OBJ_PROXY_OBJECT          pObjProxy       = (PSLAP_OBJ_PROXY_OBJECT   )pThisObjBroker->hSlapObjProxy;
    PANSC_TOKEN_CHAIN               pPathTokenChain = (PANSC_TOKEN_CHAIN        )hTokenChain;
    PANSC_STRING_TOKEN              pPathToken      = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry     = NULL;

    if ( AnscQueueQueryDepth(&pPathTokenChain->TokensQueue) == 0 )
    {
        pObjProxy = (PSLAP_OBJ_PROXY_OBJECT)NULL;
    }
    else
    {
        pSLinkEntry = AnscQueuePopEntry(&pPathTokenChain->TokensQueue);

        while ( pSLinkEntry && pThisObjBroker )
        {
            pPathToken     = ACCESS_ANSC_STRING_TOKEN(pSLinkEntry);
            pNextObjBroker =
                (PSLAP_OBJ_BROKER_OBJECT)pThisObjBroker->GetObjBroker
                    (
                        (ANSC_HANDLE)pThisObjBroker,
                        pPathToken->Name
                    );

            if ( pNextObjBroker )
            {
                if ( pNextObjBroker->hSlapObjProxy )
                {
                    pObjProxy = (PSLAP_OBJ_PROXY_OBJECT)pNextObjBroker->hSlapObjProxy;
                }

                AnscFreeMemory(pPathToken);
            }
            else
            {
                AnscQueuePushEntryAtFront(&pPathTokenChain->TokensQueue, &pPathToken->Linkage);

                break;
            }

            pThisObjBroker = pNextObjBroker;
            pSLinkEntry    = AnscQueuePopEntry(&pPathTokenChain->TokensQueue);
        }

        if ( AnscQueueQueryDepth(&pPathTokenChain->TokensQueue) > 0 )
        {
            pObjProxy = (PSLAP_OBJ_PROXY_OBJECT)NULL;
        }
    }

    return  (ANSC_HANDLE)pObjProxy;
}