ANSC_STATUS
HttpPsoVer2DelAllTros
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_PSO_VER2_OBJECT           pMyObject      = (PHTTP_PSO_VER2_OBJECT      )hThisObject;
    PHTTP_ADVANCED_PROXY_OBJECT     pAdvancedProxy = (PHTTP_ADVANCED_PROXY_OBJECT)pMyObject->hOwnerContext;
    PHTTP_WAM_INTERFACE             pWamIf         = (PHTTP_WAM_INTERFACE        )pMyObject->hWamIf;
    PHTTP_TRANS_RECORD_OBJECT       pTransRecord   = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry    = NULL;
    PANSC_BROKER_SOCKET_TCP_OBJECT  pServerSocket  = NULL;

    AnscAcquireLock(&pMyObject->TroSListLock);

    pSLinkEntry = AnscSListPopEntry(&pMyObject->TroSList);

    while ( pSLinkEntry )
    {
        pTransRecord = ACCESS_HTTP_TRANS_RECORD_OBJECT(pSLinkEntry);
        pSLinkEntry  = AnscSListPopEntry(&pMyObject->TroSList);

        returnStatus =
            pWamIf->Close
                (
                    pWamIf->hOwnerContext,
                    (ANSC_HANDLE)pTransRecord
                );

        pTransRecord->AcquireAccess((ANSC_HANDLE)pTransRecord);

        pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)pTransRecord->GetServerSocket((ANSC_HANDLE)pTransRecord);

        if ( pServerSocket )
        {
            pServerSocket->SetClientContext((ANSC_HANDLE)pServerSocket, (ANSC_HANDLE)NULL        );
            pServerSocket->ToClean         ((ANSC_HANDLE)pServerSocket, TRUE, HTTP_APO_SOCKET_TTC);
        }

        pTransRecord->ReleaseAccess((ANSC_HANDLE)pTransRecord);
        pTransRecord->Close        ((ANSC_HANDLE)pTransRecord);
        pTransRecord->Return       ((ANSC_HANDLE)pTransRecord);
    }

    AnscReleaseLock(&pMyObject->TroSListLock);

    return  ANSC_STATUS_SUCCESS;
}
ANSC_HANDLE
HttpPsoVer2AddNewTro
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_PSO_VER2_OBJECT           pMyObject      = (PHTTP_PSO_VER2_OBJECT         )hThisObject;
    PHTTP_ADVANCED_PROXY_OBJECT     pAdvancedProxy = (PHTTP_ADVANCED_PROXY_OBJECT   )pMyObject->hOwnerContext;
    PHTTP_WAM_INTERFACE             pWamIf         = (PHTTP_WAM_INTERFACE           )pMyObject->hWamIf;
    PHTTP_SBC_INTERFACE             pSbcIf         = (PHTTP_SBC_INTERFACE           )pMyObject->hSbcIf;
    PHTTP_CBC_INTERFACE             pCbcIf         = (PHTTP_CBC_INTERFACE           )pMyObject->hCbcIf;
    PHTTP_PBC_INTERFACE             pPbcIf         = (PHTTP_PBC_INTERFACE           )pMyObject->hPbcIf;
    PHTTP_HFP_INTERFACE             pHfpIf         = (PHTTP_HFP_INTERFACE           )pMyObject->hHfpIf;
    PANSC_DAEMON_SOCKET_TCP_OBJECT  pClientSocket  = (PANSC_DAEMON_SOCKET_TCP_OBJECT)pMyObject->hClientSocket;
    PHTTP_TRANS_RECORD_OBJECT       pTransRecord   = NULL;

    pTransRecord = (PHTTP_TRANS_RECORD_OBJECT)pAdvancedProxy->AcquireTro((ANSC_HANDLE)pAdvancedProxy);

    if ( !pTransRecord )
    {
        return  (ANSC_HANDLE)NULL;
    }
    else
    {
        pTransRecord->SetWamIf       ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pWamIf            );
        pTransRecord->SetSbcIf       ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pSbcIf            );
        pTransRecord->SetCbcIf       ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pCbcIf            );
        pTransRecord->SetPbcIf       ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pPbcIf            );
        pTransRecord->SetHfpIf       ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pHfpIf            );
        pTransRecord->SetClientSocket((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pClientSocket     );
        pTransRecord->SetServerSocket((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)NULL              );
        pTransRecord->SetTransState  ((ANSC_HANDLE)pTransRecord, HTTP_TRO_STATE_CLIENT_CONNECTED);
        pTransRecord->Open           ((ANSC_HANDLE)pTransRecord);
    }

    AnscAcquireLock(&pMyObject->TroSListLock);

    AnscSListPushEntry(&pMyObject->TroSList, &pTransRecord->Linkage);

    pTransRecord->AcquireAccess((ANSC_HANDLE)pTransRecord);

    AnscReleaseLock(&pMyObject->TroSListLock);

    return  (ANSC_HANDLE)pTransRecord;
}
ANSC_HANDLE
HttpPsoVer2GetCurTro
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_PSO_VER2_OBJECT           pMyObject      = (PHTTP_PSO_VER2_OBJECT      )hThisObject;
    PHTTP_ADVANCED_PROXY_OBJECT     pAdvancedProxy = (PHTTP_ADVANCED_PROXY_OBJECT)pMyObject->hOwnerContext;
    PHTTP_WAM_INTERFACE             pWamIf         = (PHTTP_WAM_INTERFACE        )pMyObject->hWamIf;
    PHTTP_SBC_INTERFACE             pSbcIf         = (PHTTP_SBC_INTERFACE        )pMyObject->hSbcIf;
    PHTTP_CBC_INTERFACE             pCbcIf         = (PHTTP_CBC_INTERFACE        )pMyObject->hCbcIf;
    PHTTP_PBC_INTERFACE             pPbcIf         = (PHTTP_PBC_INTERFACE        )pMyObject->hPbcIf;
    PHTTP_HFP_INTERFACE             pHfpIf         = (PHTTP_HFP_INTERFACE        )pMyObject->hHfpIf;
    PHTTP_TRANS_RECORD_OBJECT       pTransRecord   = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry    = NULL;
    ULONG                           ulTroState     = HTTP_TRO_STATE_INITIALIZED;

    AnscAcquireLock(&pMyObject->TroSListLock);

    pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->TroSList);

    if ( pSLinkEntry )
    {
        pTransRecord = ACCESS_HTTP_TRANS_RECORD_OBJECT(pSLinkEntry);
        ulTroState   = pTransRecord->GetTransState((ANSC_HANDLE)pTransRecord);

        if ( (ulTroState != HTTP_TRO_STATE_ESTABLISHED) &&
             (ulTroState != HTTP_TRO_STATE_FINISHED   ) )
        {
            pTransRecord->AcquireAccess((ANSC_HANDLE)pTransRecord);

            AnscReleaseLock(&pMyObject->TroSListLock);

            return  (ANSC_HANDLE)pTransRecord;
        }
    }

    AnscReleaseLock(&pMyObject->TroSListLock);

    pTransRecord = (PHTTP_TRANS_RECORD_OBJECT)pMyObject->AddNewTro((ANSC_HANDLE)pMyObject);

    return  (ANSC_HANDLE)pTransRecord;
}
ANSC_HANDLE
HttpPsoVer2PopTroBySocket
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hSocket
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_PSO_VER2_OBJECT           pMyObject      = (PHTTP_PSO_VER2_OBJECT      )hThisObject;
    PHTTP_ADVANCED_PROXY_OBJECT     pAdvancedProxy = (PHTTP_ADVANCED_PROXY_OBJECT)pMyObject->hOwnerContext;
    PHTTP_TRANS_RECORD_OBJECT       pTransRecord   = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry    = NULL;

    AnscAcquireLock(&pMyObject->TroSListLock);

    pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->TroSList);

    while ( pSLinkEntry )
    {
        pTransRecord = ACCESS_HTTP_TRANS_RECORD_OBJECT(pSLinkEntry);
        pSLinkEntry  = AnscSListGetNextEntry(pSLinkEntry);

        if ( pTransRecord->hServerSocket == hSocket )
        {
            AnscSListPopEntryByLink(&pMyObject->TroSList, &pTransRecord->Linkage);

            pTransRecord->AcquireAccess((ANSC_HANDLE)pTransRecord);

            AnscReleaseLock(&pMyObject->TroSListLock);

            return  (ANSC_HANDLE)pTransRecord;
        }
    }

    AnscReleaseLock(&pMyObject->TroSListLock);

    return  (ANSC_HANDLE)NULL;
}
ANSC_STATUS
HttpTroResumeTransaction
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hReserved,
        ULONG                       ulSbcPmode
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_TRANS_RECORD_OBJECT       pMyObject      = (PHTTP_TRANS_RECORD_OBJECT     )hThisObject;
    PHTTP_ADVANCED_PROXY_OBJECT     pAdvancedProxy = (PHTTP_ADVANCED_PROXY_OBJECT   )pMyObject->hOwnerContext;
    PHTTP_ADVANCED_PROXY_PROPERTY   pSpoProperty   = (PHTTP_ADVANCED_PROXY_PROPERTY )&pAdvancedProxy->Property;
    PHTTP_WAM_INTERFACE             pWamIf         = (PHTTP_WAM_INTERFACE           )pMyObject->hWamIf;
    PANSC_DAEMON_SOCKET_TCP_OBJECT  pClientSocket  = (PANSC_DAEMON_SOCKET_TCP_OBJECT)pMyObject->hClientSocket;
    PANSC_BROKER_SOCKET_TCP_OBJECT  pServerSocket  = (PANSC_BROKER_SOCKET_TCP_OBJECT)pMyObject->hServerSocket;
    PHTTP_BMO_REQ_OBJECT            pBmoReq        = (PHTTP_BMO_REQ_OBJECT          )pMyObject->hBmoReq;

    if ( pMyObject->SbcPmode != HTTP_SBC_PMODE_QUEUE )
    {
        return  ANSC_STATUS_UNAPPLICABLE;
    }
    else if ( (ulSbcPmode != HTTP_SBC_PMODE_RELAY1) &&
              (ulSbcPmode != HTTP_SBC_PMODE_RELAY2) &&
              (ulSbcPmode != HTTP_SBC_PMODE_STORE ) )
    {
        return  ANSC_STATUS_UNAPPLICABLE;
    }

    pMyObject->AcquireAccess((ANSC_HANDLE)pMyObject);

    if ( !pServerSocket )
    {
        returnStatus =
            pMyObject->SetUpConnection
                (
                    (ANSC_HANDLE)pMyObject,
                    (ANSC_HANDLE)NULL
                );
    }

    if ( returnStatus != ANSC_STATUS_SUCCESS )
    {
        pMyObject->ReleaseAccess((ANSC_HANDLE)pMyObject);

        return  returnStatus;
    }
    else
    {
        pMyObject->SbcPmode = ulSbcPmode;
        returnStatus        =
            pMyObject->SendToServer
                (
                    (ANSC_HANDLE)pMyObject,
                    (ANSC_HANDLE)pBmoReq,
                    HTTP_TRO_SFLAG_HEADERS | HTTP_TRO_SFLAG_BODY
                );
    }

    if ( (ulSbcPmode == HTTP_SBC_PMODE_RELAY1) ||
         (ulSbcPmode == HTTP_SBC_PMODE_RELAY2) )
    {
        pBmoReq->SetMboMode((ANSC_HANDLE)pBmoReq, HTTP_MBO_MODE_RELAY);
    }
    else
    {
        pBmoReq->SetMboMode((ANSC_HANDLE)pBmoReq, HTTP_MBO_MODE_STORE);
    }

    pMyObject->ReleaseAccess((ANSC_HANDLE)pMyObject);

    return  returnStatus;
}