ReactOS 0.4.16-dev-2206-gc56950d
bsc.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 Piotr Caban
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
19#define COBJMACROS
20
21#include <stdarg.h>
22
23#include "windef.h"
24#include "winbase.h"
25#include "winuser.h"
26#include "ole2.h"
27#include "msxml6.h"
28#include "wininet.h"
29#include "urlmon.h"
30#include "winreg.h"
31#include "shlwapi.h"
32
33#include "wine/debug.h"
34
35#include "msxml_dispex.h"
36
38
39struct bsc_t {
41
43
44 void *obj;
45 HRESULT (*onDataAvailable)(void*,char*,DWORD);
46
50};
51
53{
54 return CONTAINING_RECORD(iface, bsc_t, IBindStatusCallback_iface);
55}
56
60 LPVOID *ppobj )
61{
63 IsEqualGUID(riid, &IID_IBindStatusCallback))
64 {
65 IBindStatusCallback_AddRef( iface );
66 *ppobj = iface;
67 return S_OK;
68 }
69
70 TRACE("interface %s not implemented\n", debugstr_guid(riid));
71 *ppobj = NULL;
72 return E_NOINTERFACE;
73}
74
76 IBindStatusCallback *iface )
77{
80
81 TRACE("%p, refcount %ld.\n", iface, ref);
82
83 return ref;
84}
85
87 IBindStatusCallback *iface )
88{
91
92 TRACE("%p, refcount %ld.\n", iface, ref);
93
94 if (!ref)
95 {
96 if (bsc->binding)
97 IBinding_Release(bsc->binding);
98 if (bsc->memstream)
99 IStream_Release(bsc->memstream);
100 free(bsc);
101 }
102
103 return ref;
104}
105
107 IBindStatusCallback* iface,
109 IBinding* pib)
110{
112 HRESULT hr;
113
114 TRACE("%p, %lx, %p.\n", iface, dwReserved, pib);
115
116 This->binding = pib;
117 IBinding_AddRef(pib);
118
119 hr = CreateStreamOnHGlobal(NULL, TRUE, &This->memstream);
120 if(FAILED(hr))
121 return hr;
122
123 return S_OK;
124}
125
127 IBindStatusCallback* iface,
128 LONG* pnPriority)
129{
130 return S_OK;
131}
132
134 IBindStatusCallback* iface,
136{
137 return S_OK;
138}
139
141 IBindStatusCallback* iface,
142 ULONG ulProgress,
143 ULONG ulProgressMax,
144 ULONG ulStatusCode,
145 LPCWSTR szStatusText)
146{
147 return S_OK;
148}
149
151 IBindStatusCallback* iface,
152 HRESULT hresult,
153 LPCWSTR szError)
154{
156 HRESULT hr = S_OK;
157
158 TRACE("%p, %#lx, %s.\n", iface, hresult, debugstr_w(szError));
159
160 if(This->binding) {
161 IBinding_Release(This->binding);
162 This->binding = NULL;
163 }
164
165 if(This->obj && SUCCEEDED(hresult)) {
166 HGLOBAL hglobal;
167 hr = GetHGlobalFromStream(This->memstream, &hglobal);
168 if(SUCCEEDED(hr))
169 {
170 DWORD len = GlobalSize(hglobal);
171 char *ptr = GlobalLock(hglobal);
172
173 This->hres = This->onDataAvailable(This->obj, ptr, len);
174
175 GlobalUnlock(hglobal);
176 }
177 }
178
179 return hr;
180}
181
183 IBindStatusCallback* iface,
184 DWORD* grfBINDF,
185 BINDINFO* pbindinfo)
186{
187 *grfBINDF = BINDF_GETNEWESTVERSION|BINDF_PULLDATA|BINDF_RESYNCHRONIZE|BINDF_PRAGMA_NO_CACHE;
188
189 return S_OK;
190}
191
193 IBindStatusCallback* iface,
194 DWORD grfBSCF,
196 FORMATETC* pformatetc,
197 STGMEDIUM* pstgmed)
198{
200 BYTE buf[4096];
201 DWORD read, written;
202 HRESULT hr;
203
204 TRACE("%p, %lx, %lu, %p, %p.\n", iface, grfBSCF, dwSize, pformatetc, pstgmed);
205
206 do
207 {
208 hr = IStream_Read(pstgmed->pstm, buf, sizeof(buf), &read);
209 if(FAILED(hr))
210 break;
211
212 hr = IStream_Write(bsc->memstream, buf, read, &written);
213 } while(SUCCEEDED(hr) && written != 0 && read != 0);
214
215 return S_OK;
216}
217
219 IBindStatusCallback* iface,
220 REFIID riid,
221 IUnknown* punk)
222{
223 return S_OK;
224}
225
226static const struct IBindStatusCallbackVtbl bsc_vtbl =
227{
239};
240
242{
244 HRESULT hr;
245
246 TRACE("%s\n", debugstr_w(url));
247
248 if (!PathIsURLW(url))
249 {
250 WCHAR fullpath[MAX_PATH];
251 DWORD needed = ARRAY_SIZE(fileUrl);
252
253 lstrcpynW(fileUrl, url, ARRAY_SIZE(fileUrl));
255
256 if (!PathSearchAndQualifyW(fileUrl, fullpath, ARRAY_SIZE(fullpath)))
257 {
258 WARN("can't find path\n");
259 return E_FAIL;
260 }
261
262 if (FAILED(UrlApplySchemeW(fullpath, fileUrl, &needed, URL_APPLY_GUESSSCHEME | URL_APPLY_GUESSFILE |
264 {
265 ERR("Failed to apply url scheme.\n");
266 return E_FAIL;
267 }
268 url = fileUrl;
269 }
270
271 hr = CreateUri(url, Uri_CREATE_ALLOW_RELATIVE | Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, 0, uri);
272 if (hr == S_OK && base)
273 {
274 IUri *rebased_uri;
275
276 hr = CoInternetCombineIUri(base, *uri, 0, &rebased_uri, 0);
277 IUri_Release(*uri);
278 *uri = rebased_uri;
279 }
280
281 return hr;
282}
283
285{
286 HRESULT hr;
287 IUri *uri;
288
289 TRACE("%s\n", debugstr_w(url));
290
291 if (FAILED(hr = create_uri(NULL, url, &uri)))
292 return hr;
293
294 hr = CreateURLMonikerEx2(NULL, uri, mon, 0);
295 IUri_Release(uri);
296 return hr;
297}
298
299HRESULT bind_url(IMoniker *mon, HRESULT (*onDataAvailable)(void*,char*,DWORD),
300 void *obj, bsc_t **ret)
301{
302 bsc_t *bsc;
303 IBindCtx *pbc;
304 HRESULT hr;
305
306 TRACE("%p\n", mon);
307
308 hr = CreateBindCtx(0, &pbc);
309 if(FAILED(hr))
310 return hr;
311
312 bsc = malloc(sizeof(bsc_t));
313
315 bsc->ref = 1;
316 bsc->obj = obj;
317 bsc->onDataAvailable = onDataAvailable;
318 bsc->binding = NULL;
319 bsc->memstream = NULL;
320 bsc->hres = S_OK;
321
323 if(SUCCEEDED(hr))
324 {
326 hr = IMoniker_BindToStorage(mon, pbc, NULL, &IID_IStream, (LPVOID*)&stream);
327 if(stream)
328 IStream_Release(stream);
329 IBindCtx_Release(pbc);
330 }
331
332 if(FAILED(hr))
333 {
334 IBindStatusCallback_Release(&bsc->IBindStatusCallback_iface);
335 bsc = NULL;
336 }
337
338 *ret = bsc;
339 return hr;
340}
341
343{
345
346 if(bsc->binding)
347 IBinding_Abort(bsc->binding);
348
349 bsc->obj = NULL;
350 hres = bsc->hres;
351 IBindStatusCallback_Release(&bsc->IBindStatusCallback_iface);
352
353 return hres;
354}
#define read
Definition: acwin.h:96
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
HRESULT create_uri(IUri *base, const WCHAR *url, IUri **uri)
Definition: bsc.c:241
static ULONG WINAPI bsc_AddRef(IBindStatusCallback *iface)
Definition: bsc.c:75
static HRESULT WINAPI bsc_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
Definition: bsc.c:150
static HRESULT WINAPI bsc_GetPriority(IBindStatusCallback *iface, LONG *pnPriority)
Definition: bsc.c:126
static HRESULT WINAPI bsc_OnObjectAvailable(IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
Definition: bsc.c:218
static HRESULT WINAPI bsc_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: bsc.c:140
static HRESULT WINAPI bsc_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib)
Definition: bsc.c:106
static ULONG WINAPI bsc_Release(IBindStatusCallback *iface)
Definition: bsc.c:86
static HRESULT WINAPI bsc_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: bsc.c:182
static bsc_t * impl_from_IBindStatusCallback(IBindStatusCallback *iface)
Definition: bsc.c:52
static HRESULT WINAPI bsc_OnLowResource(IBindStatusCallback *iface, DWORD reserved)
Definition: bsc.c:133
static const struct IBindStatusCallbackVtbl bsc_vtbl
Definition: bsc.c:226
HRESULT detach_bsc(bsc_t *bsc)
Definition: bsc.c:342
static HRESULT WINAPI bsc_QueryInterface(IBindStatusCallback *iface, REFIID riid, LPVOID *ppobj)
Definition: bsc.c:57
static HRESULT WINAPI bsc_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: bsc.c:192
HRESULT bind_url(IMoniker *mon, HRESULT(*onDataAvailable)(void *, char *, DWORD), void *obj, bsc_t **ret)
Definition: bsc.c:299
HRESULT create_moniker_from_url(LPCWSTR url, IMoniker **mon)
Definition: bsc.c:284
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define MAX_PATH
Definition: compat.h:34
#define lstrcpynW
Definition: compat.h:738
HRESULT WINAPI UrlUnescapeW(WCHAR *url, WCHAR *unescaped, DWORD *unescaped_len, DWORD flags)
Definition: path.c:2936
BOOL WINAPI PathSearchAndQualifyW(const WCHAR *path, WCHAR *buffer, UINT length)
Definition: path.c:2348
HRESULT WINAPI UrlApplySchemeW(const WCHAR *url, WCHAR *out, DWORD *length, DWORD flags)
Definition: path.c:4384
BOOL WINAPI PathIsURLW(const WCHAR *path)
Definition: path.c:3238
HRESULT WINAPI GetHGlobalFromStream(IStream *pstm, HGLOBAL *phglobal)
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
HRESULT WINAPI CoInternetCombineIUri(IUri *pBaseUri, IUri *pRelativeUri, DWORD dwCombineFlags, IUri **ppCombinedUri, DWORD_PTR dwReserved)
Definition: uri.c:6716
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5700
#define INTERNET_MAX_URL_LENGTH
Definition: session.c:1418
return ret
Definition: mutex.c:146
r reserved
Definition: btrfs.c:3006
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
REFIID riid
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
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static PVOID ptr
Definition: dispmode.c:27
static const WCHAR url[]
Definition: encode.c:1384
HRESULT hres
Definition: protocol.c:465
const char * uri
Definition: sec_mgr.c:1588
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
#define DWORD
Definition: nt_native.h:44
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
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
#define URL_APPLY_GUESSSCHEME
Definition: shlwapi.h:518
#define URL_APPLY_DEFAULT
Definition: shlwapi.h:517
#define URL_UNESCAPE_INPLACE
Definition: shlwapi.h:525
#define URL_APPLY_GUESSFILE
Definition: shlwapi.h:519
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
Definition: bsc.c:39
HRESULT(* onDataAvailable)(void *, char *, DWORD)
Definition: bsc.c:45
IBinding * binding
Definition: bsc.c:47
LONG ref
Definition: bsc.c:42
IStream * memstream
Definition: bsc.c:48
HRESULT hres
Definition: bsc.c:49
void * obj
Definition: bsc.c:44
IBindStatusCallback IBindStatusCallback_iface
Definition: bsc.c:40
Definition: xmldoc.c:231
IBindStatusCallback IBindStatusCallback_iface
Definition: xmldoc.c:232
Definition: send.c:48
Definition: parse.h:23
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI CreateURLMonikerEx2(IMoniker *pmkContext, IUri *pUri, IMoniker **ppmk, DWORD dwFlags)
Definition: umon.c:668
HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbscPrevious, DWORD dwReserved)
Definition: bindctx.c:615
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193