Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

161 lines
4.1 KiB

/*
* 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_