ANSC_STATUS
HttpSpoDestroyPsoPool
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject    = (PHTTP_SIMPLE_PROXY_OBJECT  )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty    = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property;
    PHTTP_PROXY_SESSION_OBJECT      pSession     = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry  = NULL;

    AnscAcquireLock(&pMyObject->PsoSListLock);

    pSLinkEntry = AnscSListPopEntry(&pMyObject->PsoSList);

    while ( pSLinkEntry )
    {
        pSession    = ACCESS_HTTP_PROXY_SESSION_OBJECT(pSLinkEntry);
        pSLinkEntry = AnscSListPopEntry(&pMyObject->PsoSList);

        pSession->Remove((ANSC_HANDLE)pSession);
    }

    AnscReleaseLock(&pMyObject->PsoSListLock);

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
HttpSpoReleasePso
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hPso
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject    = (PHTTP_SIMPLE_PROXY_OBJECT  )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty    = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property;
    PHTTP_PROXY_SESSION_OBJECT      pSession     = (PHTTP_PROXY_SESSION_OBJECT )hPso;

    pSession->Reset((ANSC_HANDLE)pSession);

    if ( pMyObject->ProxyMode & HTTP_SPO_MODE_COMPACT )
    {
        pSession->Remove((ANSC_HANDLE)pSession);
    }
    else
    {
        AnscAcquireLock   (&pMyObject->PsoSListLock);
        AnscSListPushEntry(&pMyObject->PsoSList, &pSession->Linkage);
        AnscReleaseLock   (&pMyObject->PsoSListLock);
    }

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
HttpSpoManufacturePsoPool
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject    = (PHTTP_SIMPLE_PROXY_OBJECT  )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty    = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property;
    PHTTP_PROXY_SESSION_OBJECT      pSession     = NULL;
    ULONG                           i            = 0;

    if ( pMyObject->ProxyMode & HTTP_SPO_MODE_COMPACT )
    {
        return  ANSC_STATUS_SUCCESS;
    }

    for ( i = 0; i < HTTP_SPO_INITIAL_PSO_NUMBER; i++ )
    {
        pSession =
            (PHTTP_PROXY_SESSION_OBJECT)HttpCreateProxySession
                (
                    pMyObject->hContainerContext,
                    (ANSC_HANDLE)pMyObject,
                    (ANSC_HANDLE)NULL
                );

        if ( !pSession )
        {
            continue;
        }
        else
        {
            pSession->SetClientSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
            pSession->SetServerSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
            pSession->SetSbcContext  ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
            pSession->SetCbcContext  ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
        }

        AnscAcquireLock   (&pMyObject->PsoSListLock);
        AnscSListPushEntry(&pMyObject->PsoSList, &pSession->Linkage);
        AnscReleaseLock   (&pMyObject->PsoSListLock);
    }

    return  ANSC_STATUS_SUCCESS;
}
ANSC_HANDLE
HttpSpoAcquirePso
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject    = (PHTTP_SIMPLE_PROXY_OBJECT  )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty    = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property;
    PHTTP_PROXY_SESSION_OBJECT      pSession     = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry  = NULL;

    AnscAcquireLock(&pMyObject->PsoSListLock);
    pSLinkEntry = AnscSListPopEntry(&pMyObject->PsoSList);
    AnscReleaseLock(&pMyObject->PsoSListLock);

    if ( pSLinkEntry )
    {
        pSession = ACCESS_HTTP_PROXY_SESSION_OBJECT(pSLinkEntry);

        return  (ANSC_HANDLE)pSession;
    }

    pSession =
        (PHTTP_PROXY_SESSION_OBJECT)HttpCreateProxySession
            (
                pMyObject->hContainerContext,
                (ANSC_HANDLE)pMyObject,
                (ANSC_HANDLE)NULL
            );

    if ( !pSession )
    {
        return  (ANSC_HANDLE)NULL;
    }
    else
    {
        pSession->SetClientSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
        pSession->SetServerSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
        pSession->SetSbcContext  ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
        pSession->SetCbcContext  ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL);
    }

    return  (ANSC_HANDLE)pSession;
}
ANSC_STATUS
HttpSpoPrvwoNotify
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hSocket,
        ULONG                       ulEvent,
        ANSC_HANDLE                 hReserved
    )
{
    ANSC_STATUS                     returnStatus  = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject     = (PHTTP_SIMPLE_PROXY_OBJECT     )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty     = (PHTTP_SIMPLE_PROXY_PROPERTY   )&pMyObject->Property;
    PANSC_SIMPLE_PROXY_TCP_OBJECT   pSimpleProxy  = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy;
    PANSC_DAEMON_SOCKET_TCP_OBJECT  pClientSocket = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket;
    PANSC_BROKER_SOCKET_TCP_OBJECT  pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL;
    PANSC_BUFFER_DESCRIPTOR         pBufferDesp   = (PANSC_BUFFER_DESCRIPTOR       )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket);
    PHTTP_PROXY_SESSION_OBJECT      pSession      = NULL;

    AnscTrace
        (
            "Event = %d is indicated on client connection of %d.%d.%d.%d / TCP %d\n",
            ulEvent,
            pClientSocket->PeerAddress.Dot[0],
            pClientSocket->PeerAddress.Dot[1],
            pClientSocket->PeerAddress.Dot[2],
            pClientSocket->PeerAddress.Dot[3],
            pClientSocket->PeerPort
        );

    switch ( ulEvent )
    {
        case    ANSC_SPTOWO_EVENT_SOCKET_ERROR :

                pClientSocket->ToClean((ANSC_HANDLE)pClientSocket, TRUE, HTTP_SPO_SOCKET_TTC);

                break;

        case    ANSC_SPTOWO_EVENT_SOCKET_CLOSED :

                AnscAcquireLock(&pMyObject->SyncLock);

                pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket);

                if ( !pSession )
                {
                    AnscReleaseLock(&pMyObject->SyncLock);

                    pClientSocket->Finish((ANSC_HANDLE)pClientSocket);

                    break;
                }
                else
                {
                    pSession->AcquireAccess((ANSC_HANDLE)pSession);
                }

                AnscReleaseLock(&pMyObject->SyncLock);

                pBufferDesp->BlockSize += pClientSocket->RecvPacketSize;
                returnStatus            =
                    pClientSocket->SetBufferContext
                        (
                            (ANSC_HANDLE)pClientSocket,
                            NULL,
                            0,
                            (ANSC_HANDLE)NULL
                        );

                returnStatus            =
                    pSession->FinishedByClient
                        (
                            (ANSC_HANDLE)pSession,
                            AnscBdoGetBlock    (pBufferDesp),
                            AnscBdoGetBlockSize(pBufferDesp),
                            (ANSC_HANDLE)pBufferDesp
                        );

                pSession->ReleaseAccess((ANSC_HANDLE)pSession);

                pClientSocket->Finish((ANSC_HANDLE)pClientSocket);

                break;

        case    ANSC_SPTOWO_EVENT_RESOURCES :

                break;

        case    ANSC_SPTOWO_EVENT_TIME_OUT :

                break;

        default :

                break;
    }

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
HttpSpoPrvwoProcessSync
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hSocket,
        PVOID                       buffer,
        ULONG                       ulSize,
        ANSC_HANDLE                 hQueryContext
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject      = (PHTTP_SIMPLE_PROXY_OBJECT     )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty      = (PHTTP_SIMPLE_PROXY_PROPERTY   )&pMyObject->Property;
    PANSC_SIMPLE_PROXY_TCP_OBJECT   pSimpleProxy   = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy;
    PHTTP_SBC_INTERFACE             pSbcIf         = (PHTTP_SBC_INTERFACE           )pMyObject->hSbcIf;
    PANSC_DAEMON_SOCKET_TCP_OBJECT  pClientSocket  = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket;
    PANSC_BROKER_SOCKET_TCP_OBJECT  pServerSocket  = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL;
    PANSC_BUFFER_DESCRIPTOR         pBufferDesp    = (PANSC_BUFFER_DESCRIPTOR       )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket);
    PHTTP_PROXY_SESSION_OBJECT      pSession       = NULL;
    ULONG                           ulPsoQmode     = (ULONG)hQueryContext;
    BOOL                            bFinishSocket  = FALSE;

    AnscAcquireLock(&pMyObject->SyncLock);

    pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket);

    if ( !pSession )
    {
        AnscReleaseLock(&pMyObject->SyncLock);

        pClientSocket->Finish((ANSC_HANDLE)pClientSocket);

        return  ANSC_STATUS_SUCCESS;
    }
    else
    {
        pSession->AcquireAccess((ANSC_HANDLE)pSession);
    }

    AnscReleaseLock(&pMyObject->SyncLock);

    switch ( ulPsoQmode )
    {
        case    HTTP_PSO_QMODE_FORWARD :

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

                if ( !pServerSocket)
                {
                    bFinishSocket = TRUE;
                    returnStatus  = ANSC_STATUS_INTERNAL_ERROR;

                    break;
                }
                else
                {
                    returnStatus =
                        pServerSocket->Send
                            (
                                (ANSC_HANDLE)pServerSocket,
                                buffer,
                                ulSize,
                                (ANSC_HANDLE)NULL
                            );
                }

                pBufferDesp->BlockSize = 0;

                break;

        case    HTTP_PSO_QMODE_PROCESS :

                pClientSocket->SetBufferContext
                    (
                        (ANSC_HANDLE)pClientSocket,
                        NULL,
                        0,
                        (ANSC_HANDLE)NULL
                    );

                returnStatus =
                    pSession->RecvFromClient
                        (
                            (ANSC_HANDLE)pSession,
                            buffer,
                            ulSize,
                            (ANSC_HANDLE)pBufferDesp
                        );

                if ( pSession->GetSessionState((ANSC_HANDLE)pSession) == HTTP_PSO_STATE_FINISHED )
                {
                    bFinishSocket = TRUE;

                    break;
                }

                break;

        default :

                returnStatus = ANSC_STATUS_UNAPPLICABLE;

                break;
    }

    pSession->ReleaseAccess((ANSC_HANDLE)pSession);

    if ( bFinishSocket )
    {
        pClientSocket->Finish((ANSC_HANDLE)pClientSocket);
    }

    return  returnStatus;
}
ULONG
HttpSpoPrvwoQuery
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hSocket,
        PVOID                       buffer,
        ULONG                       ulSize,
        PANSC_HANDLE                phQueryContext
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject      = (PHTTP_SIMPLE_PROXY_OBJECT     )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty      = (PHTTP_SIMPLE_PROXY_PROPERTY   )&pMyObject->Property;
    PANSC_SIMPLE_PROXY_TCP_OBJECT   pSimpleProxy   = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy;
    PANSC_DAEMON_SOCKET_TCP_OBJECT  pClientSocket  = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket;
    PANSC_BROKER_SOCKET_TCP_OBJECT  pServerSocket  = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL;
    PANSC_BUFFER_DESCRIPTOR         pBufferDesp    = (PANSC_BUFFER_DESCRIPTOR       )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket);
    PHTTP_PROXY_SESSION_OBJECT      pSession       = NULL;
    ULONG                           ulSptoPmode    = ANSC_SPTOWO_PMODE_PROCESS_SYNC;
    ULONG                           ulPsoQmode     = HTTP_PSO_QMODE_PROCESS;

    AnscAcquireLock(&pMyObject->SyncLock);

    pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket);

    if ( !pSession )
    {
        AnscReleaseLock(&pMyObject->SyncLock);

        return  ANSC_SPTOWO_PMODE_FINISH;
    }
    else
    {
        pSession->AcquireAccess((ANSC_HANDLE)pSession);
    }

    AnscReleaseLock(&pMyObject->SyncLock);

    pBufferDesp->BlockSize += ulSize;
    ulPsoQmode              =
        pSession->QueryForClient
            (
                (ANSC_HANDLE)pSession,
                buffer,
                ulSize,
                (ANSC_HANDLE)pBufferDesp
            );

    switch ( ulPsoQmode )
    {
        case    HTTP_PSO_QMODE_COLLECT :

                pBufferDesp->BlockSize -= ulSize;
                ulSptoPmode             = ANSC_SPTOWO_PMODE_COLLECT;

                break;

        case    HTTP_PSO_QMODE_FORWARD :
        case    HTTP_PSO_QMODE_PROCESS :

                ulSptoPmode = ANSC_SPTOWO_PMODE_PROCESS_SYNC;

                break;

        default :

                ulSptoPmode = ANSC_SPTOWO_PMODE_FINISH;

                break;
    }

    *phQueryContext = (ANSC_HANDLE)ulPsoQmode;

    pSession->ReleaseAccess((ANSC_HANDLE)pSession);

    return  ulSptoPmode;
}
ANSC_STATUS
HttpSpoPrvwoRemove
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hSocket
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject      = (PHTTP_SIMPLE_PROXY_OBJECT     )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty      = (PHTTP_SIMPLE_PROXY_PROPERTY   )&pMyObject->Property;
    PANSC_SIMPLE_PROXY_TCP_OBJECT   pSimpleProxy   = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy;
    PHTTP_WAM_INTERFACE             pWamIf         = (PHTTP_WAM_INTERFACE           )pMyObject->hWamIf;
    PANSC_DAEMON_SOCKET_TCP_OBJECT  pClientSocket  = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket;
    PANSC_BROKER_SOCKET_TCP_OBJECT  pServerSocket  = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL;
    PANSC_BUFFER_DESCRIPTOR         pBufferDesp    = (PANSC_BUFFER_DESCRIPTOR       )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket);
    PHTTP_PROXY_SESSION_OBJECT      pSession       = NULL;

    AnscTrace
        (
            "PrvwoRemove removes the client connection of %d.%d.%d.%d / TCP %d\n",
            pClientSocket->PeerAddress.Dot[0],
            pClientSocket->PeerAddress.Dot[1],
            pClientSocket->PeerAddress.Dot[2],
            pClientSocket->PeerAddress.Dot[3],
            pClientSocket->PeerPort
        );

    AnscAcquireLock(&pMyObject->SyncLock);

    pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket);

    if ( pSession )
    {
        pSession->AcquireAccess((ANSC_HANDLE)pSession);

        pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)pSession->GetServerSocket((ANSC_HANDLE)pSession);
    }
    else
    {
        pServerSocket = NULL;
    }

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

    AnscReleaseLock(&pMyObject->SyncLock);

    /*
     * Just a couple regular clean-up tasks to do:
     *
     *      (1) dis-associate the proxy session object from the client socket
     *      (2) clean the foreign buffer associated with the client socket
     *      (3) dis-associate the proxy session object from the server socket
     *
     * Note that we CANNOT clean the foreign buffer associated with the server socket because the
     * access to that buffer is NOT synchornized between the prv_recv() and pub_recv routines. It
     * SHOULD be done in the pub_remove() function.
     */
    pClientSocket->SetClientContext((ANSC_HANDLE)pClientSocket,          (ANSC_HANDLE)NULL);
    pClientSocket->SetBufferContext((ANSC_HANDLE)pClientSocket, NULL, 0, (ANSC_HANDLE)NULL);

    if ( pBufferDesp )
    {
        AnscFreeBdo((ANSC_HANDLE)pBufferDesp);
    }

    if ( !pSession )
    {
        return  ANSC_STATUS_SUCCESS;
    }

    pSession->ReleaseAccess((ANSC_HANDLE)pSession);
    pSession->Close        ((ANSC_HANDLE)pSession);
    pSession->Return       ((ANSC_HANDLE)pSession);

    return  ANSC_STATUS_SUCCESS;
}
BOOL
HttpSpoPrvwoAccept
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hSocket,
        PANSC_HANDLE                phClientContext
    )
{
    ANSC_STATUS                     returnStatus   = ANSC_STATUS_SUCCESS;
    PHTTP_SIMPLE_PROXY_OBJECT       pMyObject      = (PHTTP_SIMPLE_PROXY_OBJECT     )hThisObject;
    PHTTP_SIMPLE_PROXY_PROPERTY     pProperty      = (PHTTP_SIMPLE_PROXY_PROPERTY   )&pMyObject->Property;
    PANSC_SIMPLE_PROXY_TCP_OBJECT   pSimpleProxy   = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy;
    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)hSocket;
    PANSC_BROKER_SOCKET_TCP_OBJECT  pServerSocket  = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL;
    PHTTP_PROXY_SESSION_OBJECT      pSession       = (PHTTP_PROXY_SESSION_OBJECT    )pMyObject->AcquirePso((ANSC_HANDLE)pMyObject);
    PANSC_BUFFER_DESCRIPTOR         pBufferDesp    = NULL;

    AnscTrace
        (
            "PrvwoAccept accepts a new client connection from %d.%d.%d.%d / TCP %d\n",
            pClientSocket->PeerAddress.Dot[0],
            pClientSocket->PeerAddress.Dot[1],
            pClientSocket->PeerAddress.Dot[2],
            pClientSocket->PeerAddress.Dot[3],
            pClientSocket->PeerPort
        );

    *phClientContext = (ANSC_HANDLE)NULL;

    /*
     * This routine is called when there's a new incoming connection (i.e., requested by the HTTP
     * client) is to be established. Following are the processing procedures applied:
     *
     *      (1) create a new HTTP Proxy Session Object for the connection
     *      (2) call sbc_connect(), the Server Behavior Controller either denies the
     *          connection or allows it.
     *      (3) create buffer_descriptor object and associate it with the socket object
     */
    if ( !pSession )
    {
        return  FALSE;
    }
    else
    {
        pSession->SetWamIf       ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pWamIf       );
        pSession->SetSbcIf       ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pSbcIf       );
        pSession->SetCbcIf       ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pCbcIf       );
        pSession->SetPbcIf       ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pPbcIf       );
        pSession->SetHfpIf       ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pHfpIf       );
        pSession->SetClientSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)pClientSocket);
    }

    if ( !pSession->AcceptClient
            (
                (ANSC_HANDLE)pSession,
                (ANSC_HANDLE)NULL
            ) )
    {
        pSession->Return((ANSC_HANDLE)pSession);

        return  FALSE;
    }
    else
    {
        pSession->SetSessionState((ANSC_HANDLE)pSession, HTTP_PSO_STATE_CLIENT_CONNECTED);
        pSession->Open           ((ANSC_HANDLE)pSession);
    }

    pBufferDesp =
        (PANSC_BUFFER_DESCRIPTOR)AnscAllocateBdo
            (
                HTTP_SPO_MAX_MESSAGE_SIZE,
                0,
                0
            );

    if ( pBufferDesp )
    {
        pClientSocket->SetBufferContext
            (
                (ANSC_HANDLE)pClientSocket,
                AnscBdoGetEndOfBlock(pBufferDesp),
                AnscBdoGetLeftSize  (pBufferDesp),
                (ANSC_HANDLE)pBufferDesp
            );
    }

    *phClientContext = (ANSC_HANDLE)pSession;

    return  TRUE;
}