Leaked source code of windows server 2003
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.

316 lines
13 KiB

  1. /**INC+**********************************************************************/
  2. /* Header: cclip.h */
  3. /* */
  4. /* Purpose: Clip Client Addin header */
  5. /* */
  6. /* Copyright(C) Microsoft Corporation 1998-1999 */
  7. /* */
  8. /**INC-**********************************************************************/
  9. #ifndef _H_CCLIP
  10. #define _H_CCLIP
  11. #ifndef INITGUID
  12. #define INITGUID
  13. #include <initguid.h>
  14. #else
  15. #include <initguid.h>
  16. #endif
  17. #ifndef PPVOID
  18. typedef LPVOID * PPVOID;
  19. #endif //PPVOID
  20. class CImpIDataObject;
  21. typedef class CImpIDataObject *PIMPIDATAOBJECT;
  22. #ifdef OS_WINCE
  23. extern "C" HWND ghwndClip;
  24. #endif
  25. #ifdef DC_DEBUG
  26. #define CLIP_TRANSITION_RECORDING
  27. #endif // DC_DEBUG
  28. #ifdef CLIP_TRANSITION_RECORDING
  29. #define DBG_RECORD_SIZE 128
  30. extern UINT g_rguiDbgLastClipState[DBG_RECORD_SIZE];
  31. extern UINT g_rguiDbgLastClipEvent[DBG_RECORD_SIZE];
  32. extern LONG g_uiDbgPosition;
  33. #endif // CLIP_TRANSITION_RECORDING
  34. // Number of milliseconds before our IDataObject::GetData will timeout/fail
  35. #define CLIP_GETDATA_TIMEOUT 5000
  36. /****************************************************************************/
  37. /* Format mapping structure */
  38. /****************************************************************************/
  39. typedef struct tagCB_FORMAT_MAP
  40. {
  41. DCUINT clientID;
  42. DCUINT serverID;
  43. } CB_FORMAT_MAP, FAR * PCB_FORMAT_MAP;
  44. /****************************************************************************/
  45. /* Maximum number of formats we support */
  46. /****************************************************************************/
  47. #define CB_MAX_FORMATS 100
  48. /****************************************************************************/
  49. /* CB window class */
  50. /****************************************************************************/
  51. #define CB_VIEWER_CLASS _T("CBViewerClass")
  52. /****************************************************************************/
  53. // Our user event
  54. /****************************************************************************/
  55. #define WM_USER_CHANGE_THREAD (WM_USER + 42)
  56. #define WM_USER_CLEANUP_ON_TERM (WM_USER + 43)
  57. /****************************************************************************/
  58. /* */
  59. /* CB states */
  60. /* */
  61. /****************************************************************************/
  62. #define CB_STATE_NOT_INIT 0
  63. #define CB_STATE_INITIALIZED 1
  64. #define CB_STATE_ENABLED 2
  65. #define CB_STATE_LOCAL_CB_OWNER 3
  66. #define CB_STATE_SHARED_CB_OWNER 4
  67. #define CB_STATE_PENDING_FORMAT_LIST_RSP 5
  68. #define CB_STATE_SENDING_FORMAT_DATA 6
  69. #define CB_STATE_PENDING_FORMAT_DATA_RSP 7
  70. #define CB_NUMSTATES 8
  71. /****************************************************************************/
  72. /* */
  73. /* CB events */
  74. /* */
  75. /****************************************************************************/
  76. #define CB_EVENT_CB_INIT 0
  77. #define CB_EVENT_CB_ENABLE 1
  78. #define CB_EVENT_CB_DISABLE 2
  79. #define CB_EVENT_CB_TERM 3
  80. #define CB_EVENT_WM_CREATE 4
  81. #define CB_EVENT_WM_DESTROY 5
  82. #define CB_EVENT_WM_CHANGECBCHAIN 6
  83. #define CB_EVENT_WM_DRAWCLIPBOARD 7
  84. #define CB_EVENT_WM_RENDERFORMAT 8
  85. #define CB_EVENT_FORMAT_LIST 9
  86. #define CB_EVENT_FORMAT_LIST_RSP 10
  87. #define CB_EVENT_FORMAT_DATA_RQ 11
  88. #define CB_EVENT_FORMAT_DATA_RSP 12
  89. #define CB_TRACE_EVENT_CB_CLIPMAIN 13
  90. #define CB_TRACE_EVENT_CB_MONITOR_READY 14
  91. #define CB_TRACE_EVENT_CB_DISCONNECT 15
  92. #define CB_TRACE_EVENT_WM_EMPTY_CLIPBOARD 16
  93. #define CB_NUMEVENTS 13
  94. /****************************************************************************/
  95. /* Values in the state table */
  96. /****************************************************************************/
  97. #define CB_TABLE_OK 0
  98. #define CB_TABLE_WARN 1
  99. #define CB_TABLE_ERROR 2
  100. /****************************************************************************/
  101. /* Clipboard Viewer Window Messages */
  102. /****************************************************************************/
  103. #define WM_EMPTY_CLIPBOARD WM_APP+1
  104. #define WM_CLOSE_CLIPBOARD WM_APP+2
  105. /****************************************************************************/
  106. /* Macros */
  107. /****************************************************************************/
  108. /****************************************************************************/
  109. /* CB_CHECK_STATE - macro version with DC_QUIT */
  110. /****************************************************************************/
  111. #define CB_CHECK_STATE(event) \
  112. { \
  113. if (ClipCheckState(event) == CB_TABLE_ERROR) \
  114. { \
  115. DC_QUIT; \
  116. } \
  117. } \
  118. /****************************************************************************/
  119. /* CB_SET_STATE - set the CB state */
  120. /****************************************************************************/
  121. #ifndef CLIP_TRANSITION_RECORDING
  122. #define CB_SET_STATE(newstate, event) \
  123. { \
  124. TRC_NRM((TB, _T("Set state from %s to %s"), \
  125. cbState[_CB.state], cbState[newstate])); \
  126. _CB.state = newstate; \
  127. }
  128. #else
  129. #define CB_SET_STATE(newstate, event) \
  130. { \
  131. LONG lIncIndex; \
  132. \
  133. _CB.state = newstate; \
  134. \
  135. lIncIndex = InterlockedIncrement(&g_uiDbgPosition); \
  136. g_rguiDbgLastClipState[lIncIndex % DBG_RECORD_SIZE] = newstate; \
  137. g_rguiDbgLastClipEvent[lIncIndex % DBG_RECORD_SIZE] = event; \
  138. }
  139. #endif // CLIP_TRANSITION_RECORDING
  140. // GetDataSync EVENTS
  141. #define TS_RECEIVE_COMPLETED 0
  142. #define TS_RESET_EVENT 1
  143. #define TS_NUM_EVENTS 2
  144. #include <atrcapi.h>
  145. #include <autil.h>
  146. #include "cclipdat.h"
  147. //
  148. // Clip Class Definitions
  149. //
  150. class CClip
  151. {
  152. friend CClipData ;
  153. public:
  154. CClip(VCManager *virtualChannelMgr);
  155. ~CClip() {;}
  156. DCUINT DCINTERNAL ClipCheckState(DCUINT event);
  157. PTS_CLIP_PDU DCINTERNAL ClipGetPermBuf(DCVOID);
  158. DCVOID DCINTERNAL ClipFreeBuf(PDCUINT8 pBuf);
  159. DCBOOL DCINTERNAL ClipDrawClipboard(DCBOOL mustSend);
  160. #ifndef OS_WINCE
  161. HANDLE DCINTERNAL ClipGetMFData(HANDLE hData,
  162. PDCUINT32 pDataLen);
  163. HANDLE DCINTERNAL ClipSetMFData(DCUINT32 dataLen,
  164. PDCVOID pData);
  165. #endif
  166. HANDLE DCINTERNAL ClipBitmapToDIB(HANDLE hData, PDCUINT32 pDataLen);
  167. DCBOOL DCINTERNAL ClipIsExcludedFormat(PDCTCHAR formatName) ;
  168. DCVOID DCINTERNAL ClipOnFormatList(PTS_CLIP_PDU pClipPDU);
  169. DCVOID DCINTERNAL ClipOnFormatListResponse(PTS_CLIP_PDU pClipPDU);
  170. DCVOID DCINTERNAL ClipOnFormatRequest(PTS_CLIP_PDU pClipPDU);
  171. DCVOID DCINTERNAL ClipOnFormatDataComplete(PTS_CLIP_PDU pClipPDU);
  172. DCUINT DCINTERNAL ClipRemoteFormatFromLocalID(DCUINT id);
  173. DCVOID DCINTERNAL ClipOnWriteComplete(LPVOID pData);
  174. DCVOID DCAPI ClipMain(DCVOID) ;
  175. DCINT DCAPI ClipOnInit(DCVOID);
  176. DCINT32 DCAPI ClipOnInitialized(DCVOID);
  177. DCBOOL DCAPI ClipOnTerm(LPVOID pInitHandle);
  178. VOID DCINTERNAL ClipOnConnected(LPVOID pInitHandle);
  179. VOID DCINTERNAL ClipOnMonitorReady(VOID);
  180. VOID DCINTERNAL ClipOnDisconnected(LPVOID pInitHandle);
  181. DCVOID DCAPI ClipOnDataReceived(LPVOID pData,
  182. UINT32 dataLength,
  183. UINT32 totalLength,
  184. UINT32 dataFlags);
  185. DCVOID DCINTERNAL ClipOnFormatListWrapper(LPVOID pData, UINT32 dataLength) ;
  186. DCVOID DCAPI ClipDecoupleToClip (PTS_CLIP_PDU pData) ;
  187. DCINT DCAPI ClipGetData (DCUINT cfFormat) ;
  188. LRESULT CALLBACK DCEXPORT DCLOADDS ClipViewerWndProc(HWND hwnd,
  189. UINT message,
  190. WPARAM wParam,
  191. LPARAM lParam);
  192. static LRESULT CALLBACK DCEXPORT DCLOADDS StaticClipViewerWndProc(HWND hwnd,
  193. UINT message,
  194. WPARAM wParam,
  195. LPARAM lParam);
  196. VOID VCAPITYPE VCEXPORT ClipInitEventFn(LPVOID pInitHandle,
  197. UINT event,
  198. LPVOID pData,
  199. UINT dataLength);
  200. static VOID VCAPITYPE VCEXPORT DCLOADDS ClipOpenEventFnEx(LPVOID lpUserParam,
  201. DWORD openHandle,
  202. UINT event,
  203. LPVOID pData,
  204. UINT32 dataLength,
  205. UINT32 totalLength,
  206. UINT32 dataFlags);
  207. VOID VCAPITYPE VCEXPORT DCLOADDS ClipInternalOpenEventFn(DWORD openHandle,
  208. UINT event,
  209. LPVOID pData,
  210. UINT32 dataLength,
  211. UINT32 totalLength,
  212. UINT32 dataFlags);
  213. BOOL VCAPITYPE VCEXPORT ClipChannelEntry(PCHANNEL_ENTRY_POINTS_EX pEntryPoints);
  214. VOID SetVCInitHandle(LPVOID pHandle) {_CB.initHandle = pHandle;}
  215. HRESULT ClipCreateDataSyncEvents() ;
  216. DCUINT GetOsMinorType() ;
  217. int ClipCleanTempPath() ;
  218. BOOL ClipSetAndSendTempDirectory(void) ;
  219. int ClipCopyToTempDirectory(PVOID pSrcFiles, BOOL wide) ;
  220. int ClipCopyToTempDirectoryW(PVOID pSrcFiles) ;
  221. int ClipCopyToTempDirectoryA(PVOID pSrcFiles) ;
  222. UINT ClipGetNewFilePathLength(PVOID pData, BOOL fWide) ;
  223. UINT ClipGetNewFilePathLengthW(WCHAR* wszOldFilepath) ;
  224. UINT ClipGetNewFilePathLengthA(char* szOldFilepath) ;
  225. HRESULT ClipConvertToTempPathW(PVOID pOldData, PVOID pData, ULONG cchData) ;
  226. HRESULT ClipConvertToTempPathA(PVOID pOldData, PVOID pData, ULONG cchData) ;
  227. HRESULT ClipConvertToTempPath(PVOID pOldData, PVOID pData, ULONG cbData, BOOL wide) ;
  228. ULONG ClipGetNewDropfilesSizeW(PVOID pData, ULONG oldSize) ;
  229. ULONG ClipGetNewDropfilesSizeA(PVOID pData, ULONG oldSize) ;
  230. ULONG ClipGetNewDropfilesSize(PVOID pData, ULONG oldSize, BOOL wide) ;
  231. DWORD GetDropEffect() { return _CB.dropEffect ;}
  232. void SetDropEffect(DWORD dwDropEffect) { _CB.dropEffect = dwDropEffect ;}
  233. #ifdef OS_WINCE
  234. DCVOID ClipFixupRichTextFormats(UINT uRtf1, UINT uRtf2);
  235. #endif
  236. private:
  237. CLIP_DATA _CB;
  238. PCClipData _pClipData ;
  239. CUT* _pUtObject ;
  240. VCManager* _pVCMgr;
  241. public:
  242. // _GetDataSync is an array of event handles used to synchronize the
  243. // transmission of data from the remote and local clipboard via the
  244. // IDataObject::GetData interface function
  245. // _GetDataSync[TS_RECEIVE_COMPLETED] is signaled when the format data is
  246. // received in full over the wire
  247. // _GetDataSync[TS_RESET_EVENT] is signaled when we need to reset the
  248. // Clipboard thread when its waiting for format data
  249. HANDLE _GetDataSync[TS_NUM_EVENTS] ;
  250. inline BOOL IsDataSyncReady() {
  251. return _GetDataSync[TS_RECEIVE_COMPLETED] && _GetDataSync[TS_RESET_EVENT];
  252. }
  253. };
  254. typedef CClip *PCClip ;
  255. /* Thread Proc for Clip */
  256. static DCVOID DCAPI ClipStaticMain(PDCVOID param);
  257. #endif /* _H_CCLIP */