/**INC+**********************************************************************/ /* Header: cclip.h */ /* */ /* Purpose: Clip Client Addin header */ /* */ /* Copyright(C) Microsoft Corporation 1998-1999 */ /* */ /**INC-**********************************************************************/ #ifndef _H_CCLIP #define _H_CCLIP #ifndef INITGUID #define INITGUID #include #else #include #endif #ifndef PPVOID typedef LPVOID * PPVOID; #endif //PPVOID class CImpIDataObject; typedef class CImpIDataObject *PIMPIDATAOBJECT; #ifdef OS_WINCE extern "C" HWND ghwndClip; #endif #ifdef DC_DEBUG #define CLIP_TRANSITION_RECORDING #endif // DC_DEBUG #ifdef CLIP_TRANSITION_RECORDING #define DBG_RECORD_SIZE 128 extern UINT g_rguiDbgLastClipState[DBG_RECORD_SIZE]; extern UINT g_rguiDbgLastClipEvent[DBG_RECORD_SIZE]; extern LONG g_uiDbgPosition; #endif // CLIP_TRANSITION_RECORDING // Number of milliseconds before our IDataObject::GetData will timeout/fail #define CLIP_GETDATA_TIMEOUT 5000 /****************************************************************************/ /* Format mapping structure */ /****************************************************************************/ typedef struct tagCB_FORMAT_MAP { DCUINT clientID; DCUINT serverID; } CB_FORMAT_MAP, FAR * PCB_FORMAT_MAP; /****************************************************************************/ /* Maximum number of formats we support */ /****************************************************************************/ #define CB_MAX_FORMATS 100 /****************************************************************************/ /* CB window class */ /****************************************************************************/ #define CB_VIEWER_CLASS _T("CBViewerClass") /****************************************************************************/ // Our user event /****************************************************************************/ #define WM_USER_CHANGE_THREAD (WM_USER + 42) #define WM_USER_CLEANUP_ON_TERM (WM_USER + 43) /****************************************************************************/ /* */ /* CB states */ /* */ /****************************************************************************/ #define CB_STATE_NOT_INIT 0 #define CB_STATE_INITIALIZED 1 #define CB_STATE_ENABLED 2 #define CB_STATE_LOCAL_CB_OWNER 3 #define CB_STATE_SHARED_CB_OWNER 4 #define CB_STATE_PENDING_FORMAT_LIST_RSP 5 #define CB_STATE_SENDING_FORMAT_DATA 6 #define CB_STATE_PENDING_FORMAT_DATA_RSP 7 #define CB_NUMSTATES 8 /****************************************************************************/ /* */ /* CB events */ /* */ /****************************************************************************/ #define CB_EVENT_CB_INIT 0 #define CB_EVENT_CB_ENABLE 1 #define CB_EVENT_CB_DISABLE 2 #define CB_EVENT_CB_TERM 3 #define CB_EVENT_WM_CREATE 4 #define CB_EVENT_WM_DESTROY 5 #define CB_EVENT_WM_CHANGECBCHAIN 6 #define CB_EVENT_WM_DRAWCLIPBOARD 7 #define CB_EVENT_WM_RENDERFORMAT 8 #define CB_EVENT_FORMAT_LIST 9 #define CB_EVENT_FORMAT_LIST_RSP 10 #define CB_EVENT_FORMAT_DATA_RQ 11 #define CB_EVENT_FORMAT_DATA_RSP 12 #define CB_TRACE_EVENT_CB_CLIPMAIN 13 #define CB_TRACE_EVENT_CB_MONITOR_READY 14 #define CB_TRACE_EVENT_CB_DISCONNECT 15 #define CB_TRACE_EVENT_WM_EMPTY_CLIPBOARD 16 #define CB_NUMEVENTS 13 /****************************************************************************/ /* Values in the state table */ /****************************************************************************/ #define CB_TABLE_OK 0 #define CB_TABLE_WARN 1 #define CB_TABLE_ERROR 2 /****************************************************************************/ /* Clipboard Viewer Window Messages */ /****************************************************************************/ #define WM_EMPTY_CLIPBOARD WM_APP+1 #define WM_CLOSE_CLIPBOARD WM_APP+2 /****************************************************************************/ /* Macros */ /****************************************************************************/ /****************************************************************************/ /* CB_CHECK_STATE - macro version with DC_QUIT */ /****************************************************************************/ #define CB_CHECK_STATE(event) \ { \ if (ClipCheckState(event) == CB_TABLE_ERROR) \ { \ DC_QUIT; \ } \ } \ /****************************************************************************/ /* CB_SET_STATE - set the CB state */ /****************************************************************************/ #ifndef CLIP_TRANSITION_RECORDING #define CB_SET_STATE(newstate, event) \ { \ TRC_NRM((TB, _T("Set state from %s to %s"), \ cbState[_CB.state], cbState[newstate])); \ _CB.state = newstate; \ } #else #define CB_SET_STATE(newstate, event) \ { \ LONG lIncIndex; \ \ _CB.state = newstate; \ \ lIncIndex = InterlockedIncrement(&g_uiDbgPosition); \ g_rguiDbgLastClipState[lIncIndex % DBG_RECORD_SIZE] = newstate; \ g_rguiDbgLastClipEvent[lIncIndex % DBG_RECORD_SIZE] = event; \ } #endif // CLIP_TRANSITION_RECORDING // GetDataSync EVENTS #define TS_RECEIVE_COMPLETED 0 #define TS_RESET_EVENT 1 #define TS_NUM_EVENTS 2 #include #include #include "cclipdat.h" // // Clip Class Definitions // class CClip { friend CClipData ; public: CClip(VCManager *virtualChannelMgr); ~CClip() {;} DCUINT DCINTERNAL ClipCheckState(DCUINT event); PTS_CLIP_PDU DCINTERNAL ClipGetPermBuf(DCVOID); DCVOID DCINTERNAL ClipFreeBuf(PDCUINT8 pBuf); DCBOOL DCINTERNAL ClipDrawClipboard(DCBOOL mustSend); #ifndef OS_WINCE HANDLE DCINTERNAL ClipGetMFData(HANDLE hData, PDCUINT32 pDataLen); HANDLE DCINTERNAL ClipSetMFData(DCUINT32 dataLen, PDCVOID pData); #endif HANDLE DCINTERNAL ClipBitmapToDIB(HANDLE hData, PDCUINT32 pDataLen); DCBOOL DCINTERNAL ClipIsExcludedFormat(PDCTCHAR formatName) ; DCVOID DCINTERNAL ClipOnFormatList(PTS_CLIP_PDU pClipPDU); DCVOID DCINTERNAL ClipOnFormatListResponse(PTS_CLIP_PDU pClipPDU); DCVOID DCINTERNAL ClipOnFormatRequest(PTS_CLIP_PDU pClipPDU); DCVOID DCINTERNAL ClipOnFormatDataComplete(PTS_CLIP_PDU pClipPDU); DCUINT DCINTERNAL ClipRemoteFormatFromLocalID(DCUINT id); DCVOID DCINTERNAL ClipOnWriteComplete(LPVOID pData); DCVOID DCAPI ClipMain(DCVOID) ; DCINT DCAPI ClipOnInit(DCVOID); DCINT32 DCAPI ClipOnInitialized(DCVOID); DCBOOL DCAPI ClipOnTerm(LPVOID pInitHandle); VOID DCINTERNAL ClipOnConnected(LPVOID pInitHandle); VOID DCINTERNAL ClipOnMonitorReady(VOID); VOID DCINTERNAL ClipOnDisconnected(LPVOID pInitHandle); DCVOID DCAPI ClipOnDataReceived(LPVOID pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags); DCVOID DCINTERNAL ClipOnFormatListWrapper(LPVOID pData, UINT32 dataLength) ; DCVOID DCAPI ClipDecoupleToClip (PTS_CLIP_PDU pData) ; DCINT DCAPI ClipGetData (DCUINT cfFormat) ; LRESULT CALLBACK DCEXPORT DCLOADDS ClipViewerWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK DCEXPORT DCLOADDS StaticClipViewerWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); VOID VCAPITYPE VCEXPORT ClipInitEventFn(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength); static VOID VCAPITYPE VCEXPORT DCLOADDS ClipOpenEventFnEx(LPVOID lpUserParam, DWORD openHandle, UINT event, LPVOID pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags); VOID VCAPITYPE VCEXPORT DCLOADDS ClipInternalOpenEventFn(DWORD openHandle, UINT event, LPVOID pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags); BOOL VCAPITYPE VCEXPORT ClipChannelEntry(PCHANNEL_ENTRY_POINTS_EX pEntryPoints); VOID SetVCInitHandle(LPVOID pHandle) {_CB.initHandle = pHandle;} HRESULT ClipCreateDataSyncEvents() ; DCUINT GetOsMinorType() ; int ClipCleanTempPath() ; BOOL ClipSetAndSendTempDirectory(void) ; int ClipCopyToTempDirectory(PVOID pSrcFiles, BOOL wide) ; int ClipCopyToTempDirectoryW(PVOID pSrcFiles) ; int ClipCopyToTempDirectoryA(PVOID pSrcFiles) ; UINT ClipGetNewFilePathLength(PVOID pData, BOOL fWide) ; UINT ClipGetNewFilePathLengthW(WCHAR* wszOldFilepath) ; UINT ClipGetNewFilePathLengthA(char* szOldFilepath) ; HRESULT ClipConvertToTempPathW(PVOID pOldData, PVOID pData, ULONG cchData) ; HRESULT ClipConvertToTempPathA(PVOID pOldData, PVOID pData, ULONG cchData) ; HRESULT ClipConvertToTempPath(PVOID pOldData, PVOID pData, ULONG cbData, BOOL wide) ; ULONG ClipGetNewDropfilesSizeW(PVOID pData, ULONG oldSize) ; ULONG ClipGetNewDropfilesSizeA(PVOID pData, ULONG oldSize) ; ULONG ClipGetNewDropfilesSize(PVOID pData, ULONG oldSize, BOOL wide) ; DWORD GetDropEffect() { return _CB.dropEffect ;} void SetDropEffect(DWORD dwDropEffect) { _CB.dropEffect = dwDropEffect ;} #ifdef OS_WINCE DCVOID ClipFixupRichTextFormats(UINT uRtf1, UINT uRtf2); #endif private: CLIP_DATA _CB; PCClipData _pClipData ; CUT* _pUtObject ; VCManager* _pVCMgr; public: // _GetDataSync is an array of event handles used to synchronize the // transmission of data from the remote and local clipboard via the // IDataObject::GetData interface function // _GetDataSync[TS_RECEIVE_COMPLETED] is signaled when the format data is // received in full over the wire // _GetDataSync[TS_RESET_EVENT] is signaled when we need to reset the // Clipboard thread when its waiting for format data HANDLE _GetDataSync[TS_NUM_EVENTS] ; inline BOOL IsDataSyncReady() { return _GetDataSync[TS_RECEIVE_COMPLETED] && _GetDataSync[TS_RESET_EVENT]; } }; typedef CClip *PCClip ; /* Thread Proc for Clip */ static DCVOID DCAPI ClipStaticMain(PDCVOID param); #endif /* _H_CCLIP */