PageRenderTime 49ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/dlls/urlmon/usrmarshal.c

https://github.com/mirrors/wine
C | 380 lines | 299 code | 60 blank | 21 comment | 30 complexity | 7b088458c76add63f4c1dbc6abc83ab9 MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1, LGPL-2.0, CC-BY-SA-3.0, BSD-3-Clause
  1. /*
  2. * Copyright 2009 Piotr Caban for CodeWeavers
  3. *
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with this library; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  17. */
  18. #define NONAMELESSUNION
  19. #include "urlmon_main.h"
  20. #include "wine/debug.h"
  21. WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
  22. HRESULT CALLBACK IWinInetHttpInfo_QueryInfo_Proxy(IWinInetHttpInfo* This,
  23. DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
  24. DWORD *pdwReserved)
  25. {
  26. TRACE("(%p %lx %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuf, pdwFlags, pdwReserved);
  27. return IWinInetHttpInfo_RemoteQueryInfo_Proxy(This, dwOption, pBuffer, pcbBuf, pdwFlags, pdwReserved);
  28. }
  29. HRESULT __RPC_STUB IWinInetHttpInfo_QueryInfo_Stub(IWinInetHttpInfo* This,
  30. DWORD dwOption, BYTE *pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
  31. DWORD *pdwReserved)
  32. {
  33. TRACE("(%p %lx %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuf, pdwFlags, pdwReserved);
  34. return IWinInetHttpInfo_QueryInfo(This, dwOption, pBuffer, pcbBuf, pdwFlags, pdwReserved);
  35. }
  36. HRESULT CALLBACK IWinInetInfo_QueryOption_Proxy(IWinInetInfo* This,
  37. DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf)
  38. {
  39. TRACE("(%p %lx %p %p)\n", This, dwOption, pBuffer, pcbBuf);
  40. return IWinInetInfo_RemoteQueryOption_Proxy(This, dwOption, pBuffer, pcbBuf);
  41. }
  42. HRESULT __RPC_STUB IWinInetInfo_QueryOption_Stub(IWinInetInfo* This,
  43. DWORD dwOption, BYTE *pBuffer, DWORD *pcbBuf)
  44. {
  45. TRACE("(%p %lx %p %p)\n", This, dwOption, pBuffer, pcbBuf);
  46. return IWinInetInfo_QueryOption(This, dwOption, pBuffer, pcbBuf);
  47. }
  48. HRESULT CALLBACK IBindHost_MonikerBindToStorage_Proxy(IBindHost* This,
  49. IMoniker *moniker, IBindCtx *bc, IBindStatusCallback *bsc,
  50. REFIID riid, void **obj)
  51. {
  52. TRACE("(%p %p %p %p %s %p)\n", This, moniker, bc, bsc, debugstr_guid(riid), obj);
  53. return IBindHost_RemoteMonikerBindToStorage_Proxy(This, moniker, bc, bsc, riid, (IUnknown**)obj);
  54. }
  55. HRESULT __RPC_STUB IBindHost_MonikerBindToStorage_Stub(IBindHost* This,
  56. IMoniker *moniker, IBindCtx *bc, IBindStatusCallback *bsc,
  57. REFIID riid, IUnknown **obj)
  58. {
  59. TRACE("(%p %p %p %p %s %p)\n", This, moniker, bc, bsc, debugstr_guid(riid), obj);
  60. return IBindHost_MonikerBindToStorage(This, moniker, bc, bsc, riid, (void**)obj);
  61. }
  62. HRESULT CALLBACK IBindHost_MonikerBindToObject_Proxy(IBindHost* This,
  63. IMoniker *moniker, IBindCtx *bc, IBindStatusCallback *bsc,
  64. REFIID riid, void **obj)
  65. {
  66. TRACE("(%p %p %p %p %s %p)\n", This, moniker, bc, bsc, debugstr_guid(riid), obj);
  67. return IBindHost_RemoteMonikerBindToObject_Proxy(This, moniker, bc, bsc, riid, (IUnknown**)obj);
  68. }
  69. HRESULT __RPC_STUB IBindHost_MonikerBindToObject_Stub(IBindHost* This,
  70. IMoniker *moniker, IBindCtx *bc, IBindStatusCallback *bsc,
  71. REFIID riid, IUnknown **obj)
  72. {
  73. TRACE("(%p %p %p %p %s %p)\n", This, moniker, bc, bsc, debugstr_guid(riid), obj);
  74. return IBindHost_MonikerBindToObject(This, moniker, bc, bsc, riid, (void**)obj);
  75. }
  76. static HRESULT marshal_stgmed(STGMEDIUM *stgmed, RemSTGMEDIUM **ret)
  77. {
  78. RemSTGMEDIUM *rem_stgmed;
  79. IStream *stream = NULL;
  80. ULONG size = 0;
  81. HRESULT hres = S_OK;
  82. if((stgmed->tymed == TYMED_ISTREAM && stgmed->u.pstm) || stgmed->pUnkForRelease) {
  83. hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
  84. if(FAILED(hres))
  85. return hres;
  86. }
  87. switch(stgmed->tymed) {
  88. case TYMED_NULL:
  89. break;
  90. case TYMED_ISTREAM:
  91. if(stgmed->u.pstm)
  92. hres = CoMarshalInterface(stream, &IID_IStream, (IUnknown*)stgmed->u.pstm,
  93. MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL);
  94. break;
  95. default:
  96. FIXME("unsupported tymed %lu\n", stgmed->tymed);
  97. break;
  98. }
  99. if(SUCCEEDED(hres) && stgmed->pUnkForRelease)
  100. hres = CoMarshalInterface(stream, &IID_IUnknown, stgmed->pUnkForRelease,
  101. MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL);
  102. if(FAILED(hres)) {
  103. if(stream)
  104. IStream_Release(stream);
  105. return hres;
  106. }
  107. if(stream) {
  108. LARGE_INTEGER zero;
  109. ULARGE_INTEGER off;
  110. zero.QuadPart = 0;
  111. IStream_Seek(stream, zero, STREAM_SEEK_CUR, &off);
  112. size = off.QuadPart;
  113. IStream_Seek(stream, zero, STREAM_SEEK_SET, &off);
  114. }
  115. rem_stgmed = heap_alloc_zero(FIELD_OFFSET(RemSTGMEDIUM, data[size]));
  116. if(!rem_stgmed) {
  117. if(stream)
  118. IStream_Release(stream);
  119. return E_OUTOFMEMORY;
  120. }
  121. rem_stgmed->tymed = stgmed->tymed;
  122. rem_stgmed->dwHandleType = 0;
  123. rem_stgmed->pData = stgmed->u.pstm != NULL;
  124. rem_stgmed->pUnkForRelease = stgmed->pUnkForRelease != NULL;
  125. rem_stgmed->cbData = size;
  126. if(stream) {
  127. IStream_Read(stream, rem_stgmed->data, size, &size);
  128. IStream_Release(stream);
  129. }
  130. *ret = rem_stgmed;
  131. return S_OK;
  132. }
  133. static HRESULT unmarshal_stgmed(RemSTGMEDIUM *rem_stgmed, STGMEDIUM *stgmed)
  134. {
  135. IStream *stream = NULL;
  136. HRESULT hres = S_OK;
  137. stgmed->tymed = rem_stgmed->tymed;
  138. if((stgmed->tymed == TYMED_ISTREAM && rem_stgmed->pData) || rem_stgmed->pUnkForRelease) {
  139. LARGE_INTEGER zero;
  140. hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
  141. if(FAILED(hres))
  142. return hres;
  143. hres = IStream_Write(stream, rem_stgmed->data, rem_stgmed->cbData, NULL);
  144. if(FAILED(hres)) {
  145. IStream_Release(stream);
  146. return hres;
  147. }
  148. zero.QuadPart = 0;
  149. IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
  150. }
  151. switch(stgmed->tymed) {
  152. case TYMED_NULL:
  153. break;
  154. case TYMED_ISTREAM:
  155. if(rem_stgmed->pData)
  156. hres = CoUnmarshalInterface(stream, &IID_IStream, (void**)&stgmed->u.pstm);
  157. break;
  158. default:
  159. FIXME("unsupported tymed %lu\n", stgmed->tymed);
  160. break;
  161. }
  162. if(SUCCEEDED(hres) && rem_stgmed->pUnkForRelease)
  163. hres = CoUnmarshalInterface(stream, &IID_IUnknown, (void**)&stgmed->pUnkForRelease);
  164. if(stream)
  165. IStream_Release(stream);
  166. return hres;
  167. }
  168. static void proxy_marshal_bindinfo(BINDINFO *bindinfo, RemBINDINFO *rem_bindinfo)
  169. {
  170. rem_bindinfo->szExtraInfo = bindinfo->szExtraInfo;
  171. rem_bindinfo->grfBindInfoF = bindinfo->grfBindInfoF;
  172. rem_bindinfo->dwBindVerb = bindinfo->dwBindVerb;
  173. rem_bindinfo->szCustomVerb = bindinfo->szCustomVerb;
  174. rem_bindinfo->cbstgmedData = bindinfo->cbstgmedData;
  175. }
  176. static void proxy_unmarshal_bindinfo(RemBINDINFO *rem_bindinfo, BINDINFO *bindinfo)
  177. {
  178. bindinfo->szExtraInfo = rem_bindinfo->szExtraInfo;
  179. bindinfo->grfBindInfoF = rem_bindinfo->grfBindInfoF;
  180. bindinfo->dwBindVerb = rem_bindinfo->dwBindVerb;
  181. bindinfo->szCustomVerb = rem_bindinfo->szCustomVerb;
  182. bindinfo->cbstgmedData = rem_bindinfo->cbstgmedData;
  183. bindinfo->dwOptions = rem_bindinfo->dwOptions;
  184. bindinfo->dwOptionsFlags = rem_bindinfo->dwOptionsFlags;
  185. bindinfo->dwCodePage = rem_bindinfo->dwCodePage;
  186. bindinfo->iid = IID_NULL;
  187. bindinfo->pUnk = NULL;
  188. }
  189. static void stub_unmarshal_bindinfo(RemBINDINFO *rem_bindinfo, BINDINFO *bindinfo)
  190. {
  191. bindinfo->szExtraInfo = rem_bindinfo->szExtraInfo;
  192. bindinfo->grfBindInfoF = rem_bindinfo->grfBindInfoF;
  193. bindinfo->dwBindVerb = rem_bindinfo->dwBindVerb;
  194. bindinfo->szCustomVerb = rem_bindinfo->szCustomVerb;
  195. bindinfo->cbstgmedData = rem_bindinfo->cbstgmedData;
  196. if(bindinfo->stgmedData.tymed != TYMED_NULL)
  197. WARN("stgmed data (tymed %lu) will be lost!\n", bindinfo->stgmedData.tymed);
  198. }
  199. static void stub_marshal_bindinfo(BINDINFO *bindinfo, RemBINDINFO *rem_bindinfo)
  200. {
  201. rem_bindinfo->cbSize = sizeof(*rem_bindinfo);
  202. rem_bindinfo->szExtraInfo = bindinfo->szExtraInfo;
  203. rem_bindinfo->grfBindInfoF = bindinfo->grfBindInfoF;
  204. rem_bindinfo->dwBindVerb = bindinfo->dwBindVerb;
  205. rem_bindinfo->szCustomVerb = bindinfo->szCustomVerb;
  206. rem_bindinfo->cbstgmedData = bindinfo->cbstgmedData;
  207. rem_bindinfo->dwOptions = bindinfo->dwOptions;
  208. rem_bindinfo->dwOptionsFlags = bindinfo->dwOptionsFlags;
  209. rem_bindinfo->dwCodePage = bindinfo->dwCodePage;
  210. rem_bindinfo->pUnk = NULL;
  211. rem_bindinfo->dwReserved = bindinfo->dwReserved;
  212. }
  213. HRESULT CALLBACK IBindStatusCallbackEx_GetBindInfoEx_Proxy(
  214. IBindStatusCallbackEx* This, DWORD *grfBINDF, BINDINFO *bindinfo,
  215. DWORD *grfBINDF2, DWORD *pdwReserved)
  216. {
  217. RemBINDINFO rem_bindinfo = {sizeof(rem_bindinfo)};
  218. RemSTGMEDIUM rem_stgmed = {0};
  219. HRESULT hres;
  220. TRACE("(%p)->(%p %p %p %p)\n", This, grfBINDF, bindinfo, grfBINDF2, pdwReserved);
  221. proxy_marshal_bindinfo(bindinfo, &rem_bindinfo);
  222. hres = IBindStatusCallbackEx_RemoteGetBindInfoEx_Proxy(This, grfBINDF, &rem_bindinfo,
  223. &rem_stgmed, grfBINDF2, pdwReserved);
  224. proxy_unmarshal_bindinfo(&rem_bindinfo, bindinfo);
  225. return hres;
  226. }
  227. HRESULT __RPC_STUB IBindStatusCallbackEx_GetBindInfoEx_Stub(
  228. IBindStatusCallbackEx* This, DWORD *grfBINDF, RemBINDINFO *rem_bindinfo,
  229. RemSTGMEDIUM *rem_stgmed, DWORD *grfBINDF2, DWORD *pdwReserved)
  230. {
  231. BINDINFO bindinfo = {sizeof(bindinfo)};
  232. HRESULT hres;
  233. TRACE("(%p)->(%p %p %p %p %p)\n", This, grfBINDF, rem_bindinfo, rem_stgmed, grfBINDF2, pdwReserved);
  234. /*
  235. * Although arguments suggest support for STGMEDIUM from BINDINFO, tests show
  236. * that it's not supported and returned data is lost.
  237. */
  238. stub_unmarshal_bindinfo(rem_bindinfo, &bindinfo);
  239. hres = IBindStatusCallbackEx_GetBindInfoEx(This, grfBINDF, &bindinfo, grfBINDF2, pdwReserved);
  240. stub_marshal_bindinfo(&bindinfo, rem_bindinfo);
  241. return hres;
  242. }
  243. HRESULT CALLBACK IBindStatusCallback_GetBindInfo_Proxy(
  244. IBindStatusCallback* This, DWORD *grfBINDF, BINDINFO *bindinfo)
  245. {
  246. RemBINDINFO rem_bindinfo = {sizeof(rem_bindinfo)};
  247. RemSTGMEDIUM rem_stgmed = {0};
  248. HRESULT hres;
  249. TRACE("(%p)->(%p %p)\n", This, grfBINDF, bindinfo);
  250. proxy_marshal_bindinfo(bindinfo, &rem_bindinfo);
  251. hres = IBindStatusCallback_RemoteGetBindInfo_Proxy(This, grfBINDF, &rem_bindinfo, &rem_stgmed);
  252. proxy_unmarshal_bindinfo(&rem_bindinfo, bindinfo);
  253. return hres;
  254. }
  255. HRESULT __RPC_STUB IBindStatusCallback_GetBindInfo_Stub(
  256. IBindStatusCallback* This, DWORD *grfBINDF,
  257. RemBINDINFO *rem_bindinfo, RemSTGMEDIUM *rem_stgmed)
  258. {
  259. BINDINFO bindinfo = {sizeof(bindinfo)};
  260. HRESULT hres;
  261. TRACE("(%p)->(%p %p %p)\n", This, grfBINDF, rem_bindinfo, rem_stgmed);
  262. stub_unmarshal_bindinfo(rem_bindinfo, &bindinfo);
  263. hres = IBindStatusCallback_GetBindInfo(This, grfBINDF, &bindinfo);
  264. stub_marshal_bindinfo(&bindinfo, rem_bindinfo);
  265. return hres;
  266. }
  267. HRESULT CALLBACK IBindStatusCallback_OnDataAvailable_Proxy(
  268. IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
  269. FORMATETC *pformatetc, STGMEDIUM *pstgmed)
  270. {
  271. RemFORMATETC rem_formatetc;
  272. RemSTGMEDIUM *rem_stgmed;
  273. HRESULT hres;
  274. TRACE("(%p)->(%lx %lu %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
  275. hres = marshal_stgmed(pstgmed, &rem_stgmed);
  276. if(FAILED(hres))
  277. return hres;
  278. rem_formatetc.cfFormat = pformatetc->cfFormat;
  279. rem_formatetc.ptd = 0;
  280. rem_formatetc.dwAspect = pformatetc->dwAspect;
  281. rem_formatetc.lindex = pformatetc->lindex;
  282. rem_formatetc.tymed = pformatetc->tymed;
  283. hres = IBindStatusCallback_RemoteOnDataAvailable_Proxy(This, grfBSCF, dwSize, &rem_formatetc, rem_stgmed);
  284. heap_free(rem_stgmed);
  285. return hres;
  286. }
  287. HRESULT __RPC_STUB IBindStatusCallback_OnDataAvailable_Stub(
  288. IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
  289. RemFORMATETC *pformatetc, RemSTGMEDIUM *pstgmed)
  290. {
  291. STGMEDIUM stgmed = { TYMED_NULL };
  292. FORMATETC formatetc;
  293. HRESULT hres;
  294. TRACE("(%p)->(%lx %lu %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
  295. hres = unmarshal_stgmed(pstgmed, &stgmed);
  296. if(FAILED(hres))
  297. return hres;
  298. formatetc.cfFormat = pformatetc->cfFormat;
  299. formatetc.ptd = NULL;
  300. formatetc.dwAspect = pformatetc->dwAspect;
  301. formatetc.lindex = pformatetc->lindex;
  302. formatetc.tymed = pformatetc->tymed;
  303. hres = IBindStatusCallback_OnDataAvailable(This, grfBSCF, dwSize, &formatetc, &stgmed);
  304. ReleaseStgMedium(&stgmed);
  305. return hres;
  306. }
  307. HRESULT CALLBACK IBinding_GetBindResult_Proxy(IBinding* This,
  308. CLSID *pclsidProtocol, DWORD *pdwResult,
  309. LPOLESTR *pszResult, DWORD *pdwReserved)
  310. {
  311. FIXME("stub\n");
  312. return E_NOTIMPL;
  313. }
  314. HRESULT __RPC_STUB IBinding_GetBindResult_Stub(IBinding* This,
  315. CLSID *pclsidProtocol, DWORD *pdwResult,
  316. LPOLESTR *pszResult, DWORD dwReserved)
  317. {
  318. FIXME("stub\n");
  319. return E_NOTIMPL;
  320. }