Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*
* 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_
|