/****************************************************************************/ // cd.h // // Component Decoupler Class // // Copyright (C) 1997-2000 Microsoft Corporation /****************************************************************************/ #ifndef _H_CD #define _H_CD extern "C" { #include } #include "objs.h" /****************************************************************************/ /* Component IDs */ /****************************************************************************/ #define CD_UI_COMPONENT 0 #define CD_SND_COMPONENT 1 #define CD_RCV_COMPONENT 2 #define CD_MAX_COMPONENT 2 #define CD_NUM_COMPONENTS 3 /****************************************************************************/ /* CD_NOTIFICATION_FN: */ /* */ /* Callback for notifications. */ /****************************************************************************/ typedef DCVOID DCAPI CD_NOTIFICATION_FN( PDCVOID pInst, PDCVOID pData, DCUINT dataLength ); typedef CD_NOTIFICATION_FN DCPTR PCD_NOTIFICATION_FN; /****************************************************************************/ /* CD_SIMPLE_NOTIFICATION_FN: */ /* */ /* Callback for simple notifications (can only pass a single ULONG_PTR). */ /****************************************************************************/ typedef DCVOID DCAPI CD_SIMPLE_NOTIFICATION_FN(PDCVOID pInst, ULONG_PTR value); typedef CD_SIMPLE_NOTIFICATION_FN DCPTR PCD_SIMPLE_NOTIFICATION_FN; /****************************************************************************/ /* */ /* CONSTANTS */ /* */ /****************************************************************************/ #define CD_WINDOW_CLASS _T("ComponentDecouplerClass") #define CD_NOTIFICATION_MSG (DUC_CD_MESSAGE_BASE) #define CD_SIMPLE_NOTIFICATION_MSG (DUC_CD_MESSAGE_BASE+1) #define CD_MAX_NOTIFICATION_DATA_SIZE (0xFFFF - sizeof(CDTRANSFERBUFFERHDR)) /****************************************************************************/ /* Transfer buffers used by CD_DecoupleNotification. The largest size */ /* required is used to pass connection userdata between Network Layer */ /* components. */ /* The number of buffers reflects the usage during connection startup */ /****************************************************************************/ #define CD_CACHED_TRANSFER_BUFFER_SIZE 0x100 #define CD_NUM_CACHED_TRANSFER_BUFFERS 32 //changed from 6 /****************************************************************************/ /* */ /* STRUCTURES */ /* */ /****************************************************************************/ /**STRUCT+*******************************************************************/ /* Structure: CDTRANSFERBUFFER */ /* */ /* Description: structure for buffer passed with decoupled notifications */ /****************************************************************************/ typedef struct tagCDTRANSFERBUFFERHDR { PCD_NOTIFICATION_FN pNotificationFn; PCD_SIMPLE_NOTIFICATION_FN pSimpleNotificationFn; PDCVOID pInst; } CDTRANSFERBUFFERHDR; typedef struct tagCDTRANSFERBUFFER { CDTRANSFERBUFFERHDR hdr; DCUINT8 data[1]; } CDTRANSFERBUFFER; typedef CDTRANSFERBUFFER DCPTR PCDTRANSFERBUFFER; typedef DCUINT8 CDCACHEDTRANSFERBUFFER[CD_CACHED_TRANSFER_BUFFER_SIZE]; /**STRUCT+*******************************************************************/ /* Structure: CD_COMPONENT_DATA */ /* */ /* Description: Component Decoupler component data */ /* */ /* Note that the transferBufferInUse flags are declared as a separate */ /* array so that when we search for a free buffer we look at contiguous */ /* bytes rather than bytes separated by the size of a Transfer Buffer */ /* i.e. it makes the most of processor memory caching. */ /****************************************************************************/ typedef struct tagCD_COMPONENT_DATA { #ifdef DC_DEBUG DCINT32 pendingMessageCount; /* must be 4-byte aligned */ DCINT32 pad; /*transferBuffer must start on a processor word boundary*/ #endif CDCACHEDTRANSFERBUFFER transferBuffer[CD_NUM_CACHED_TRANSFER_BUFFERS]; DCBOOL32 transferBufferInUse[ CD_NUM_CACHED_TRANSFER_BUFFERS]; HWND hwnd[CD_NUM_COMPONENTS]; } CD_COMPONENT_DATA; /**STRUCT-*******************************************************************/ // // MACROS to create static versions of notification functions that // are CD callable // // This is needed because the CD does not support getting C++ pointer-to-member's // changing that would require having a copy of all the CD for each possible // class type that makes CD calls. // #define EXPOSE_CD_SIMPLE_NOTIFICATION_FN(class_name, fn_name) \ public: \ static DCVOID DCAPI MACROGENERATED_Static_##fn_name( \ PDCVOID inst, ULONG_PTR param_name) \ { \ ((class_name*)inst)->##fn_name(param_name); \ } \ #define EXPOSE_CD_NOTIFICATION_FN(class_name, fn_name) \ public: \ static DCVOID DCAPI MACROGENERATED_Static_##fn_name( \ PDCVOID inst, PDCVOID param1_name, DCUINT param2_name) \ { \ ((class_name*)inst)->##fn_name(param1_name, param2_name); \ } #define CD_NOTIFICATION_FUNC(class_name, fn_name) \ class_name::MACROGENERATED_Static_##fn_name class CUT; class CUI; class CCD { public: CCD(CObjs* objs); ~CCD(); DCVOID DCAPI CD_TestNotify(DCUINT uni); DCVOID DCAPI CD_otify(DCUINT uni,int fo); public: // // API // /****************************************************************************/ /* FUNCTIONS */ /****************************************************************************/ DCVOID DCAPI CD_Init(DCVOID); DCVOID DCAPI CD_Term(DCVOID); HRESULT DCAPI CD_RegisterComponent(DCUINT component); HRESULT DCAPI CD_UnregisterComponent(DCUINT component); // // Notifications..pass a buffer and a length // BOOL DCAPI CD_DecoupleNotification(unsigned,PDCVOID, PCD_NOTIFICATION_FN, PDCVOID, unsigned); BOOL DCAPI CD_DecoupleSyncDataNotification(unsigned,PDCVOID, PCD_NOTIFICATION_FN, PDCVOID, unsigned); // // Simple notifications (accept one parameter) // BOOL DCAPI CD_DecoupleSimpleNotification(unsigned,PDCVOID, PCD_SIMPLE_NOTIFICATION_FN, ULONG_PTR); BOOL DCAPI CD_DecoupleSyncNotification(unsigned,PDCVOID, PCD_SIMPLE_NOTIFICATION_FN, ULONG_PTR); public: // // Public data members // CD_COMPONENT_DATA _CD; private: // // Internal functions // /****************************************************************************/ /* */ /* FUNCTIONS */ /* */ /****************************************************************************/ PCDTRANSFERBUFFER DCINTERNAL CDAllocTransferBuffer(DCUINT dataLength); DCVOID DCINTERNAL CDFreeTransferBuffer(PCDTRANSFERBUFFER pTransferBuffer); static LRESULT CALLBACK CDStaticWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK CDWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); private: CUT* _pUt; CUI* _pUi; private: CObjs* _pClientObjects; BOOL _fCDInitComplete; }; #endif