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.
|
|
/*++
Copyright (c) 2000, Microsoft Corporation
Module Name:
dispatcher.h
Abstract:
This derivation from the base Socket class is to Create Accept dispatcher. Customers will register to this Dispatcher Giving it a struct which explains what type of connections are expected to be dispatched to them.
Source specific or original destination specific dispatches can be requested. Author:
Savas Guven (savasg) 25-Oct-2000
Revision History:
Savas Guven (savasg) 25-Oct-2000 --*/ #ifndef _DISPATCHER_HEADER_
#define _DISPATCHER_HEADER_
//
// Forward definition
//
class CSockDispatcher; class DispatcheeNode;
VOID DispatcherAcceptCompletionRoutine ( ULONG ErrorCode, ULONG BytesTransferred, PNH_BUFFER Bufferp );
typedef enum _ICQ_DIRECTION_FLAGS { IcqFlagNeutral = 0x00, IcqFlagOutgoing = eALG_OUTBOUND, IcqFlagIncoming = eALG_INBOUND
} ICQ_DIRECTION_FLAGS, *PICQ_DIRECTION_FLAGS;
typedef ICQ_DIRECTION_FLAGS DISPATCHER_DIRECTION_FLAGS, \ * PDISPATCHER_DIRECTION_FLAGS;
//
//
typedef class _DispatchRequest : public virtual GENERIC_NODE { public: ULONG srcIp; USHORT srcPort; ULONG dstIp; USHORT dstPort; DISPATCHER_DIRECTION_FLAGS DirectionContext;
} DispatchRequest, *PDispatchRequest;
//
//
//
typedef struct _DispatchReply { DispatchRequest dispatch; PCNhSock Socketp;
} DispatchReply, *PDispatchReply;
//
// D I S P A T C H E E
//
typedef class _Dispatchee : public virtual GENERIC_NODE { //friend CSockDispatcher;
friend DispatcheeNode;
public:
_Dispatchee(); virtual ~_Dispatchee() ;
//#if DBG
virtual void ComponentCleanUpRoutine(void);
virtual void StopSync(void) {};
virtual PCHAR GetObjectName(); //#endif
virtual ULONG DispatchCompletionRoutine ( PDispatchReply DispatchReplyp );
virtual SetID(ULONG ID) { DispatchUniqueId = ID;}
virtual ULONG GetID(void) {return DispatchUniqueId; }
protected:
ISecondaryControlChannel* IncomingRedirectForPeerToClientp;
ULONG DispatchUniqueId;
static const PCHAR ObjectNamep;
} DISPATCHEE, *PDISPATCHEE;
//
// D I S P A T C H E E _ N O D E
//
class DispatcheeNode: public virtual GENERIC_NODE { public:
// also sets the Node search Keys appropriately.
// DispatcheeNode(PDISPATCHEE);
VOID InitDispatcheeNode(PDISPATCHEE);
virtual ~DispatcheeNode();
void ComponentCleanUpRoutine(void);
PCHAR GetObjectName(void);
// searches the list of Request made by this DispatchTo client
ULONG isDispatchYours(PDispatchReply DispatchReplyp);
ULONG AddDispatchRequest(PDispatchRequest DispatchRequestp);
ULONG DeleteDispatchRequest(PDispatchRequest DispatchRequestp);
PDISPATCHEE GetDispatchee() { return DispatchTop; }
ULONG GetOriginalDestination(ULONG SrcAddress, USHORT SrcPort, PULONG DestAddrp, PUSHORT DestPortp);
protected: static const PCHAR ObjectNamep;
PDISPATCHEE DispatchTop;
CLIST listRequests; // Node of Requests
};
//
//
//
class CSockDispatcher: public virtual _CNhSock { public: friend VOID DispatcherAcceptCompletionRoutine ( ULONG ErrorCode, ULONG BytesTransferred, PNH_BUFFER Bufferp );
CSockDispatcher();
CSockDispatcher(ULONG IpAddress, USHORT port);
~CSockDispatcher();
//
// Initializes the socket portion of the Dispatcher.
//
ULONG InitDispatcher( ULONG IpAddress, USHORT port );
//
// The inherited ComponentCleanupRoutine ala SYNC object
//
virtual void ComponentCleanUpRoutine(void);
virtual void StopSync(void);
PCHAR GetObjectName();
//
// A Dispatchee registers itself and gets a Unique ID
//
ULONG InitDispatchee(PDISPATCHEE Dispatchp);
ULONG RemoveDispatchee(PDISPATCHEE Dispatchp);
//
// Get the port on which the Dispatch is occuring
//
ULONG GetDispatchInfo( PULONG IPp OPTIONAL, PUSHORT Portp OPTIONAL );
//
// Add a Dispatch request - searches for the correct node
// and then calls the nodes AddDispatchReq to add the req to the List of existing reqs.
//
ULONG AddDispatchRequest( PDISPATCHEE Dispatchp, PDispatchRequest DispatchRequestp );
//
// Delete a Dispatch request - searches the correct node and
// then calls the nodes own DeleteDispatchReq to delete the req from the List
//
ULONG DeleteDispatchRequest( PDispatchRequest DispatchRequestp );
//
// Get Original Destination for Accepted Socket
//
ULONG GetOriginalDestination( PNH_BUFFER Bufferp, PULONG OrigDestAddrp, PUSHORT OrigDestPortp );
private: CLIST listDispNodes; // and their requests.
static ULONG UniqueId;
static const PCHAR ObjectNamep; };
#endif //_DISPATCHER_HEADER_
|