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.

511 lines
15 KiB

  1. /****************************** Module Header ******************************\
  2. * Module Name: Pbhandlr.C -- Native data based handler (for Pbrush server)
  3. *
  4. * PURPOSE: Contains handler routines for Pbrush server. This handler makes
  5. * use of most of the standard library methods. It replaces only the "Draw",
  6. * "QueryBounds", "CopyToClipboard" methods of the OLE object. Note that this
  7. * handler draws the picture from the native data.
  8. *
  9. * Created: December 1990
  10. *
  11. * Copyright (c) 1990 Microsoft Corporation
  12. *
  13. * History:
  14. * SriniK (../12/1990) Original
  15. *
  16. \***************************************************************************/
  17. #include <windows.h>
  18. #include "dll.h"
  19. OLESTATUS FAR PASCAL _loadds PbDraw (LPOLEOBJECT, HDC, LPRECT, LPRECT, HDC);
  20. OLESTATUS FAR PASCAL _loadds PbQueryBounds (LPOLEOBJECT, LPRECT);
  21. OLESTATUS FAR PASCAL _loadds PbCopyToClipboard (LPOLEOBJECT);
  22. OLESTATUS FAR PASCAL _loadds PbGetData (LPOLEOBJECT, OLECLIPFORMAT, HANDLE FAR *);
  23. OLECLIPFORMAT FAR PASCAL _loadds PbEnumFormats (LPOLEOBJECT, OLECLIPFORMAT);
  24. extern OLESTATUS FARINTERNAL wDibDraw (HANDLE, HDC, LPRECT, LPRECT, HDC, BOOL);
  25. void PbGetExtents (LPSTR, LPPOINT);
  26. void PbReplaceFunctions (LPOLEOBJECT);
  27. HANDLE PbGetPicture (LPOLEOBJECT);
  28. BOOL IsStandardPict (LPOLEOBJECT);
  29. extern void FARINTERNAL DibGetExtents(LPSTR, LPPOINT);
  30. OLEOBJECTVTBL vtblDLL;
  31. extern OLECLIPFORMAT cfOwnerLink;
  32. extern OLECLIPFORMAT cfObjectLink;
  33. extern OLECLIPFORMAT cfNative;
  34. OLESTATUS (FAR PASCAL *DefQueryBounds) (LPVOID, LPRECT);
  35. OLESTATUS (FAR PASCAL *DefDraw) (LPVOID, HDC, LPRECT, LPRECT, HDC);
  36. OLESTATUS (FAR PASCAL *DefCopyToClipboard) (LPVOID);
  37. OLECLIPFORMAT (FAR PASCAL *DefEnumFormats) (LPVOID, OLECLIPFORMAT);
  38. OLESTATUS (FAR PASCAL *DefGetData) (LPVOID, OLECLIPFORMAT, HANDLE FAR *);
  39. OLESTATUS FAR PASCAL PbLoadFromStream (lpstream, lpprotocol, lpclient, lhclientdoc, lpobjname, lplpobj, objType, aClass, cfFormat)
  40. LPOLESTREAM lpstream;
  41. LPSTR lpprotocol;
  42. LPOLECLIENT lpclient;
  43. LHCLIENTDOC lhclientdoc;
  44. LPSTR lpobjname;
  45. LPOLEOBJECT FAR * lplpobj;
  46. LONG objType;
  47. ATOM aClass;
  48. OLECLIPFORMAT cfFormat;
  49. {
  50. OLESTATUS retVal;
  51. if (objType == OT_LINK)
  52. retVal = DefLoadFromStream (lpstream, lpprotocol, lpclient,
  53. lhclientdoc, lpobjname, lplpobj,
  54. objType, aClass, cfNative);
  55. else
  56. retVal = DefLoadFromStream (lpstream, lpprotocol, lpclient,
  57. lhclientdoc, lpobjname, lplpobj,
  58. objType, aClass, cfFormat);
  59. if (retVal <= OLE_WAIT_FOR_RELEASE)
  60. PbReplaceFunctions (*lplpobj);
  61. return retVal;
  62. }
  63. OLESTATUS FAR PASCAL PbCreateFromClip (lpprotocol, lpclient, lhclientdoc, lpobjname, lplpobj, optRender, cfFormat, objType)
  64. LPSTR lpprotocol;
  65. LPOLECLIENT lpclient;
  66. LHCLIENTDOC lhclientdoc;
  67. LPSTR lpobjname;
  68. LPOLEOBJECT FAR * lplpobj;
  69. OLEOPT_RENDER optRender;
  70. OLECLIPFORMAT cfFormat;
  71. LONG objType;
  72. {
  73. OLESTATUS retVal;
  74. if ((optRender == olerender_draw)
  75. && (IsClipboardFormatAvailable (cfNative))) {
  76. if (objType == OT_EMBEDDED)
  77. retVal = DefCreateFromClip (lpprotocol, lpclient,
  78. lhclientdoc, lpobjname, lplpobj,
  79. olerender_none, NULL, objType);
  80. else
  81. retVal = DefCreateFromClip (lpprotocol, lpclient,
  82. lhclientdoc, lpobjname, lplpobj,
  83. olerender_format, cfNative, objType);
  84. }
  85. else {
  86. retVal = DefCreateFromClip (lpprotocol, lpclient,
  87. lhclientdoc, lpobjname, lplpobj,
  88. optRender, cfFormat, objType);
  89. }
  90. if (retVal <= OLE_WAIT_FOR_RELEASE)
  91. PbReplaceFunctions (*lplpobj);
  92. return retVal;
  93. }
  94. OLESTATUS FAR PASCAL PbCreateLinkFromClip (lpprotocol, lpclient, lhclientdoc, lpobjname, lplpobj, optRender, cfFormat)
  95. LPSTR lpprotocol;
  96. LPOLECLIENT lpclient;
  97. LHCLIENTDOC lhclientdoc;
  98. LPSTR lpobjname;
  99. LPOLEOBJECT FAR * lplpobj;
  100. OLEOPT_RENDER optRender;
  101. OLECLIPFORMAT cfFormat;
  102. {
  103. OLESTATUS retVal;
  104. if ((optRender == olerender_draw)
  105. && (IsClipboardFormatAvailable (cfNative))) {
  106. retVal = DefCreateLinkFromClip (lpprotocol, lpclient,
  107. lhclientdoc, lpobjname, lplpobj,
  108. olerender_format, cfNative);
  109. }
  110. else {
  111. retVal = DefCreateLinkFromClip (lpprotocol, lpclient,
  112. lhclientdoc, lpobjname, lplpobj,
  113. optRender, cfFormat);
  114. }
  115. if (retVal <= OLE_WAIT_FOR_RELEASE)
  116. PbReplaceFunctions (*lplpobj);
  117. return retVal;
  118. }
  119. OLESTATUS FAR PASCAL PbCreateFromTemplate (lpprotocol, lpclient, lptemplate, lhclientdoc, lpobjname, lplpobj, optRender, cfFormat)
  120. LPSTR lpprotocol;
  121. LPOLECLIENT lpclient;
  122. LPSTR lptemplate;
  123. LHCLIENTDOC lhclientdoc;
  124. LPSTR lpobjname;
  125. LPOLEOBJECT FAR * lplpobj;
  126. OLEOPT_RENDER optRender;
  127. OLECLIPFORMAT cfFormat;
  128. {
  129. OLESTATUS retVal;
  130. if (optRender == olerender_draw)
  131. retVal = DefCreateFromTemplate (lpprotocol, lpclient, lptemplate,
  132. lhclientdoc, lpobjname, lplpobj,
  133. olerender_none, NULL);
  134. else
  135. retVal = DefCreateFromTemplate (lpprotocol, lpclient, lptemplate,
  136. lhclientdoc, lpobjname, lplpobj,
  137. optRender, cfFormat);
  138. if (retVal <= OLE_WAIT_FOR_RELEASE)
  139. PbReplaceFunctions (*lplpobj);
  140. return retVal;
  141. }
  142. OLESTATUS FAR PASCAL PbCreate (lpprotocol, lpclient, lpclass, lhclientdoc, lpobjname, lplpobj, optRender, cfFormat)
  143. LPSTR lpprotocol;
  144. LPOLECLIENT lpclient;
  145. LPSTR lpclass;
  146. LHCLIENTDOC lhclientdoc;
  147. LPSTR lpobjname;
  148. LPOLEOBJECT FAR * lplpobj;
  149. OLEOPT_RENDER optRender;
  150. OLECLIPFORMAT cfFormat;
  151. {
  152. OLESTATUS retVal;
  153. if (optRender == olerender_draw)
  154. retVal = DefCreate (lpprotocol, lpclient, lpclass,
  155. lhclientdoc, lpobjname, lplpobj,
  156. olerender_none, NULL);
  157. else
  158. retVal = DefCreate (lpprotocol, lpclient, lpclass,
  159. lhclientdoc, lpobjname, lplpobj,
  160. optRender, cfFormat);
  161. if (retVal <= OLE_WAIT_FOR_RELEASE)
  162. PbReplaceFunctions (*lplpobj);
  163. return retVal;
  164. }
  165. OLESTATUS FAR PASCAL PbCreateFromFile (lpprotocol, lpclient, lpclass, lpfile, lhclientdoc, lpobjname, lplpobj, optRender, cfFormat)
  166. LPSTR lpprotocol;
  167. LPOLECLIENT lpclient;
  168. LPSTR lpclass;
  169. LPSTR lpfile;
  170. LHCLIENTDOC lhclientdoc;
  171. LPSTR lpobjname;
  172. LPOLEOBJECT FAR * lplpobj;
  173. OLEOPT_RENDER optRender;
  174. OLECLIPFORMAT cfFormat;
  175. {
  176. OLESTATUS retVal;
  177. if (optRender == olerender_draw)
  178. retVal = DefCreateFromFile (lpprotocol, lpclient, lpclass, lpfile,
  179. lhclientdoc, lpobjname, lplpobj,
  180. olerender_none, NULL);
  181. else
  182. retVal = DefCreateFromFile (lpprotocol, lpclient, lpclass, lpfile,
  183. lhclientdoc, lpobjname, lplpobj,
  184. optRender, cfFormat);
  185. if (retVal <= OLE_WAIT_FOR_RELEASE)
  186. PbReplaceFunctions (*lplpobj);
  187. return retVal;
  188. }
  189. OLESTATUS FAR PASCAL PbCreateLinkFromFile (lpprotocol, lpclient, lpclass, lpfile, lpitem, lhclientdoc, lpobjname, lplpobj, optRender, cfFormat)
  190. LPSTR lpprotocol;
  191. LPOLECLIENT lpclient;
  192. LPSTR lpclass;
  193. LPSTR lpfile;
  194. LPSTR lpitem;
  195. LHCLIENTDOC lhclientdoc;
  196. LPSTR lpobjname;
  197. LPOLEOBJECT FAR * lplpobj;
  198. OLEOPT_RENDER optRender;
  199. OLECLIPFORMAT cfFormat;
  200. {
  201. OLESTATUS retVal;
  202. if (optRender == olerender_draw)
  203. retVal = DefCreateLinkFromFile (lpprotocol, lpclient,
  204. lpclass, lpfile, lpitem,
  205. lhclientdoc, lpobjname, lplpobj,
  206. olerender_format, cfNative);
  207. else
  208. retVal = DefCreateLinkFromFile (lpprotocol, lpclient,
  209. lpclass, lpfile, lpitem,
  210. lhclientdoc, lpobjname, lplpobj,
  211. optRender, cfFormat);
  212. if (retVal <= OLE_WAIT_FOR_RELEASE)
  213. PbReplaceFunctions (*lplpobj);
  214. return retVal;
  215. }
  216. OLESTATUS FAR PASCAL PbCreateInvisible (lpprotocol, lpclient, lpclass, lhclientdoc, lpobjname, lplpobj, optRender, cfFormat, fActivate)
  217. LPSTR lpprotocol;
  218. LPOLECLIENT lpclient;
  219. LPSTR lpclass;
  220. LHCLIENTDOC lhclientdoc;
  221. LPSTR lpobjname;
  222. LPOLEOBJECT FAR * lplpobj;
  223. OLEOPT_RENDER optRender;
  224. OLECLIPFORMAT cfFormat;
  225. BOOL fActivate;
  226. {
  227. OLESTATUS retVal;
  228. if (optRender == olerender_draw)
  229. retVal = DefCreateInvisible (lpprotocol, lpclient, lpclass,
  230. lhclientdoc, lpobjname, lplpobj,
  231. olerender_none, NULL, fActivate);
  232. else
  233. retVal = DefCreateInvisible (lpprotocol, lpclient, lpclass,
  234. lhclientdoc, lpobjname, lplpobj,
  235. optRender, cfFormat, fActivate);
  236. if (retVal <= OLE_WAIT_FOR_RELEASE)
  237. PbReplaceFunctions (*lplpobj);
  238. return retVal;
  239. }
  240. void PbReplaceFunctions (lpobj)
  241. LPOLEOBJECT lpobj;
  242. {
  243. if (IsStandardPict (lpobj))
  244. return;
  245. vtblDLL = *lpobj->lpvtbl;
  246. lpobj->lpvtbl = (LPOLEOBJECTVTBL) &vtblDLL;
  247. DefDraw = lpobj->lpvtbl->Draw;
  248. DefQueryBounds = lpobj->lpvtbl->QueryBounds;
  249. DefCopyToClipboard = lpobj->lpvtbl->CopyToClipboard;
  250. DefEnumFormats = lpobj->lpvtbl->EnumFormats;
  251. DefGetData = lpobj->lpvtbl->GetData;
  252. lpobj->lpvtbl->Draw = PbDraw;
  253. lpobj->lpvtbl->QueryBounds = PbQueryBounds;
  254. lpobj->lpvtbl->CopyToClipboard = PbCopyToClipboard;
  255. lpobj->lpvtbl->EnumFormats = PbEnumFormats;
  256. lpobj->lpvtbl->GetData = PbGetData;
  257. }
  258. OLESTATUS FAR PASCAL _loadds PbQueryBounds (lpobj, lprc)
  259. LPOLEOBJECT lpobj;
  260. LPRECT lprc;
  261. {
  262. OLESTATUS retVal;
  263. HANDLE hData;
  264. LPSTR lpData;
  265. POINT point;
  266. if ((retVal = (*DefQueryBounds) (lpobj, lprc)) == OLE_OK) {
  267. if (lprc->top || lprc->bottom || lprc->right || lprc->left)
  268. return OLE_OK;
  269. }
  270. if ((*DefGetData) (lpobj, cfNative, &hData) != OLE_OK)
  271. return retVal;
  272. if (!hData)
  273. return OLE_ERROR_BLANK;
  274. if (!(lpData = GlobalLock (hData)))
  275. return OLE_ERROR_MEMORY;
  276. DibGetExtents ((lpData+sizeof(BITMAPFILEHEADER)), &point);
  277. GlobalUnlock (hData);
  278. lprc->left = 0;
  279. lprc->top = 0;
  280. lprc->right = point.x;
  281. lprc->bottom = point.y;
  282. return OLE_OK;
  283. }
  284. OLESTATUS FAR PASCAL _loadds PbDraw (lpobj, hdc, lprc, lpWrc, hdcTarget)
  285. LPOLEOBJECT lpobj;
  286. HDC hdc;
  287. LPRECT lprc;
  288. LPRECT lpWrc;
  289. HDC hdcTarget;
  290. {
  291. HANDLE hData;
  292. if ((*DefGetData) (lpobj, cfNative, &hData) != OLE_OK)
  293. return (*DefDraw) (lpobj, hdc, lprc, lpWrc, hdcTarget);
  294. return wDibDraw (hData, hdc, lprc, lpWrc, hdcTarget, TRUE);
  295. }
  296. OLECLIPFORMAT FAR PASCAL _loadds PbEnumFormats (lpobj, cfFormat)
  297. LPOLEOBJECT lpobj;
  298. OLECLIPFORMAT cfFormat;
  299. {
  300. OLECLIPFORMAT retFormat = NULL;
  301. if (cfFormat == CF_METAFILEPICT)
  302. return NULL;
  303. if (!(retFormat = (*DefEnumFormats) (lpobj, cfFormat)))
  304. return CF_METAFILEPICT;
  305. return retFormat;
  306. }
  307. OLESTATUS FAR PASCAL _loadds PbGetData (lpobj, cfFormat, lpHandle)
  308. LPOLEOBJECT lpobj;
  309. OLECLIPFORMAT cfFormat;
  310. HANDLE FAR * lpHandle;
  311. {
  312. OLESTATUS retval;
  313. retval = (*DefGetData) (lpobj, cfFormat, lpHandle);
  314. if (retval == OLE_OK || retval == OLE_BUSY || retval == OLE_ERROR_BLANK)
  315. return retval;
  316. if (cfFormat == CF_METAFILEPICT) {
  317. if (*lpHandle = PbGetPicture (lpobj))
  318. return OLE_WARN_DELETE_DATA;
  319. return OLE_ERROR_MEMORY;
  320. }
  321. return OLE_ERROR_FORMAT;
  322. }
  323. OLESTATUS FAR PASCAL _loadds PbCopyToClipboard (lpobj)
  324. LPOLEOBJECT lpobj;
  325. {
  326. OLESTATUS retVal;
  327. HANDLE hPict;
  328. if ((retVal = (*DefCopyToClipboard) (lpobj)) == OLE_OK) {
  329. if (hPict = PbGetPicture (lpobj))
  330. SetClipboardData (CF_METAFILEPICT, hPict);
  331. else
  332. retVal = OLE_ERROR_MEMORY;
  333. }
  334. return retVal;
  335. }
  336. HANDLE PbGetPicture (lpobj)
  337. LPOLEOBJECT lpobj;
  338. {
  339. HANDLE hMF, hMfp, hData;
  340. RECT rc = {0, 0, 0, 0};
  341. POINT point;
  342. HDC hMetaDC;
  343. LPMETAFILEPICT lpmfp;
  344. OLESTATUS retVal;
  345. LPSTR lpData;
  346. if ((*DefGetData) (lpobj, cfNative, &hData) != OLE_OK)
  347. return NULL;
  348. if (!hData)
  349. return NULL;
  350. if (!(lpData = GlobalLock (hData)))
  351. return NULL;
  352. lpData += sizeof(BITMAPFILEHEADER);
  353. rc.right = (int) ((LPBITMAPINFOHEADER)lpData)->biWidth;
  354. rc.bottom = (int) ((LPBITMAPINFOHEADER)lpData)->biHeight;
  355. DibGetExtents(lpData, &point);
  356. GlobalUnlock (hData);
  357. if (!(hMetaDC = CreateMetaFile (NULL)))
  358. return NULL;
  359. SetWindowOrg (hMetaDC, 0, 0);
  360. SetWindowExt (hMetaDC, rc.right, rc.bottom);
  361. retVal = PbDraw (lpobj, hMetaDC, &rc, NULL, NULL);
  362. hMF = CloseMetaFile (hMetaDC);
  363. if (retVal != OLE_OK)
  364. goto error;
  365. if (hMF && (hMfp = GlobalAlloc (GMEM_MOVEABLE, sizeof(METAFILEPICT)))
  366. && (lpmfp = (LPMETAFILEPICT) GlobalLock (hMfp))) {
  367. lpmfp->hMF = hMF;
  368. lpmfp->xExt = point.x;
  369. lpmfp->yExt = -point.y;
  370. lpmfp->mm = MM_ANISOTROPIC;
  371. GlobalUnlock (hMfp);
  372. return hMfp;
  373. }
  374. error:
  375. if (hMF)
  376. DeleteMetaFile (hMF);
  377. if (hMfp)
  378. GlobalFree (hMfp);
  379. return NULL;
  380. }
  381. // normal handler can't do this. since this handler is part of olecli.dll, we
  382. // we are doing this.
  383. BOOL IsStandardPict (lpobj)
  384. LPOLEOBJECT lpobj;
  385. {
  386. LPOBJECT_LE lpLEobj;
  387. LONG type;
  388. lpLEobj = (LPOBJECT_LE) lpobj;
  389. if (!lpLEobj->lpobjPict)
  390. return FALSE;
  391. if ((*lpLEobj->lpobjPict->lpvtbl->QueryType) (lpLEobj->lpobjPict, &type)
  392. == OLE_ERROR_GENERIC)
  393. return FALSE;
  394. return TRUE;
  395. }