|
|
#ifndef __ICQ_CLIENT_HEADER_
#define __ICQ_CLIENT_HEADER_
#define ICQ99_SERVER_PORT 0xA00F
#define ICQ99_HACK_PORT 0xA00F
#define ICQ2K_SERVER_PORT 0x0000
#define ICQ2K_HACK_PORT 0x0001
#define ICQ_BUFFER_SIZE 576
#define ICQ_CLIENT_TIMEOUT 360
//
// SERVER MESSAGES are PortRedirect'ed to port
// Here it is dispatched accordingly.. It serves as just an envoy.
typedef class _ICQ_PEER : public GENERIC_NODE { friend VOID IcqPeerConnectionCompletionRoutine ( ULONG ErrorCode, ULONG BytesTransferred, PNH_BUFFER Bufferp ); friend VOID IcqPeerReadCompletionRoutine ( ULONG ErrorCode, ULONG BytesTransferred, PNH_BUFFER Bufferp );
// friend class _ICQ_PEER;
public: _ICQ_PEER();
~_ICQ_PEER();
virtual void ComponentCleanUpRoutine(void);
virtual void StopSync(void);
virtual PCHAR GetObjectName() { return ObjectNamep; }
virtual ULONG ProcessOutgoingPeerMessage(PUCHAR buf, ULONG len);
virtual ULONG InitiatePeerConnection(PDispatchReply DispatchReplyp);
virtual ULONG EndPeerSessionForClient(PCNhSock ClosedSocketp);
virtual ULONG CreateShadowMappingPriorToConnection(PDispatchReply DispatchReplyp);
// member variables section
PCNhSock ToClientSocketp;
PCNhSock ToPeerSocketp;
ULONG PeerUIN;
ULONG PeerVer;
ULONG PeerIp;
USHORT PeerPort;
BOOLEAN bActivated;
BOOLEAN bShadowMappingExists;
ICQ_DIRECTION_FLAGS MappingDirection;
IPendingProxyConnection* ShadowRedirectp;
ISecondaryControlChannel* OutgoingPeerControlRedirectp;
IDataChannel * IncomingDataRedirectp; // HANDLE hIncomingDataRedirectHandle;
static const PCHAR ObjectNamep;
} ICQ_PEER, * PICQ_PEER;
//
//
//
typedef class _ICQ_CLIENT : public virtual DISPATCHEE { friend _ICQ_CLIENT* ScanTheListForLocalPeer( PULONG PeerIp, PUSHORT PeerPort, ULONG IcqUIN );
public:
_ICQ_CLIENT();
~_ICQ_CLIENT();
virtual void ComponentCleanUpRoutine(void);
virtual void StopSync(void);
virtual PCHAR GetObjectName() { return ObjectNamep;}
ULONG DispatchCompletionRoutine ( PDispatchReply DispatchReplyp );
// ** Initialize **
// The first packet to any server is initialized here..
// This creates a new UDP Server socket (if there isn't one.)
// Initializes the Server Address, creates a more specific
// Redirection between the Client ~ Proxy
// (if there is one already deletes that )
// Modifies the packet if necessary and forwards it to
// the designated destination.
// Creates secondary Mappings and such
// NOTE: This function is called from the Context Of
// IcqReadCompletion Routine which dispatches the inits.
//
ULONG Initialize( PNH_BUFFER Bufferp, ULONG clientIp, USHORT clientPort, ULONG serverIp, USHORT serverPort, PCNhSock localClientSocketp );
// ** ServerRead **
// This will keep track of Peer Online Messages and such..
// will create sockets for each peer that is online and will
// create mappings which will redirect the outgoing packets
// to the peers to the appropriate Handler.. Which in turn
// will change the appropriate packets and then create
// Redirects if necessary.
ULONG ServerRead( PNH_BUFFER Bufferp, ULONG serverIp, USHORT serverPort );
ULONG ClientRead( PNH_BUFFER Bufferp, ULONG serverIp, USHORT serverPort );
ISecondaryControlChannel* PeerRedirection( ULONG dstIp, USHORT dstPort, ULONG srcIp OPTIONAL, USHORT srcPort OPTIONAL, ICQ_DIRECTION_FLAGS DirectionContext );
// Do we need this?
// ServerWrite();
// PeerWrite();
VOID ReportExistingPeers(VOID);
//protected:
ULONG IcqServerToClientUdp( PUCHAR mcp, ULONG mcplen );
ULONG IcqClientToServerUdp( PUCHAR buf, ULONG size );
ULONG DeleteTimer(TIMER_DELETION bHow);
ULONG ResetTimer(VOID); // member - ServerSocket
PCNhSock ServerSocketp; // when writing and reading to server
//
// NAT ENGINE RELATED
IPendingProxyConnection * ShadowRedirectp;
ISecondaryControlChannel* IncomingPeerControlRedirectionp;
// this socket is shared among all the clients
PCNhSock ClientSocketp; // when writing to the client back +
ULONG ClientIp; USHORT ClientToServerPort; // UDP
USHORT ClientToPeerPort; // TCP
USHORT ImitatedPeerPort; ULONG UIN; ULONG ClientVer;
ULONG ServerIp; USHORT ServerPort;
CLIST IcqPeerList;
PTIMER_CONTEXT TimerContextp;
static const PCHAR ObjectNamep; } ICQ_CLIENT, *PICQ_CLIENT;
//
// Function Definitions
//
VOID NTAPI IcqClientTimeoutHandler( PVOID Parameterp, BOOLEAN TimerOrWaitFired );
#endif
|