ReactOS  0.4.14-dev-293-g2b39b42
umstream.c
Go to the documentation of this file.
1 /*
2  * Based on ../shell32/memorystream.c
3  *
4  * Copyright 1999 Juergen Schmied
5  * Copyright 2003 Mike McCormack for CodeWeavers
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 
22 #include "urlmon_main.h"
23 
24 #include "winreg.h"
25 #include "wine/winternl.h"
26 #include "wininet.h"
27 #include "shlwapi.h"
28 
29 #include "wine/debug.h"
30 
32 
34 {
36 
39 
41 {
42  return CONTAINING_RECORD(iface, ProxyBindStatusCallback, IBindStatusCallback_iface);
43 }
44 
46 {
47  if (IsEqualGUID(&IID_IBindStatusCallback, riid) ||
49  {
50  *ppv = iface;
51  IBindStatusCallback_AddRef(iface);
52  return S_OK;
53  }
54 
55  *ppv = NULL;
56  return E_NOINTERFACE;
57 }
58 
60 {
61  return 2;
62 }
63 
65 {
66  return 1;
67 }
68 
70  IBinding *pib)
71 {
73 
74  if(This->pBSC)
75  return IBindStatusCallback_OnStartBinding(This->pBSC, dwReserved, pib);
76 
77  return S_OK;
78 }
79 
81 {
83 
84  if(This->pBSC)
85  return IBindStatusCallback_GetPriority(This->pBSC, pnPriority);
86 
87  return S_OK;
88 }
89 
91 {
93 
94  if(This->pBSC)
95  return IBindStatusCallback_OnLowResource(This->pBSC, reserved);
96 
97  return S_OK;
98 }
99 
101  ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
102 {
104 
105  if(This->pBSC)
106  return IBindStatusCallback_OnProgress(This->pBSC, ulProgress,
107  ulProgressMax, ulStatusCode,
108  szStatusText);
109 
110  return S_OK;
111 }
112 
114 {
116 
117  if(This->pBSC)
118  return IBindStatusCallback_OnStopBinding(This->pBSC, hresult, szError);
119 
120  return S_OK;
121 }
122 
123 static HRESULT WINAPI ProxyBindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
124 {
125  DWORD size = pbindinfo->cbSize;
127 
128  if(This->pBSC)
129  return IBindStatusCallback_GetBindInfo(This->pBSC, grfBINDF, pbindinfo);
130 
131  memset(pbindinfo, 0, size);
132  pbindinfo->cbSize = size;
133 
134  *grfBINDF = 0;
135 
136  return S_OK;
137 }
138 
140  DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed)
141 {
143 
144  if(This->pBSC)
145  return IBindStatusCallback_OnDataAvailable(This->pBSC, grfBSCF, dwSize,
146  pformatetc, pstgmed);
147 
148  return S_OK;
149 }
150 
152 {
154 
155  if(This->pBSC)
156  return IBindStatusCallback_OnObjectAvailable(This->pBSC, riid, punk);
157 
158  return S_OK;
159 }
160 
162  DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed)
163 {
164  return S_OK;
165 }
166 
167 static const IBindStatusCallbackVtbl BlockingBindStatusCallbackVtbl =
168 {
180 };
181 
182 static HRESULT WINAPI AsyncBindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
183 {
185  HRESULT hr = S_OK;
186 
187  if(This->pBSC)
188  hr = IBindStatusCallback_GetBindInfo(This->pBSC, grfBINDF, pbindinfo);
189  else{
190  DWORD size = pbindinfo->cbSize;
191  memset(pbindinfo, 0, size);
192  pbindinfo->cbSize = size;
193 
194  *grfBINDF = 0;
195  }
196 
197  *grfBINDF |= BINDF_PULLDATA | BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE;
198 
199  return hr;
200 }
201 
202 static const IBindStatusCallbackVtbl AsyncBindStatusCallbackVtbl =
203 {
215 };
216 
218 {
219  HRESULT hr;
220  IMoniker *pMoniker;
221  IBindCtx *pbc;
222 
223  *ppStream = NULL;
224 
225  hr = CreateURLMoniker(NULL, szURL, &pMoniker);
226  if (FAILED(hr))
227  return hr;
228 
229  hr = CreateBindCtx(0, &pbc);
230  if (FAILED(hr))
231  {
232  IMoniker_Release(pMoniker);
233  return hr;
234  }
235 
236  hr = RegisterBindStatusCallback(pbc, pBSC, NULL, 0);
237  if (FAILED(hr))
238  {
239  IBindCtx_Release(pbc);
240  IMoniker_Release(pMoniker);
241  return hr;
242  }
243 
244  hr = IMoniker_BindToStorage(pMoniker, pbc, NULL, &IID_IStream, (void **)ppStream);
245 
246  /* BindToStorage returning E_PENDING because it's asynchronous is not an error */
247  if (hr == E_PENDING) hr = S_OK;
248 
249  IBindCtx_Release(pbc);
250  IMoniker_Release(pMoniker);
251 
252  return hr;
253 }
254 
255 /***********************************************************************
256  * URLOpenBlockingStreamA (URLMON.@)
257  */
259  LPSTREAM *ppStream, DWORD dwReserved,
260  LPBINDSTATUSCALLBACK lpfnCB)
261 {
262  LPWSTR szURLW;
263  int len;
264  HRESULT hr;
265 
266  TRACE("(%p, %s, %p, 0x%x, %p)\n", pCaller, szURL, ppStream, dwReserved, lpfnCB);
267 
268  if (!szURL || !ppStream)
269  return E_INVALIDARG;
270 
271  len = MultiByteToWideChar(CP_ACP, 0, szURL, -1, NULL, 0);
272  szURLW = heap_alloc(len * sizeof(WCHAR));
273  if (!szURLW)
274  {
275  *ppStream = NULL;
276  return E_OUTOFMEMORY;
277  }
278  MultiByteToWideChar(CP_ACP, 0, szURL, -1, szURLW, len);
279 
280  hr = URLOpenBlockingStreamW(pCaller, szURLW, ppStream, dwReserved, lpfnCB);
281 
282  heap_free(szURLW);
283 
284  return hr;
285 }
286 
287 /***********************************************************************
288  * URLOpenBlockingStreamW (URLMON.@)
289  */
291  LPSTREAM *ppStream, DWORD dwReserved,
292  LPBINDSTATUSCALLBACK lpfnCB)
293 {
294  ProxyBindStatusCallback blocking_bsc;
295 
296  TRACE("(%p, %s, %p, 0x%x, %p)\n", pCaller, debugstr_w(szURL), ppStream,
297  dwReserved, lpfnCB);
298 
299  if (!szURL || !ppStream)
300  return E_INVALIDARG;
301 
303  blocking_bsc.pBSC = lpfnCB;
304 
305  return URLStartDownload(szURL, ppStream, &blocking_bsc.IBindStatusCallback_iface);
306 }
307 
308 /***********************************************************************
309  * URLOpenStreamA (URLMON.@)
310  */
312  LPBINDSTATUSCALLBACK lpfnCB)
313 {
314  LPWSTR szURLW;
315  int len;
316  HRESULT hr;
317 
318  TRACE("(%p, %s, 0x%x, %p)\n", pCaller, szURL, dwReserved, lpfnCB);
319 
320  if (!szURL)
321  return E_INVALIDARG;
322 
323  len = MultiByteToWideChar(CP_ACP, 0, szURL, -1, NULL, 0);
324  szURLW = heap_alloc(len * sizeof(WCHAR));
325  if (!szURLW)
326  return E_OUTOFMEMORY;
327  MultiByteToWideChar(CP_ACP, 0, szURL, -1, szURLW, len);
328 
329  hr = URLOpenStreamW(pCaller, szURLW, dwReserved, lpfnCB);
330 
331  heap_free(szURLW);
332 
333  return hr;
334 }
335 
336 /***********************************************************************
337  * URLOpenStreamW (URLMON.@)
338  */
340  LPBINDSTATUSCALLBACK lpfnCB)
341 {
342  HRESULT hr;
343  ProxyBindStatusCallback async_bsc;
344  IStream *pStream;
345 
346  TRACE("(%p, %s, 0x%x, %p)\n", pCaller, debugstr_w(szURL), dwReserved,
347  lpfnCB);
348 
349  if (!szURL)
350  return E_INVALIDARG;
351 
353  async_bsc.pBSC = lpfnCB;
354 
355  hr = URLStartDownload(szURL, &pStream, &async_bsc.IBindStatusCallback_iface);
356  if (SUCCEEDED(hr) && pStream)
357  IStream_Release(pStream);
358 
359  return hr;
360 }
#define REFIID
Definition: guiddef.h:118
#define E_NOINTERFACE
Definition: winerror.h:2364
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
HRESULT WINAPI URLOpenStreamA(LPUNKNOWN pCaller, LPCSTR szURL, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:311
static HRESULT WINAPI BlockingBindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: umstream.c:161
REFIID riid
Definition: precomp.h:44
WINE_DEFAULT_DEBUG_CHANNEL(urlmon)
#define CP_ACP
Definition: compat.h:99
static HRESULT WINAPI ProxyBindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
Definition: umstream.c:151
IBindStatusCallback IBindStatusCallback_iface
Definition: umstream.c:35
static HRESULT WINAPI ProxyBindStatusCallback_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
Definition: umstream.c:113
REFIID LPVOID * ppv
Definition: atlbase.h:39
static HRESULT WINAPI ProxyBindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: umstream.c:139
interface IStream * LPSTREAM
Definition: objfwd.h:10
static const IBindStatusCallbackVtbl BlockingBindStatusCallbackVtbl
Definition: umstream.c:167
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:90
long LONG
Definition: pedump.c:60
static LPUNKNOWN
Definition: ndr_ole.c:49
static ProxyBindStatusCallback * impl_from_IBindStatusCallback(IBindStatusCallback *iface)
Definition: umstream.c:40
#define debugstr_w
Definition: kernel32.h:32
r reserved
Definition: btrfs.c:2893
static HRESULT WINAPI ProxyBindStatusCallback_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: umstream.c:100
static HRESULT WINAPI ProxyBindStatusCallback_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib)
Definition: umstream.c:69
HRESULT WINAPI URLOpenBlockingStreamA(LPUNKNOWN pCaller, LPCSTR szURL, LPSTREAM *ppStream, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:258
#define E_INVALIDARG
Definition: ddrawi.h:101
IBindStatusCallback * pBSC
Definition: umstream.c:37
smooth NULL
Definition: ftsmooth.c:416
static ULONG WINAPI ProxyBindStatusCallback_AddRef(IBindStatusCallback *iface)
Definition: umstream.c:59
const char * LPCSTR
Definition: xmlstorage.h:183
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbscPrevious, DWORD dwReserved)
Definition: bindctx.c:615
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
static const IBindStatusCallbackVtbl AsyncBindStatusCallbackVtbl
Definition: umstream.c:202
HRESULT WINAPI URLOpenStreamW(LPUNKNOWN pCaller, LPCWSTR szURL, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:339
GLenum GLsizei len
Definition: glext.h:6722
struct ProxyBindStatusCallback ProxyBindStatusCallback
HRESULT WINAPI URLOpenBlockingStreamW(LPUNKNOWN pCaller, LPCWSTR szURL, LPSTREAM *ppStream, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:290
#define S_OK
Definition: intsafe.h:59
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define MultiByteToWideChar
Definition: compat.h:100
static HRESULT WINAPI ProxyBindStatusCallback_QueryInterface(IBindStatusCallback *iface, REFIID riid, void **ppv)
Definition: umstream.c:45
unsigned int ULONG
Definition: retypes.h:1
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
Definition: umon.c:732
static ULONG WINAPI ProxyBindStatusCallback_Release(IBindStatusCallback *iface)
Definition: umstream.c:64
static HRESULT WINAPI ProxyBindStatusCallback_OnLowResource(IBindStatusCallback *iface, DWORD reserved)
Definition: umstream.c:90
WCHAR * LPWSTR
Definition: xmlstorage.h:184
static HRESULT WINAPI ProxyBindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: umstream.c:123
#define E_PENDING
Definition: dinput.h:172
#define memset(x, y, z)
Definition: compat.h:39
static HRESULT WINAPI ProxyBindStatusCallback_GetPriority(IBindStatusCallback *iface, LONG *pnPriority)
Definition: umstream.c:80
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static HRESULT URLStartDownload(LPCWSTR szURL, LPSTREAM *ppStream, IBindStatusCallback *pBSC)
Definition: umstream.c:217
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
static HRESULT WINAPI AsyncBindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: umstream.c:182