ReactOS 0.4.16-dev-88-ga65b6ae
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
123static 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
167static const IBindStatusCallbackVtbl BlockingBindStatusCallbackVtbl =
168{
180};
181
182static 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
202static 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}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_PENDING
Definition: dinput.h:172
#define NULL
Definition: types.h:112
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
r reserved
Definition: btrfs.c:3006
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
GLenum GLsizei len
Definition: glext.h:6722
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
static LPUNKNOWN
Definition: ndr_ole.c:49
interface IStream * LPSTREAM
Definition: objfwd.h:10
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define memset(x, y, z)
Definition: compat.h:39
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
IBindStatusCallback IBindStatusCallback_iface
Definition: umstream.c:35
IBindStatusCallback * pBSC
Definition: umstream.c:37
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
Definition: umon.c:732
HRESULT WINAPI URLOpenStreamW(LPUNKNOWN pCaller, LPCWSTR szURL, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:339
HRESULT WINAPI URLOpenBlockingStreamW(LPUNKNOWN pCaller, LPCWSTR szURL, LPSTREAM *ppStream, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:290
HRESULT WINAPI URLOpenStreamA(LPUNKNOWN pCaller, LPCSTR szURL, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:311
HRESULT WINAPI URLOpenBlockingStreamA(LPUNKNOWN pCaller, LPCSTR szURL, LPSTREAM *ppStream, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB)
Definition: umstream.c:258
static HRESULT WINAPI ProxyBindStatusCallback_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib)
Definition: umstream.c:69
static HRESULT WINAPI ProxyBindStatusCallback_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
Definition: umstream.c:113
static HRESULT WINAPI ProxyBindStatusCallback_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: umstream.c:100
static HRESULT WINAPI ProxyBindStatusCallback_OnLowResource(IBindStatusCallback *iface, DWORD reserved)
Definition: umstream.c:90
static ProxyBindStatusCallback * impl_from_IBindStatusCallback(IBindStatusCallback *iface)
Definition: umstream.c:40
static ULONG WINAPI ProxyBindStatusCallback_AddRef(IBindStatusCallback *iface)
Definition: umstream.c:59
static HRESULT URLStartDownload(LPCWSTR szURL, LPSTREAM *ppStream, IBindStatusCallback *pBSC)
Definition: umstream.c:217
static HRESULT WINAPI BlockingBindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: umstream.c:161
static HRESULT WINAPI ProxyBindStatusCallback_GetPriority(IBindStatusCallback *iface, LONG *pnPriority)
Definition: umstream.c:80
static const IBindStatusCallbackVtbl AsyncBindStatusCallbackVtbl
Definition: umstream.c:202
static ULONG WINAPI ProxyBindStatusCallback_Release(IBindStatusCallback *iface)
Definition: umstream.c:64
static HRESULT WINAPI ProxyBindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: umstream.c:123
static HRESULT WINAPI ProxyBindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: umstream.c:139
static HRESULT WINAPI ProxyBindStatusCallback_QueryInterface(IBindStatusCallback *iface, REFIID riid, void **ppv)
Definition: umstream.c:45
static HRESULT WINAPI ProxyBindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
Definition: umstream.c:151
static const IBindStatusCallbackVtbl BlockingBindStatusCallbackVtbl
Definition: umstream.c:167
static HRESULT WINAPI AsyncBindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: umstream.c:182
HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbscPrevious, DWORD dwReserved)
Definition: bindctx.c:615
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185