/*++

Copyright (c) 1996 Microsoft Corporation

Module Name:

    irtdiclp.h

Abstract:

    private definitions for the irda tdi client library.
    
Author:

    mbert 9-97    

--*/

#define LISTEN_BACKLOG  1

#define ENDPSIG         0xEEEEEEEE
#define CONNSIG         0xCCCCCCCC

#define GOODENDP(ep)    ASSERT(ep->Sig == ENDPSIG)
#define GOODCONN(c)     ASSERT(c->Sig == CONNSIG)

typedef struct
{   
    LIST_ENTRY      Linkage;
    HANDLE          AddrHandle;
    REF_CNT         RefCnt;    
    ULONG           Sig;
    PFILE_OBJECT    pFileObject;
    LIST_ENTRY      ConnList;
    PDEVICE_OBJECT  pDeviceObject;
    ULONG           Flags;
     #define  EPF_CLIENT            0x00000001
     #define  EPF_SERVER            0x00000002
     #define  EPF_COMPLETE_CLOSE    0x00000004
    PVOID           ClEndpContext;
    CTEEvent        DeleteEndpEvent;
} IRENDPOINT, *PIRENDPOINT;

#define CONN_ST_CREATED     1
#define CONN_ST_OPEN        2
#define CONN_ST_CLOSED      3

typedef struct
{
    LIST_ENTRY      Linkage;
    HANDLE          ConnHandle;
    REF_CNT         RefCnt;
    ULONG           Sig;
    PFILE_OBJECT    pFileObject;    
    PDEVICE_OBJECT  pDeviceObject;    
    PIRENDPOINT     pEndp;
    ULONG           State;
    //LIST_ENTRY      RecvBufList;    
    LIST_ENTRY      RecvBufFreeList;
    LIST_ENTRY      RecvIndList;
    LIST_ENTRY      RecvIndFreeList;
    PIRDA_RECVBUF   pAssemBuf;
    PVOID           ClConnContext;
    CTEEvent        DeleteConnEvent;
} IRCONN, *PIRCONN;

typedef struct 
{
    LIST_ENTRY  Linkage;
    ULONG       BytesIndicated;
    ULONG       FinalSeg;
    PMDL        pMdl;
    PIRCONN     pConn;
} RECEIVEIND, *PRECEIVEIND;

VOID
IrdaCloseConnInternal(
    PVOID   ConnectContext);
    
NTSTATUS
IrdaCloseEndpointInternal(
    PVOID   pEndpContext,
    BOOLEAN InternalRequest);    

NTSTATUS
IrdaDisconnectEventHandler(
    IN PVOID TdiEventContext,
    IN CONNECTION_CONTEXT ConnectionContext,
    IN int DisconnectDataLength,
    IN PVOID DisconnectData,
    IN int DisconnectInformationLength,
    IN PVOID DisconnectInformation,
    IN ULONG DisconnectFlags
    );
    
NTSTATUS
IrdaReceiveEventHandler (
    IN PVOID TdiEventContext,
    IN CONNECTION_CONTEXT ConnectionContext,
    IN ULONG ReceiveFlags,
    IN ULONG BytesIndicated,
    IN ULONG BytesAvailable,
    OUT ULONG *BytesTaken,
    IN PVOID Tsdu,
    OUT PIRP *IoRequestPacket
    );
    
NTSTATUS
IrdaConnectEventHandler (
    IN PVOID TdiEventContext,
    IN int RemoteAddressLength,
    IN PVOID RemoteAddress,
    IN int UserDataLength,
    IN PVOID UserData,
    IN int OptionsLength,
    IN PVOID Options,
    OUT CONNECTION_CONTEXT *ConnectionContext,
    OUT PIRP *AcceptIrp
    );
   
NTSTATUS
IrdaCompleteAcceptIrp (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );
    
NTSTATUS
IrdaCompleteDisconnectIrp (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

NTSTATUS
IrdaCompleteSendIrp (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context);

NTSTATUS
IrdaCompleteReceiveIrp (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context);

NTSTATUS
IrdaDisassociateAddress(
    PIRCONN pConn);
                    
NTSTATUS
IrdaCreateAddress(
    IN  PTDI_ADDRESS_IRDA pRequestedIrdaAddr,
    OUT PHANDLE pAddrHandle);

NTSTATUS
IrdaCreateConnection(
    OUT PHANDLE pConnHandle,
    IN PVOID ClientContext);

NTSTATUS
IrdaAssociateAddress(
    PIRCONN     pConn,
    HANDLE      AddressHandle);

VOID
IrdaCreateConnCallback(
    struct CTEEvent *Event, 
    PVOID Arg);

VOID
IrdaDataReadyCallback(
    struct CTEEvent *Event, 
    PVOID Arg);

VOID
IrdaRestartRecvCallback(
    struct CTEEvent *Event, 
    PVOID Arg);
    
VOID
AllocRecvData(
    PIRCONN pConn);    

VOID
DeleteConnCallback(
    struct CTEEvent *Event, 
    PVOID Arg);

VOID
IrdaDeleteConnection(PIRCONN pConn);

VOID
DeleteEndpCallback(
    struct CTEEvent *Event, 
    PVOID Arg);

VOID
IrdaDeleteEndpoint(PIRENDPOINT pEndp);
                
NTSTATUS
IrdaSetEventHandler(
    IN PFILE_OBJECT FileObject,
    IN ULONG EventType,
    IN PVOID EventHandler,
    IN PVOID EventContext);

NTSTATUS
IrdaIssueDeviceControl (
    IN HANDLE FileHandle OPTIONAL,
    IN PFILE_OBJECT FileObject OPTIONAL,
    IN PVOID IrpParameters,
    IN ULONG IrpParametersLength,
    IN PVOID MdlBuffer,
    IN ULONG MdlBufferLength,
    IN UCHAR MinorFunction);