/**********************************************************************/
/**                       Microsoft Windows NT                       **/
/**                Copyright(c) Microsoft Corp., 1993                **/
/**********************************************************************/

/*
    inline.hxx

    Contains simple inline functions that can't included inline due to
    circular dependencies

    FILE HISTORY:
        Johnl   10-Sept-1996    Created

*/


#ifndef _INLINE_H_
#define _INLINE_H_

/*******************************************************************

    NAME:       CLIENT_CONN::ReadFile

    SYNOPSIS:   Simple wrapper around AtqReadSocket

    HISTORY:
        Johnl       24-Aug-1994 Created

********************************************************************/

inline
BOOL CLIENT_CONN::ReadFile( LPVOID       lpBuffer,
                            DWORD        BytesToRead )
{
    WSABUF wsaBuf = { BytesToRead, (CHAR * ) lpBuffer};

    Reference();
    if ( !AtqReadSocket( QueryAtqContext(),
                         &wsaBuf,
                         1,
                         NULL ))
    {
        Dereference();
        return FALSE;
    }

    return TRUE;
}

/*******************************************************************

    NAME:       CLIENT_CONN::WriteFile

    SYNOPSIS:   Simple wrapper around AtqWriteSocket

    HISTORY:
        Johnl       24-Aug-1994 Created

********************************************************************/

inline
BOOL CLIENT_CONN::WriteFile( LPVOID       lpBuffer,
                             DWORD        BytesToWrite )
{
    WSABUF wsaBuf = { BytesToWrite, (CHAR * ) lpBuffer};
    PATQ_CONTEXT pAtqContext = QueryAtqContext();
    Reference();
    if ( !AtqWriteSocket( pAtqContext,
                          &wsaBuf,
                          1,
                          &pAtqContext->Overlapped ))
    {
        Dereference();
        return FALSE;
    }

    return TRUE;
}

/*******************************************************************

    NAME:       CLIENT_CONN::SyncWsaSend

    SYNOPSIS:   Simple wrapper around AtqSyncWsaSend
                for writing an array of WSABUFs synchronously

    HISTORY:
        DaveK   5-Aug-1997 Created

********************************************************************/

inline
BOOL CLIENT_CONN::SyncWsaSend( WSABUF *    rgWsaBuffers,
                               DWORD       cWsaBuffers,
                               LPDWORD     pcbWritten
)
{
    Reference();
    BOOL fRes = AtqSyncWsaSend( QueryAtqContext(),
                                rgWsaBuffers,
                                cWsaBuffers,
                                pcbWritten );
    Dereference();

    return fRes;
}

/*******************************************************************

    NAME:       CLIENT_CONN::TransmitFile

    SYNOPSIS:   Simple wrapper around AtqTransmitFile

    HISTORY:
        Johnl       24-Aug-1994 Created

********************************************************************/

inline
BOOL CLIENT_CONN::TransmitFile( HANDLE       hFile,
                                DWORD        Offset,
                                DWORD        BytesToWrite,
                                DWORD        dwFlags,
                                PVOID        pHead,
                                DWORD        HeadLength,
                                PVOID        pTail,
                                DWORD        TailLength )

{
    TRANSMIT_FILE_BUFFERS tfb;

    dwFlags &= (TF_DISCONNECT | TF_REUSE_SOCKET);

    tfb.Head       = pHead;
    tfb.HeadLength = HeadLength;
    tfb.Tail       = pTail;
    tfb.TailLength = TailLength;

    Reference();
    QueryAtqContext()->Overlapped.Offset = Offset;
    if ( !AtqTransmitFile( QueryAtqContext(),
                           hFile,
                           BytesToWrite,
                           &tfb,
                           dwFlags ))
    {
        Dereference();
        return FALSE;
    }

    return TRUE;
}

/*******************************************************************

    NAME:       CLIENT_CONN::TransmitFileAndRecv

    SYNOPSIS:   Simple wrapper around AtqTransmitFileAndRecv

    HISTORY:
        JBallard      13-Nov-1996 Created

********************************************************************/

inline
BOOL CLIENT_CONN::TransmitFileAndRecv( HANDLE       hFile,
                                       DWORD        Offset,
                                       DWORD        BytesToWrite,
                                       DWORD        dwFlags,
                                       PVOID        pHead,
                                       DWORD        HeadLength,
                                       PVOID        pTail,
                                       DWORD        TailLength,
                                       LPVOID       lpBuffer,
                                       DWORD        BytesToRead )

{
    DBG_ASSERT( g_fUseAndRecv );

    TRANSMIT_FILE_BUFFERS tfb;
    WSABUF wsaBuf = { BytesToRead, (CHAR * ) lpBuffer};

    dwFlags &= (TF_DISCONNECT | TF_REUSE_SOCKET);

    tfb.Head       = pHead;
    tfb.HeadLength = HeadLength;
    tfb.Tail       = pTail;
    tfb.TailLength = TailLength;

    Reference();
    QueryAtqContext()->Overlapped.Offset = Offset;
    if ( !AtqTransmitFileAndRecv( QueryAtqContext(),
                                  hFile,
                                  BytesToWrite,
                                  &tfb,
                                  dwFlags,
                                  &wsaBuf,
                                  1 ))
    {
        Dereference();
        return FALSE;
    }

    return TRUE;
}

/*******************************************************************

    NAME:       CLIENT_CONN::WriteFileAndRecv

    SYNOPSIS:   Simple wrapper around AtqSendAndRecv

    HISTORY:
        JBallard   13-Nov-1996 Created

********************************************************************/

inline
BOOL CLIENT_CONN::WriteFileAndRecv( LPVOID       lpSendBuffer,
                                    DWORD        BytesToWrite,
                                    LPVOID       lpRecvBuffer,
                                    DWORD        BytesToRead )
{
    DBG_ASSERT( g_fUseAndRecv );

    WSABUF wsaSendBuf = { BytesToWrite, (CHAR * ) lpSendBuffer};
    WSABUF wsaRecvBuf = { BytesToRead, (CHAR * ) lpRecvBuffer};
    Reference();
    if ( !AtqSendAndRecv( QueryAtqContext(),
                          &wsaSendBuf,
                          1,
                          &wsaRecvBuf,
                          1 ))
    {
        Dereference();
        return FALSE;
    }

    return TRUE;
}

inline
BOOL
CLIENT_CONN::PostCompletionStatus(
    DWORD        BytesTransferred
    )
/*++

Routine Description:

    Posts a completion status to this connection's ATQ context

Arguments:

    BytesTransferred - Count of bytes sent or received from buffer

Return Value:

    TRUE on success, FALSE on failure (call GetLastError)

--*/
{
    Reference();
    if ( !AtqPostCompletionStatus( QueryAtqContext(),
                                   BytesTransferred ))
    {
        Dereference();
        return FALSE;
    }

    return TRUE;
}

/*******************************************************************

    NAME:       HTTP_REQ_BASE::Disconnect

    SYNOPSIS:   Forwards the disconnect request to the client connection

    ENTRY:      Same as for CLIENT_CONN::Disconnect

    HISTORY:
        Johnl       24-Aug-1994 Created

********************************************************************/

inline
VOID HTTP_REQ_BASE::Disconnect( DWORD htResp,
                                DWORD dwError2,
                                BOOL  fDoShutdown,
                                LPBOOL pfFinished )
{
    _pClientConn->Disconnect( this, htResp, dwError2, fDoShutdown, pfFinished );
}

inline
DWORD HTTP_REQ_BASE::Reference( VOID )
{
    return _pClientConn->Reference();
}

inline
DWORD HTTP_REQ_BASE::Dereference( VOID )
{
    return _pClientConn->Dereference();
}

inline
DWORD HTTP_REQ_BASE::QueryRefCount( VOID )
{
    return _pClientConn->QueryRefCount();
}


#pragma hdrstop
#endif  // _W3P_H_