162 lines
4.1 KiB
C
162 lines
4.1 KiB
C
|
/*
|
||
|
* Copyright (c) 1998, Microsoft Corporation
|
||
|
* File: timeout.cpp
|
||
|
*
|
||
|
* Purpose:
|
||
|
*
|
||
|
* Contains all the definitions
|
||
|
* for the overlapped I/O context structures
|
||
|
*
|
||
|
* History:
|
||
|
*
|
||
|
* 1. created
|
||
|
* Ajay Chitturi (ajaych) 26-Jun-1998
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef _oviocontext_h_
|
||
|
#define _oviocontext_h_
|
||
|
|
||
|
/*
|
||
|
* This file defines the structures used for overlapped I/O
|
||
|
*/
|
||
|
|
||
|
#define ACCEPT_BUFFER_MAX (sizeof (SOCKADDR_IN) * 2 + 0x20)
|
||
|
#define TPKT_HEADER_SIZE 4
|
||
|
#define TPKT_VERSION 3
|
||
|
|
||
|
// Types of overlapped I/O requests
|
||
|
enum EMGR_OV_IO_REQ_TYPE
|
||
|
{
|
||
|
EMGR_OV_IO_REQ_ACCEPT = 0,
|
||
|
EMGR_OV_IO_REQ_SEND,
|
||
|
EMGR_OV_IO_REQ_RECV
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// This structure stores the I/O context for each Overlapped I/O request
|
||
|
// OVERLAPPED should always be the first member of this struct.
|
||
|
// A pointer to the overlapped member of this structure is passed
|
||
|
// for all overlapped I/O calls.
|
||
|
// When we receive an I/O completion packet, the IOContext pointer is
|
||
|
// obtained by casting the OVERLAPPED pointer.
|
||
|
|
||
|
typedef struct _IOContext {
|
||
|
OVERLAPPED ov;
|
||
|
EMGR_OV_IO_REQ_TYPE reqType; // ACCEPT/SEND/RECV
|
||
|
OVERLAPPED_PROCESSOR *pOvProcessor; // callback called on this member
|
||
|
// this gives us the socket and
|
||
|
// the call type (Q931/H245) as well
|
||
|
} IOContext, *PIOContext;
|
||
|
|
||
|
// This structure stores the I/O context
|
||
|
// for each Overlapped Send/Recv request
|
||
|
typedef struct _SendRecvContext {
|
||
|
IOContext ioCtxt;
|
||
|
SOCKET sock;
|
||
|
BYTE pbTpktHdr[TPKT_HEADER_SIZE];
|
||
|
DWORD dwTpktHdrBytesDone;
|
||
|
PBYTE pbData;
|
||
|
DWORD dwDataLen;
|
||
|
DWORD dwDataBytesDone;
|
||
|
} SendRecvContext, *PSendRecvContext;
|
||
|
|
||
|
// This structure stores the I/O context
|
||
|
// for each Overlapped accept request
|
||
|
typedef struct _AcceptContext {
|
||
|
IOContext ioCtxt;
|
||
|
SOCKET listenSock;
|
||
|
SOCKET acceptSock;
|
||
|
BYTE addrBuf[ACCEPT_BUFFER_MAX];
|
||
|
} AcceptContext, *PAcceptContext;
|
||
|
|
||
|
#include "sockinfo.h"
|
||
|
|
||
|
// the PDU decode logic depends upon whether its targeted for
|
||
|
// a Q931 or H245 channel. Since we want to keep that logic
|
||
|
// in the event manager, the overlapped processor needs to
|
||
|
// expose its type via this
|
||
|
enum OVERLAPPED_PROCESSOR_TYPE
|
||
|
{
|
||
|
OPT_Q931 = 0,
|
||
|
OPT_H245
|
||
|
};
|
||
|
|
||
|
// Classes (Q931 src, dest and H245) inheriting
|
||
|
// from this make async overlapped operations
|
||
|
// this class provides the callback methods and
|
||
|
// some of the parameters needed by the event manager
|
||
|
// to make the overlapped calls
|
||
|
class OVERLAPPED_PROCESSOR
|
||
|
{
|
||
|
protected:
|
||
|
|
||
|
OVERLAPPED_PROCESSOR_TYPE m_OverlappedProcessorType;
|
||
|
|
||
|
// it belongs to this call state
|
||
|
H323_STATE * m_pH323State;
|
||
|
SOCKET_INFO m_SocketInfo; // socket handle and remote/local address/ports
|
||
|
|
||
|
public:
|
||
|
|
||
|
OVERLAPPED_PROCESSOR::OVERLAPPED_PROCESSOR (void)
|
||
|
: m_OverlappedProcessorType (OPT_Q931),
|
||
|
m_pH323State (NULL)
|
||
|
{}
|
||
|
|
||
|
|
||
|
void Init (
|
||
|
IN OVERLAPPED_PROCESSOR_TYPE OverlappedProcessorType,
|
||
|
IN H323_STATE &H323State)
|
||
|
{
|
||
|
// an assert is sufficient as this shouldn't happen
|
||
|
_ASSERTE(NULL == m_pH323State);
|
||
|
|
||
|
m_OverlappedProcessorType = OverlappedProcessorType;
|
||
|
|
||
|
m_pH323State = &H323State;
|
||
|
}
|
||
|
|
||
|
BOOLEAN IsSocketValid (void) { return m_SocketInfo.IsSocketValid(); }
|
||
|
|
||
|
inline OVERLAPPED_PROCESSOR_TYPE GetOverlappedProcessorType() { return m_OverlappedProcessorType; }
|
||
|
|
||
|
inline SOCKET_INFO &GetSocketInfo() { return m_SocketInfo; }
|
||
|
|
||
|
inline H323_STATE &GetH323State() { return *m_pH323State; }
|
||
|
|
||
|
inline CALL_BRIDGE &GetCallBridge();
|
||
|
|
||
|
virtual HRESULT AcceptCallback (
|
||
|
IN DWORD Status,
|
||
|
IN SOCKET Socket,
|
||
|
IN SOCKADDR_IN * LocalAddress,
|
||
|
IN SOCKADDR_IN * RemoteAddress) = 0;
|
||
|
|
||
|
virtual HRESULT SendCallback(
|
||
|
IN HRESULT CallbackHResult
|
||
|
) = 0;
|
||
|
|
||
|
virtual HRESULT ReceiveCallback(
|
||
|
IN HRESULT CallbackHResult,
|
||
|
IN BYTE *pBuffer,
|
||
|
IN DWORD BufLen
|
||
|
) = 0;
|
||
|
};
|
||
|
|
||
|
void
|
||
|
EventMgrFreeSendContext(
|
||
|
IN PSendRecvContext pSendCtxt
|
||
|
);
|
||
|
void
|
||
|
EventMgrFreeRecvContext(
|
||
|
IN PSendRecvContext pRecvCtxt
|
||
|
);
|
||
|
void
|
||
|
EventMgrFreeAcceptContext(
|
||
|
IN PAcceptContext pAcceptCtxt
|
||
|
);
|
||
|
|
||
|
#endif //_oviocontext_h_
|