253 lines
5 KiB
C
253 lines
5 KiB
C
|
/*++
|
||
|
|
||
|
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_
|