/*++

Copyright (c) 1996 Microsoft Corporation

Module Name:

    buffsock.hxx

Abstract:

    Simple socket class for buffered I/O.

Author:

    Keith Moore (keithmo)        02-Dec-1996

Revision History:

--*/


#ifndef _BUFFSOCK_HXX_
#define _BUFFSOCK_HXX_


class BUFFERED_SOCKET {

public:

    //
    // Constructor/destructor.
    //

    BUFFERED_SOCKET();
    ~BUFFERED_SOCKET();

    //
    // Initializers.
    //

    INT
    InitializeClient(
        LPSTR HostName,
        USHORT Port
        );

    INT
    InitializeClient(
        LPSOCKADDR_IN HostAddress
        );

    INT
    InitializeClient(
        SOCKET Socket
        );

    INT
    InitializeServer(
        USHORT Port
        );

    //
    // Basic I/O.
    //

    INT
    Send(
        PVOID Buffer,
        LPDWORD BufferLength
        );

    INT
    Recv(
        PVOID Buffer,
        LPDWORD BufferLength
        );

    //
    // Framed I/O.
    //

    INT
    SendFrame(
        PVOID Buffer,
        LPDWORD BufferLength
        );

    INT
    RecvFrame(
        PVOID Buffer,
        LPDWORD BufferLength
        );

    //
    // Blob I/O.
    //

    INT
    SendBlob(
        PIIS_CRYPTO_BLOB Blob
        );

    INT
    RecvBlob(
        PIIS_CRYPTO_BLOB * ppBlob
        );

private:

    SOCKET m_Socket;
    PVOID m_Buffer;
    DWORD m_BufferLength;
    DWORD m_BytesAvailable;
    DWORD m_Offset;
    BOOL m_Initialized;

    INT
    BufferedRecv(
        PVOID Buffer,
        DWORD BufferLength
        );

    INT
    CommonInitialize();

    static LONG m_InitCount;

};  // BUFFERED_SOCKET


#endif  // _BUFFSOCK_HXX_