ReactOS 0.4.17-dev-573-g8315b8c
bindprot.c
Go to the documentation of this file.
1/*
2 * Copyright 2007-2009 Jacek 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
19#include "urlmon_main.h"
20#include "wine/debug.h"
21
23
25
26struct _task_header_t {
29};
30
31#define BUFFER_SIZE 2048
32#define MIME_TEST_SIZE 255
33
34#define WM_MK_CONTINUE (WM_USER+101)
35#define WM_MK_RELEASE (WM_USER+102)
36
38{
40
41 while(1) {
42 EnterCriticalSection(&This->section);
43
44 task = This->task_queue_head;
45 if(task) {
46 This->task_queue_head = task->next;
47 if(!This->task_queue_head)
48 This->task_queue_tail = NULL;
49 }
50
51 LeaveCriticalSection(&This->section);
52
53 if(!task)
54 break;
55
56 This->continue_call++;
57 task->proc(This, task);
58 This->continue_call--;
59 }
60}
61
63{
64 switch(msg) {
65 case WM_MK_CONTINUE: {
67
69
70 IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
71 return 0;
72 }
73 case WM_MK_RELEASE: {
75
76 if(!--data->notif_hwnd_cnt) {
78 data->notif_hwnd = NULL;
79 }
80 }
81 }
82
84}
85
87
89{
90 static WNDCLASSEXW wndclass = {
91 sizeof(wndclass), 0, notif_wnd_proc, 0, 0,
93 L"URL Moniker Notification Window", NULL
94 };
95
96 wndclass.hInstance = hProxyDll;
98 return TRUE;
99}
100
102{
105}
106
108{
109 tls_data_t *tls_data;
110
111 static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
112
113 tls_data = get_tls_data();
114 if(!tls_data)
115 return NULL;
116
117 if(tls_data->notif_hwnd_cnt) {
118 tls_data->notif_hwnd_cnt++;
119 return tls_data->notif_hwnd;
120 }
121
123 if(!notif_wnd_class)
124 return NULL;
125
127 L"URL Moniker Notification Window", 0, 0, 0, 0, 0, HWND_MESSAGE,
129 if(tls_data->notif_hwnd)
130 tls_data->notif_hwnd_cnt++;
131
132 TRACE("hwnd = %p\n", tls_data->notif_hwnd);
133
134 return tls_data->notif_hwnd;
135}
136
138{
140
141 if(!data)
142 return;
143
144 if(data->notif_hwnd != hwnd) {
145 PostMessageW(data->notif_hwnd, WM_MK_RELEASE, 0, 0);
146 return;
147 }
148
149 if(!--data->notif_hwnd_cnt) {
150 DestroyWindow(data->notif_hwnd);
151 data->notif_hwnd = NULL;
152 }
153}
154
156{
157 BOOL do_post = FALSE;
158
159 task->proc = proc;
160 task->next = NULL;
161
162 EnterCriticalSection(&This->section);
163
164 if(This->task_queue_tail) {
165 This->task_queue_tail->next = task;
166 This->task_queue_tail = task;
167 }else {
168 This->task_queue_tail = This->task_queue_head = task;
169 do_post = !This->continue_call;
170 }
171
172 LeaveCriticalSection(&This->section);
173
174 if(do_post) {
175 IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
176 PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)This);
177 }
178}
179
181{
182 return This->apartment_thread == GetCurrentThreadId();
183}
184
186{
187 return !(This->pi & PI_APARTMENTTHREADED) || (is_apartment_thread(This) && !This->continue_call);
188}
189
191{
192 PROTOCOLFILTERDATA filter_data = { sizeof(PROTOCOLFILTERDATA), NULL, NULL, NULL, 0 };
194
195 hres = IInternetProtocol_QueryInterface(mime_filter, &IID_IInternetProtocolSink, (void**)&This->protocol_sink_handler);
196 if(FAILED(hres)) {
197 This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface;
198 return hres;
199 }
200
201 IInternetProtocol_AddRef(mime_filter);
202 This->protocol_handler = mime_filter;
203
204 filter_data.pProtocol = &This->default_protocol_handler.IInternetProtocol_iface;
205 hres = IInternetProtocol_Start(mime_filter, This->mime, &This->default_protocol_handler.IInternetProtocolSink_iface,
206 &This->IInternetBindInfo_iface, PI_FILTER_MODE|PI_FORCE_ASYNC,
207 (HANDLE_PTR)&filter_data);
208 if(FAILED(hres)) {
209 IInternetProtocolSink_Release(This->protocol_sink_handler);
210 IInternetProtocol_Release(This->protocol_handler);
211 This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface;
212 This->protocol_handler = &This->default_protocol_handler.IInternetProtocol_iface;
213 return hres;
214 }
215
216 /* NOTE: IE9 calls it on the new protocol_sink. It doesn't make sense so it seems to be a bug there. */
217 IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_LOADINGMIMEHANDLER, NULL);
218
219 return S_OK;
220}
221
223{
226
227 free(This->mime);
228 This->mime = wcsdup(mime);
229
230 if(This->protocol_handler==&This->default_protocol_handler.IInternetProtocol_iface
232 TRACE("Got mime filter for %s\n", debugstr_w(mime));
233
235 IInternetProtocol_Release(mime_filter);
236 if(FAILED(hres))
237 FIXME("MIME filter failed: %08lx\n", hres);
238 }
239
240 if(This->reported_mime || verified || !(This->pi & PI_MIMEVERIFICATION)) {
241 This->reported_mime = TRUE;
242 IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, mime);
243 }
244}
245
247{
248 return CONTAINING_RECORD(iface, BindProtocol, IInternetProtocolEx_iface);
249}
250
252{
254
255 *ppv = NULL;
257 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
258 *ppv = &This->IInternetProtocolEx_iface;
259 }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
260 TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
261 *ppv = &This->IInternetProtocolEx_iface;
262 }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
263 TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
264 *ppv = &This->IInternetProtocolEx_iface;
265 }else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
266 TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
267 *ppv = &This->IInternetProtocolEx_iface;
268 }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) {
269 TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv);
270 *ppv = &This->IInternetBindInfo_iface;
271 }else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
272 TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
273 *ppv = &This->IInternetPriority_iface;
274 }else if(IsEqualGUID(&IID_IAuthenticate, riid)) {
275 FIXME("(%p)->(IID_IAuthenticate %p)\n", This, ppv);
276 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
277 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
278 *ppv = &This->IServiceProvider_iface;
279 }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) {
280 TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv);
281 *ppv = &This->IInternetProtocolSink_iface;
282 }else if(This->protocol_unk) {
284 hres = IUnknown_QueryInterface(This->protocol_unk, riid, ppv);
285 TRACE("(%p) aggregated handler returned %08lx for %s\n", This, hres, debugstr_guid(riid));
286 return hres;
287 }else {
288 WARN("not supported interface %s\n", debugstr_guid(riid));
289 }
290
291 if(!*ppv)
292 return E_NOINTERFACE;
293
294 IUnknown_AddRef((IUnknown*)*ppv);
295 return S_OK;
296}
297
299{
302 TRACE("(%p) ref=%ld\n", This, ref);
303 return ref;
304}
305
307{
308 if(This->protocol) {
309 IInternetProtocol_Release(This->protocol);
310 This->protocol = NULL;
311 }
312 if(This->protocol_handler && This->protocol_handler != &This->default_protocol_handler.IInternetProtocol_iface) {
313 IInternetProtocol_Release(This->protocol_handler);
314 This->protocol_handler = &This->default_protocol_handler.IInternetProtocol_iface;
315 }
316 if(This->protocol_sink_handler &&
317 This->protocol_sink_handler != &This->default_protocol_handler.IInternetProtocolSink_iface) {
318 IInternetProtocolSink_Release(This->protocol_sink_handler);
319 This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface;
320 }
321 if(This->protocol_unk) {
322 IUnknown_Release(This->protocol_unk);
323 This->protocol_unk = NULL;
324 }
325}
326
328{
331
332 TRACE("(%p) ref=%ld\n", This, ref);
333
334 if(!ref) {
336 if(This->redirect_callback)
337 IBindCallbackRedirect_Release(This->redirect_callback);
338 if(This->bind_info)
339 IInternetBindInfo_Release(This->bind_info);
340 if(This->uri)
341 IUri_Release(This->uri);
342 SysFreeString(This->display_uri);
343
345
346 if(This->notif_hwnd)
347 release_notif_hwnd(This->notif_hwnd);
348 This->section.DebugInfo->Spare[0] = 0;
349 DeleteCriticalSection(&This->section);
350
351 free(This->mime);
352 free(This);
353
355 }
356
357 return ref;
358}
359
361 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
363{
365 IUri *uri;
367
368 TRACE("(%p)->(%s %p %p %08lx %Ix)\n", This, debugstr_w(szUrl), pOIProtSink,
369 pOIBindInfo, grfPI, dwReserved);
370
371 hres = CreateUri(szUrl, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri);
372 if(FAILED(hres))
373 return hres;
374
375 hres = IInternetProtocolEx_StartEx(&This->IInternetProtocolEx_iface, uri, pOIProtSink,
376 pOIBindInfo, grfPI, (HANDLE*)dwReserved);
377
378 IUri_Release(uri);
379 return hres;
380}
381
382static HRESULT WINAPI BindProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
383{
385
386 TRACE("(%p)->(%p)\n", This, pProtocolData);
387
388 return IInternetProtocol_Continue(This->protocol_handler, pProtocolData);
389}
390
393{
395
396 TRACE("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
397
398 return IInternetProtocol_Abort(This->protocol_handler, hrReason, dwOptions);
399}
400
402{
404
405 TRACE("(%p)->(%08lx)\n", This, dwOptions);
406
407 return IInternetProtocol_Terminate(This->protocol_handler, dwOptions);
408}
409
411{
413 FIXME("(%p)\n", This);
414 return E_NOTIMPL;
415}
416
418{
420 FIXME("(%p)\n", This);
421 return E_NOTIMPL;
422}
423
425 ULONG cb, ULONG *pcbRead)
426{
428
429 TRACE("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead);
430
431 if(pcbRead)
432 *pcbRead = 0;
433 return IInternetProtocol_Read(This->protocol_handler, pv, cb, pcbRead);
434}
435
437 DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
438{
440 FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
441 return E_NOTIMPL;
442}
443
445{
447
448 TRACE("(%p)->(%08lx)\n", This, dwOptions);
449
450 return IInternetProtocol_LockRequest(This->protocol_handler, dwOptions);
451}
452
454{
456
457 TRACE("(%p)\n", This);
458
459 return IInternetProtocol_UnlockRequest(This->protocol_handler);
460}
461
463 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
464 DWORD grfPI, HANDLE *dwReserved)
465{
468 IInternetProtocolEx *protocolex;
472 IUnknown *protocol_unk = NULL;
473 LPOLESTR clsid_str;
475
476 TRACE("(%p)->(%p %p %p %08lx %p)\n", This, pUri, pOIProtSink, pOIBindInfo, grfPI, dwReserved);
477
478 if(!pUri || !pOIProtSink || !pOIBindInfo)
479 return E_INVALIDARG;
480
481 This->pi = grfPI;
482
483 if(This->uri) {
484 SysFreeString(This->display_uri);
485 IUri_Release(This->uri);
486 }
487 IUri_AddRef(pUri);
488 This->uri = pUri;
489
490 hres = IInternetProtocolSink_QueryInterface(pOIProtSink, &IID_IServiceProvider,
491 (void**)&service_provider);
492 if(SUCCEEDED(hres)) {
493 /* FIXME: What's protocol CLSID here? */
494 IServiceProvider_QueryService(service_provider, &IID_IInternetProtocol,
495 &IID_IInternetProtocol, (void**)&protocol);
496 IServiceProvider_Release(service_provider);
497 }
498
499 if(!protocol) {
501
502 hres = get_protocol_handler(pUri, &clsid, &cf);
503 if(FAILED(hres))
504 return hres;
505
506 hres = IClassFactory_CreateInstance(cf, (IUnknown*)&This->IInternetBindInfo_iface,
507 &IID_IUnknown, (void**)&protocol_unk);
508 if(SUCCEEDED(hres)) {
509 hres = IUnknown_QueryInterface(protocol_unk, &IID_IInternetProtocol, (void**)&protocol);
510 if(SUCCEEDED(hres))
511 This->protocol_unk = protocol_unk;
512 else
513 IUnknown_Release(protocol_unk);
514 }
515 else if(hres == CLASS_E_NOAGGREGATION)
516 hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocol, (void**)&protocol);
517
518 IClassFactory_Release(cf);
519 if(FAILED(hres))
520 return hres;
521 }
522
523 StringFromCLSID(&clsid, &clsid_str);
524 IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_PROTOCOLCLASSID, clsid_str);
525 CoTaskMemFree(clsid_str);
526
527 This->protocol_unk = protocol_unk;
528 This->protocol = protocol;
529
530 if(!protocol_unk)
531 protocol_unk = (IUnknown*)protocol;
532
533 set_binding_sink(This, pOIProtSink, pOIBindInfo);
534
535 hres = IUnknown_QueryInterface(protocol_unk, &IID_IInternetPriority, (void**)&priority);
536 if(SUCCEEDED(hres)) {
537 IInternetPriority_SetPriority(priority, This->priority);
538 IInternetPriority_Release(priority);
539 }
540
541 hres = IUnknown_QueryInterface(protocol_unk, &IID_IInternetProtocolEx, (void**)&protocolex);
542 if(SUCCEEDED(hres)) {
543 hres = IInternetProtocolEx_StartEx(protocolex, pUri, &This->IInternetProtocolSink_iface,
544 &This->IInternetBindInfo_iface, 0, NULL);
545 IInternetProtocolEx_Release(protocolex);
546 }else {
547 hres = IUri_GetDisplayUri(pUri, &This->display_uri);
548 if(FAILED(hres))
549 return hres;
550
551 hres = IInternetProtocol_Start(protocol, This->display_uri, &This->IInternetProtocolSink_iface,
552 &This->IInternetBindInfo_iface, 0, 0);
553 }
554
555 if(SUCCEEDED(hres))
557 return hres;
558}
559
561{
562 IInternetProtocolSink *prev_sink;
564
565 if(sink)
566 IInternetProtocolSink_AddRef(sink);
567 prev_sink = InterlockedExchangePointer((void**)&This->protocol_sink, sink);
568 if(prev_sink)
569 IInternetProtocolSink_Release(prev_sink);
570
571 if(sink)
572 IInternetProtocolSink_QueryInterface(sink, &IID_IServiceProvider, (void**)&service_provider);
575 IServiceProvider_Release(service_provider);
576
577 if(bind_info)
578 IInternetBindInfo_AddRef(bind_info);
579 bind_info = InterlockedExchangePointer((void**)&This->bind_info, bind_info);
580 if(bind_info)
581 IInternetBindInfo_Release(bind_info);
582}
583
584static const IInternetProtocolExVtbl BindProtocolVtbl = {
599};
600
602{
603 return CONTAINING_RECORD(iface, BindProtocol, default_protocol_handler.IInternetProtocol_iface);
604}
605
607{
609
610 *ppv = NULL;
612 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
613 *ppv = &This->default_protocol_handler.IInternetProtocol_iface;
614 }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
615 TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
616 *ppv = &This->default_protocol_handler.IInternetProtocol_iface;
617 }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
618 TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
619 *ppv = &This->default_protocol_handler.IInternetProtocol_iface;
620 }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) {
621 TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv);
622 *ppv = &This->default_protocol_handler.IInternetProtocolSink_iface;
623 }
624
625 if(*ppv) {
626 IInternetProtocol_AddRef(iface);
627 return S_OK;
628 }
629
630 WARN("not supported interface %s\n", debugstr_guid(riid));
631 return E_NOINTERFACE;
632}
633
635{
637 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
638}
639
641{
643 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
644}
645
647 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
649{
650 ERR("Should not be called\n");
651 return E_NOTIMPL;
652}
653
654static HRESULT WINAPI ProtocolHandler_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
655{
659
660 TRACE("(%p)->(%p)\n", This, pProtocolData);
661
662 /* FIXME: This should not be needed. */
663 if(!This->protocol) {
664 if(!This->protocol_unk)
665 return E_FAIL;
666 hres = IUnknown_QueryInterface(This->protocol_unk, &IID_IInternetProtocol, (void**)&protocol);
667 if(FAILED(hres))
668 return E_FAIL;
669 }
670
671 hres = IInternetProtocol_Continue(protocol ? protocol : This->protocol, pProtocolData);
672
673 free(pProtocolData);
674 if(protocol)
675 IInternetProtocol_Release(protocol);
676 return hres;
677}
678
681{
683
684 TRACE("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
685
686 if(This->protocol && !This->reported_result)
687 return IInternetProtocol_Abort(This->protocol, hrReason, dwOptions);
688
689 return S_OK;
690}
691
693{
695
696 TRACE("(%p)->(%08lx)\n", This, dwOptions);
697
698 if(!This->reported_result)
699 return E_FAIL;
700
701 /* This may get released in Terminate call. */
702 IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
703
704 if(This->protocol) {
705 IInternetProtocol_Terminate(This->protocol, 0);
706
707 if (This->protocol_unk) {
708 IInternetProtocol_Release(This->protocol);
709 This->protocol = NULL;
710 }
711 }
712
714
715 if(This->bind_info) {
716 IInternetBindInfo_Release(This->bind_info);
717 This->bind_info = NULL;
718 }
719
720 if(This->redirect_callback) {
721 IBindCallbackRedirect_Release(This->redirect_callback);
722 This->redirect_callback = NULL;
723 }
724
725 IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
726 return S_OK;
727}
728
730{
732 FIXME("(%p)\n", This);
733 return E_NOTIMPL;
734}
735
737{
739 FIXME("(%p)\n", This);
740 return E_NOTIMPL;
741}
742
744 ULONG cb, ULONG *pcbRead)
745{
747 ULONG read = 0;
748 HRESULT hres = S_OK;
749
750 TRACE("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead);
751
752 if(This->buf_size) {
753 read = min(cb, This->buf_size);
754 memcpy(pv, This->buf, read);
755
756 if(read == This->buf_size) {
757 free(This->buf);
758 This->buf = NULL;
759 }else {
760 memmove(This->buf, This->buf+cb, This->buf_size-cb);
761 }
762
763 This->buf_size -= read;
764 }
765
766 if(read < cb) {
768 ULONG cread = 0;
769
770 /* FIXME: We shouldn't need it, but out binding code currently depends on it. */
771 if(!This->protocol && This->protocol_unk) {
772 hres = IUnknown_QueryInterface(This->protocol_unk, &IID_IInternetProtocol,
773 (void**)&protocol);
774 if(FAILED(hres))
775 return E_ABORT;
776 }else {
777 protocol = This->protocol;
778 }
779
781 This->continue_call++;
782 hres = IInternetProtocol_Read(protocol, (BYTE*)pv+read, cb-read, &cread);
784 This->continue_call--;
785 read += cread;
786
787 if(!This->protocol)
788 IInternetProtocol_Release(protocol);
789 }
790
791 *pcbRead = read;
792 return hres;
793}
794
796 DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
797{
799 FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
800 return E_NOTIMPL;
801}
802
804{
806
807 TRACE("(%p)->(%08lx)\n", This, dwOptions);
808
809 return IInternetProtocol_LockRequest(This->protocol, dwOptions);
810}
811
813{
815
816 TRACE("(%p)\n", This);
817
818 if (This->protocol)
819 return IInternetProtocol_UnlockRequest(This->protocol);
820 return S_OK;
821}
822
823static const IInternetProtocolVtbl InternetProtocolHandlerVtbl = {
837};
838
840{
841 return CONTAINING_RECORD(iface, BindProtocol, default_protocol_handler.IInternetProtocolSink_iface);
842}
843
845 REFIID riid, void **ppvObject)
846{
848 return IInternetProtocol_QueryInterface(&This->default_protocol_handler.IInternetProtocol_iface,
849 riid, ppvObject);
850}
851
853{
855 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
856}
857
859{
861 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
862}
863
865 PROTOCOLDATA *pProtocolData)
866{
868
869 TRACE("(%p)->(%p)\n", This, pProtocolData);
870
871 if(!This->protocol_sink) {
872 IInternetProtocol_Continue(This->protocol_handler, pProtocolData);
873 return S_OK;
874 }
875
876 return IInternetProtocolSink_Switch(This->protocol_sink, pProtocolData);
877}
878
880 ULONG status_code, LPCWSTR status_text)
881{
883
884 TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(status_code), debugstr_w(status_text));
885
886 if(!This->protocol_sink)
887 return S_OK;
888
889 switch(status_code) {
890 case BINDSTATUS_FINDINGRESOURCE:
891 case BINDSTATUS_CONNECTING:
892 case BINDSTATUS_REDIRECTING:
893 case BINDSTATUS_SENDINGREQUEST:
894 case BINDSTATUS_CACHEFILENAMEAVAILABLE:
895 case BINDSTATUS_DIRECTBIND:
896 case BINDSTATUS_ACCEPTRANGES:
897 case BINDSTATUS_DECODING:
898 IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text);
899 break;
900
901 case BINDSTATUS_BEGINDOWNLOADDATA:
902 IInternetProtocolSink_ReportData(This->protocol_sink, This->bscf, This->progress, This->progress_max);
903 break;
904
905 case BINDSTATUS_MIMETYPEAVAILABLE:
906 mime_available(This, status_text, FALSE);
907 break;
908
909 case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE:
910 mime_available(This, status_text, TRUE);
911 break;
912
913 default:
914 FIXME("unsupported ulStatusCode %lu\n", status_code);
915 }
916
917 return S_OK;
918}
919
921{
922 DWORD bscf = This->bscf;
924
925 if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) {
927 DWORD read = 0;
928 LPWSTR mime;
929
930 do {
931 read = 0;
932 hres = IInternetProtocol_Read(This->protocol, buf,
933 sizeof(buf)-This->buf_size, &read);
934 if(FAILED(hres) && hres != E_PENDING)
935 return hres;
936
937 if(!This->buf) {
938 This->buf = malloc(BUFFER_SIZE);
939 if(!This->buf)
940 return E_OUTOFMEMORY;
941 }else if(read + This->buf_size > BUFFER_SIZE) {
942 BYTE *tmp;
943
944 tmp = realloc(This->buf, read + This->buf_size);
945 if(!tmp)
946 return E_OUTOFMEMORY;
947 This->buf = tmp;
948 }
949
950 memcpy(This->buf+This->buf_size, buf, read);
951 This->buf_size += read;
952 }while(This->buf_size < MIME_TEST_SIZE && hres == S_OK);
953
954 if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE)
955 return S_OK;
956
957 bscf = BSCF_FIRSTDATANOTIFICATION;
958 if(hres == S_FALSE)
959 bscf |= BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE;
960
961 if(!This->reported_mime) {
962 BSTR raw_uri;
963
964 hres = IUri_GetRawUri(This->uri, &raw_uri);
965 if(FAILED(hres))
966 return hres;
967
968 hres = FindMimeFromData(NULL, raw_uri, This->buf, min(This->buf_size, MIME_TEST_SIZE),
969 This->mime, 0, &mime, 0);
970 SysFreeString(raw_uri);
971 if(FAILED(hres))
972 return hres;
973
974 free(This->mime);
975 This->mime = wcsdup(mime);
977 This->reported_mime = TRUE;
978 if(This->protocol_sink)
979 IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, This->mime);
980 }
981 }
982
983 if(!This->protocol_sink)
984 return S_OK;
985
986 return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, This->progress, This->progress_max);
987}
988
990 DWORD bscf, ULONG progress, ULONG progress_max)
991{
994
995 TRACE("(%p)->(%lx %lu %lu)\n", This, bscf, progress, progress_max);
996
997 This->bscf = bscf;
998 This->progress = progress;
999 This->progress_max = progress_max;
1000
1001 if(!This->protocol_sink)
1002 return S_OK;
1003
1005 This->continue_call++;
1006
1008
1010 This->continue_call--;
1012 }
1013 return hres;
1014}
1015
1017{
1018 HRESULT hres;
1019
1020 if(This->redirect_callback) {
1021 VARIANT_BOOL cancel = VARIANT_FALSE;
1022 IBindCallbackRedirect_Redirect(This->redirect_callback, url, &cancel);
1023 if(cancel)
1025 }
1026
1027 if(This->protocol_sink) {
1028 hres = IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_REDIRECTING, url);
1029 if(FAILED(hres))
1030 return hres;
1031 }
1032
1033 IInternetProtocol_Terminate(This->protocol, 0); /* should this be done in StartEx? */
1035
1036 return IInternetProtocolEx_Start(&This->IInternetProtocolEx_iface, url, This->protocol_sink, This->bind_info, This->pi, 0);
1037}
1038
1040 HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
1041{
1043
1044 TRACE("(%p)->(%08lx %ld %s)\n", This, hrResult, dwError, debugstr_w(szResult));
1045
1046 if(hrResult == INET_E_REDIRECT_FAILED) {
1047 hrResult = handle_redirect(This, szResult);
1048 if(hrResult == S_OK)
1049 return S_OK;
1050 szResult = NULL;
1051 }
1052
1053 if(This->protocol_sink)
1054 return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult);
1055 return S_OK;
1056}
1057
1058static const IInternetProtocolSinkVtbl InternetProtocolSinkHandlerVtbl = {
1066};
1067
1069{
1070 return CONTAINING_RECORD(iface, BindProtocol, IInternetBindInfo_iface);
1071}
1072
1074 REFIID riid, void **ppv)
1075{
1077 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1078}
1079
1081{
1083 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1084}
1085
1087{
1089 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1090}
1091
1093 DWORD *grfBINDF, BINDINFO *pbindinfo)
1094{
1096 HRESULT hres;
1097
1098 TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
1099
1100 hres = IInternetBindInfo_GetBindInfo(This->bind_info, grfBINDF, pbindinfo);
1101 if(FAILED(hres)) {
1102 WARN("GetBindInfo failed: %08lx\n", hres);
1103 return hres;
1104 }
1105
1106 if((pbindinfo->dwOptions & BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS) && !This->redirect_callback) {
1108
1109 hres = IInternetProtocolSink_QueryInterface(This->protocol_sink, &IID_IServiceProvider, (void**)&service_provider);
1110 if(SUCCEEDED(hres)) {
1111 hres = IServiceProvider_QueryService(service_provider, &IID_IBindCallbackRedirect, &IID_IBindCallbackRedirect,
1112 (void**)&This->redirect_callback);
1113 IServiceProvider_Release(service_provider);
1114 }
1115 }
1116
1117 *grfBINDF |= BINDF_FROMURLMON;
1118 return hres;
1119}
1120
1122 ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
1123{
1125
1126 TRACE("(%p)->(%ld %p %ld %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched);
1127
1128 return IInternetBindInfo_GetBindString(This->bind_info, ulStringType, ppwzStr, cEl, pcElFetched);
1129}
1130
1131static const IInternetBindInfoVtbl InternetBindInfoVtbl = {
1137};
1138
1140{
1141 return CONTAINING_RECORD(iface, BindProtocol, IInternetPriority_iface);
1142}
1143
1145 REFIID riid, void **ppv)
1146{
1148 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1149}
1150
1152{
1154 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1155}
1156
1158{
1160 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1161}
1162
1164{
1166
1167 TRACE("(%p)->(%ld)\n", This, nPriority);
1168
1169 This->priority = nPriority;
1170 return S_OK;
1171}
1172
1174{
1176
1177 TRACE("(%p)->(%p)\n", This, pnPriority);
1178
1179 *pnPriority = This->priority;
1180 return S_OK;
1181}
1182
1183static const IInternetPriorityVtbl InternetPriorityVtbl = {
1189
1190};
1191
1193{
1194 return CONTAINING_RECORD(iface, BindProtocol, IInternetProtocolSink_iface);
1195}
1196
1198 REFIID riid, void **ppv)
1199{
1201 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1202}
1203
1205{
1207 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1208}
1209
1211{
1213 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1214}
1215
1216typedef struct {
1218 PROTOCOLDATA *data;
1220
1222{
1224
1225 IInternetProtocol_Continue(bind->protocol_handler, task->data);
1226
1227 free(task);
1228}
1229
1231 PROTOCOLDATA *pProtocolData)
1232{
1234 PROTOCOLDATA *data;
1235
1236 TRACE("(%p)->(%p)\n", This, pProtocolData);
1237
1238 TRACE("flags %lx state %lx data %p cb %lu\n", pProtocolData->grfFlags, pProtocolData->dwState,
1239 pProtocolData->pData, pProtocolData->cbData);
1240
1241 data = malloc(sizeof(PROTOCOLDATA));
1242 if(!data)
1243 return E_OUTOFMEMORY;
1244 memcpy(data, pProtocolData, sizeof(PROTOCOLDATA));
1245
1246 if((This->pi&PI_APARTMENTTHREADED && pProtocolData->grfFlags&PI_FORCE_ASYNC)
1247 || !do_direct_notif(This)) {
1249
1250 task = malloc(sizeof(switch_task_t));
1251 if(!task)
1252 {
1253 free(data);
1254 return E_OUTOFMEMORY;
1255 }
1256
1257 task->data = data;
1258
1259 push_task(This, &task->header, switch_proc);
1260 return S_OK;
1261 }
1262
1263 return IInternetProtocolSink_Switch(This->protocol_sink_handler, data);
1264}
1265
1266typedef struct {
1268
1272
1274{
1276
1277 IInternetProtocolSink_ReportProgress(This->protocol_sink_handler, task->status_code, task->status_text);
1278
1279 free(task->status_text);
1280 free(task);
1281}
1282
1284 ULONG ulStatusCode, LPCWSTR szStatusText)
1285{
1287
1288 TRACE("(%p)->(%lu %s)\n", This, ulStatusCode, debugstr_w(szStatusText));
1289
1290 if(do_direct_notif(This)) {
1291 IInternetProtocolSink_ReportProgress(This->protocol_sink_handler, ulStatusCode, szStatusText);
1292 }else {
1294
1295 task = malloc(sizeof(on_progress_task_t));
1296
1297 task->status_code = ulStatusCode;
1298 task->status_text = wcsdup(szStatusText);
1299
1300 push_task(This, &task->header, on_progress_proc);
1301 }
1302
1303 return S_OK;
1304}
1305
1306typedef struct {
1312
1314{
1316
1317 IInternetProtocolSink_ReportData(This->protocol_sink_handler,
1318 task->bscf, task->progress, task->progress_max);
1319
1320 free(task);
1321}
1322
1324 DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
1325{
1327
1328 TRACE("(%p)->(%lx %lu %lu)\n", This, grfBSCF, ulProgress, ulProgressMax);
1329
1330 if(!This->protocol_sink)
1331 return S_OK;
1332
1333 if(!do_direct_notif(This)) {
1335
1336 task = malloc(sizeof(report_data_task_t));
1337 if(!task)
1338 return E_OUTOFMEMORY;
1339
1340 task->bscf = grfBSCF;
1341 task->progress = ulProgress;
1342 task->progress_max = ulProgressMax;
1343
1344 push_task(This, &task->header, report_data_proc);
1345 return S_OK;
1346 }
1347
1348 return IInternetProtocolSink_ReportData(This->protocol_sink_handler,
1349 grfBSCF, ulProgress, ulProgressMax);
1350}
1351
1352typedef struct {
1354
1359
1361{
1363
1364 IInternetProtocolSink_ReportResult(This->protocol_sink_handler, task->hres, task->err, task->str);
1365
1366 free(task->str);
1367 free(task);
1368}
1369
1371 HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
1372{
1374
1375 TRACE("(%p)->(%08lx %ld %s)\n", This, hrResult, dwError, debugstr_w(szResult));
1376
1377 if(!This->protocol_sink)
1378 return E_FAIL;
1379 This->reported_result = TRUE;
1380
1381 if(!do_direct_notif(This)) {
1383
1384 task = malloc(sizeof(report_result_task_t));
1385 if(!task)
1386 return E_OUTOFMEMORY;
1387
1388 task->hres = hrResult;
1389 task->err = dwError;
1390 task->str = wcsdup(szResult);
1391
1393 return S_OK;
1394 }
1395
1396 return IInternetProtocolSink_ReportResult(This->protocol_sink_handler, hrResult, dwError, szResult);
1397}
1398
1399static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = {
1407};
1408
1410{
1411 return CONTAINING_RECORD(iface, BindProtocol, IServiceProvider_iface);
1412}
1413
1415 REFIID riid, void **ppv)
1416{
1418 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1419}
1420
1422{
1424 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1425}
1426
1428{
1430 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1431}
1432
1434 REFGUID guidService, REFIID riid, void **ppv)
1435{
1437
1438 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
1439
1440 if(!This->service_provider)
1441 return E_NOINTERFACE;
1442
1443 return IServiceProvider_QueryService(This->service_provider, guidService, riid, ppv);
1444}
1445
1446static const IServiceProviderVtbl ServiceProviderVtbl = {
1451};
1452
1454{
1455 BindProtocol *ret = calloc(1, sizeof(BindProtocol));
1456
1457 ret->IInternetProtocolEx_iface.lpVtbl = &BindProtocolVtbl;
1458 ret->IInternetBindInfo_iface.lpVtbl = &InternetBindInfoVtbl;
1459 ret->IInternetPriority_iface.lpVtbl = &InternetPriorityVtbl;
1460 ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
1461 ret->IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkVtbl;
1462
1463 ret->default_protocol_handler.IInternetProtocol_iface.lpVtbl = &InternetProtocolHandlerVtbl;
1464 ret->default_protocol_handler.IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkHandlerVtbl;
1465
1466 ret->ref = 1;
1467 ret->apartment_thread = GetCurrentThreadId();
1468 ret->notif_hwnd = get_notif_hwnd();
1469 ret->protocol_handler = &ret->default_protocol_handler.IInternetProtocol_iface;
1470 ret->protocol_sink_handler = &ret->default_protocol_handler.IInternetProtocolSink_iface;
1472 ret->section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BindProtocol.section");
1473
1475
1476 *protocol = ret;
1477 return S_OK;
1478}
#define read
Definition: acwin.h:97
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
unsigned long HANDLE_PTR
Definition: basetsd.h:72
const GUID IID_IUnknown
static ULONG WINAPI ProtocolHandler_AddRef(IInternetProtocol *iface)
Definition: bindprot.c:634
static ULONG WINAPI ProtocolHandler_Release(IInternetProtocol *iface)
Definition: bindprot.c:640
static HRESULT WINAPI BindProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: bindprot.c:444
static HRESULT WINAPI BPServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: bindprot.c:1433
static BindProtocol * impl_from_IInternetBindInfo(IInternetBindInfo *iface)
Definition: bindprot.c:1068
static HRESULT WINAPI BindProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: bindprot.c:360
#define MIME_TEST_SIZE
Definition: bindprot.c:32
static HRESULT WINAPI BindProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
Definition: bindprot.c:382
static HRESULT WINAPI BindProtocol_Read(IInternetProtocolEx *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: bindprot.c:424
static HRESULT WINAPI ProtocolHandler_UnlockRequest(IInternetProtocol *iface)
Definition: bindprot.c:812
static HRESULT WINAPI InternetPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1144
static const IInternetProtocolVtbl InternetProtocolHandlerVtbl
Definition: bindprot.c:823
static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter)
Definition: bindprot.c:190
static ULONG WINAPI ProtocolSinkHandler_AddRef(IInternetProtocolSink *iface)
Definition: bindprot.c:852
static const IInternetBindInfoVtbl InternetBindInfoVtbl
Definition: bindprot.c:1131
static HRESULT WINAPI BindProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: bindprot.c:401
static BOOL WINAPI register_notif_wnd_class(INIT_ONCE *once, void *param, void **context)
Definition: bindprot.c:88
static HRESULT WINAPI BindProtocol_Resume(IInternetProtocolEx *iface)
Definition: bindprot.c:417
static HRESULT WINAPI InternetPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
Definition: bindprot.c:1163
static ULONG WINAPI BindInfo_Release(IInternetBindInfo *iface)
Definition: bindprot.c:1086
void unregister_notif_wnd_class(void)
Definition: bindprot.c:101
static HRESULT WINAPI BPInternetProtocolSink_QueryInterface(IInternetProtocolSink *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1197
static BindProtocol * impl_from_IInternetPriority(IInternetPriority *iface)
Definition: bindprot.c:1139
static void mime_available(BindProtocol *This, LPCWSTR mime, BOOL verified)
Definition: bindprot.c:222
static HRESULT WINAPI InternetPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
Definition: bindprot.c:1173
static HRESULT WINAPI ProtocolSinkHandler_ReportData(IInternetProtocolSink *iface, DWORD bscf, ULONG progress, ULONG progress_max)
Definition: bindprot.c:989
static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
Definition: bindprot.c:462
static void release_protocol_handler(BindProtocol *This)
Definition: bindprot.c:306
static void push_task(BindProtocol *This, task_header_t *task, task_proc_t proc)
Definition: bindprot.c:155
static ULONG WINAPI InternetPriority_Release(IInternetPriority *iface)
Definition: bindprot.c:1157
static HRESULT report_data(BindProtocol *This)
Definition: bindprot.c:920
static HRESULT WINAPI ProtocolSinkHandler_ReportProgress(IInternetProtocolSink *iface, ULONG status_code, LPCWSTR status_text)
Definition: bindprot.c:879
static ULONG WINAPI BPServiceProvider_AddRef(IServiceProvider *iface)
Definition: bindprot.c:1421
static BindProtocol * impl_from_IInternetProtocolSink(IInternetProtocolSink *iface)
Definition: bindprot.c:1192
static HRESULT WINAPI ProtocolSinkHandler_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: bindprot.c:864
static HRESULT handle_redirect(BindProtocol *This, const WCHAR *url)
Definition: bindprot.c:1016
static BindProtocol * impl_from_IInternetProtocolSinkHandler(IInternetProtocolSink *iface)
Definition: bindprot.c:839
static void report_result_proc(BindProtocol *This, task_header_t *t)
Definition: bindprot.c:1360
static void switch_proc(BindProtocol *bind, task_header_t *t)
Definition: bindprot.c:1221
static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: bindprot.c:646
HRESULT create_binding_protocol(BindProtocol **protocol)
Definition: bindprot.c:1453
static HRESULT WINAPI BPInternetProtocolSink_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
Definition: bindprot.c:1370
static HRESULT WINAPI ProtocolHandler_Abort(IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions)
Definition: bindprot.c:679
static HRESULT WINAPI ProtocolHandler_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
Definition: bindprot.c:803
static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD dwOptions)
Definition: bindprot.c:692
static HRESULT WINAPI BindProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
Definition: bindprot.c:391
static BindProtocol * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: bindprot.c:1409
#define BUFFER_SIZE
Definition: bindprot.c:31
static HRESULT WINAPI BPInternetProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: bindprot.c:1230
static HRESULT WINAPI BindInfo_QueryInterface(IInternetBindInfo *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1073
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
Definition: bindprot.c:1399
static HRESULT WINAPI BindProtocol_Suspend(IInternetProtocolEx *iface)
Definition: bindprot.c:410
static HRESULT WINAPI BindProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: bindprot.c:436
static HRESULT WINAPI BindInfo_GetBindInfo(IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: bindprot.c:1092
static const IInternetProtocolExVtbl BindProtocolVtbl
Definition: bindprot.c:584
static HRESULT WINAPI ProtocolHandler_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
Definition: bindprot.c:606
static void process_tasks(BindProtocol *This)
Definition: bindprot.c:37
static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocolEx *iface)
Definition: bindprot.c:453
static HRESULT WINAPI BPServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1414
void(* task_proc_t)(BindProtocol *, task_header_t *)
Definition: bindprot.c:24
static void report_data_proc(BindProtocol *This, task_header_t *t)
Definition: bindprot.c:1313
static BindProtocol * impl_from_IInternetProtocol(IInternetProtocol *iface)
Definition: bindprot.c:601
static HRESULT WINAPI ProtocolHandler_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: bindprot.c:795
static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface)
Definition: bindprot.c:327
static void on_progress_proc(BindProtocol *This, task_header_t *t)
Definition: bindprot.c:1273
static LRESULT WINAPI notif_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: bindprot.c:62
void set_binding_sink(BindProtocol *This, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
Definition: bindprot.c:560
#define WM_MK_CONTINUE
Definition: bindprot.c:34
static ULONG WINAPI ProtocolSinkHandler_Release(IInternetProtocolSink *iface)
Definition: bindprot.c:858
static HRESULT WINAPI ProtocolSinkHandler_QueryInterface(IInternetProtocolSink *iface, REFIID riid, void **ppvObject)
Definition: bindprot.c:844
void release_notif_hwnd(HWND hwnd)
Definition: bindprot.c:137
static ATOM notif_wnd_class
Definition: bindprot.c:86
static ULONG WINAPI BPInternetProtocolSink_Release(IInternetProtocolSink *iface)
Definition: bindprot.c:1210
static BindProtocol * impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
Definition: bindprot.c:246
HWND get_notif_hwnd(void)
Definition: bindprot.c:107
static HRESULT WINAPI ProtocolHandler_Suspend(IInternetProtocol *iface)
Definition: bindprot.c:729
static HRESULT WINAPI BPInternetProtocolSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: bindprot.c:1283
static const IInternetPriorityVtbl InternetPriorityVtbl
Definition: bindprot.c:1183
static ULONG WINAPI BPInternetProtocolSink_AddRef(IInternetProtocolSink *iface)
Definition: bindprot.c:1204
#define WM_MK_RELEASE
Definition: bindprot.c:35
static ULONG WINAPI InternetPriority_AddRef(IInternetPriority *iface)
Definition: bindprot.c:1151
static HRESULT WINAPI ProtocolHandler_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
Definition: bindprot.c:654
static HRESULT WINAPI ProtocolSinkHandler_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
Definition: bindprot.c:1039
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: bindprot.c:1446
static HRESULT WINAPI BindInfo_GetBindString(IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
Definition: bindprot.c:1121
static const IInternetProtocolSinkVtbl InternetProtocolSinkHandlerVtbl
Definition: bindprot.c:1058
static ULONG WINAPI BindInfo_AddRef(IInternetBindInfo *iface)
Definition: bindprot.c:1080
static HRESULT WINAPI BPInternetProtocolSink_ReportData(IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
Definition: bindprot.c:1323
static BOOL is_apartment_thread(BindProtocol *This)
Definition: bindprot.c:180
static BOOL do_direct_notif(BindProtocol *This)
Definition: bindprot.c:185
static HRESULT WINAPI ProtocolHandler_Resume(IInternetProtocol *iface)
Definition: bindprot.c:736
static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
Definition: bindprot.c:251
static ULONG WINAPI BPServiceProvider_Release(IServiceProvider *iface)
Definition: bindprot.c:1427
static ULONG WINAPI BindProtocol_AddRef(IInternetProtocolEx *iface)
Definition: bindprot.c:298
static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: bindprot.c:743
cd_progress_ptr progress
Definition: cdjpeg.h:152
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
DWORD task
Definition: delayimp.cpp:484
WORD ATOM
Definition: dimm.idl:113
#define E_PENDING
Definition: dinput.h:172
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HRESULT WINAPI StringFromCLSID(REFCLSID clsid, LPOLESTR *str)
Definition: combase.c:1515
HINSTANCE hProxyDll
Definition: combase.c:40
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
OLECHAR * BSTR
Definition: compat.h:2293
short VARIANT_BOOL
Definition: compat.h:2290
BOOL WINAPI InitOnceExecuteOnce(_Inout_ PINIT_ONCE InitOnce, _In_ __callback PINIT_ONCE_FN InitFn, _Inout_opt_ PVOID Parameter, _Outptr_opt_result_maybenull_ LPVOID *Context)
Definition: InitOnce.c:12
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
IInternetProtocol * get_mime_filter(LPCWSTR mime)
Definition: session.c:242
HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, IClassFactory **ret)
Definition: session.c:212
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5382
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble t
Definition: gl.h:2047
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
GLfloat param
Definition: glext.h:5796
unsigned int UINT
Definition: sysinfo.c:13
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_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
HRESULT WINAPI FindMimeFromData(LPBC pBC, LPCWSTR pwzUrl, LPVOID pBuffer, DWORD cbSize, LPCWSTR pwzMimeProposed, DWORD dwMimeFlags, LPWSTR *ppwzMimeOut, DWORD dwReserved)
Definition: mimefilter.c:655
const WCHAR * mime
Definition: mimefilter.c:487
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
static const WCHAR url[]
Definition: encode.c:1384
static IServiceProvider service_provider
Definition: mimeole.c:1286
static IInternetBindInfo bind_info
Definition: mimeole.c:1246
HRESULT hres
Definition: protocol.c:465
const WCHAR * uri
Definition: sec_mgr.c:1564
static int priority
Definition: timer.c:163
#define min(a, b)
Definition: monoChain.cc:55
const CLSID * clsid
Definition: msctf.cpp:50
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
static HANDLE proc()
Definition: pdb.c:32
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
#define calloc
Definition: rosglue.h:14
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwOptions
Definition: solitaire.cpp:25
IInternetProtocol IInternetProtocol_iface
Definition: urlmon_main.h:188
IInternetProtocolSink IInternetProtocolSink_iface
Definition: urlmon_main.h:175
Definition: scsiwmi.h:51
HINSTANCE hInstance
Definition: winuser.h:3329
IInternetProtocol * pProtocol
Definition: urlmon.idl:1747
task_proc_t proc
Definition: ieframe.h:80
task_header_t * next
Definition: bindprot.c:28
Definition: http.c:7252
task_header_t header
Definition: bindprot.c:1267
Definition: send.c:48
task_header_t header
Definition: bindprot.c:1307
task_header_t header
Definition: bindprot.c:1353
task_header_t header
Definition: bindprot.c:1217
PROTOCOLDATA * data
Definition: bindprot.c:1218
HWND notif_hwnd
Definition: urlmon_main.h:222
DWORD notif_hwnd_cnt
Definition: urlmon_main.h:223
#define DWORD_PTR
Definition: treelist.c:76
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
struct _LARGE_INTEGER::@2527 u
struct _tagPROTOCOLFILTERDATA PROTOCOLFILTERDATA
tls_data_t * get_tls_data(void)
Definition: urlmon_main.c:60
const char * debugstr_bindstatus(ULONG status)
Definition: urlmon_main.c:173
static void URLMON_LockModule(void)
Definition: urlmon_main.h:64
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:65
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
RTL_RUN_ONCE INIT_ONCE
Definition: winbase.h:3652
#define INIT_ONCE_STATIC_INIT
Definition: winbase.h:591
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define INET_E_REDIRECT_FAILED
Definition: winerror.h:4667
#define E_ABORT
Definition: winerror.h:3481
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156
#define HWND_MESSAGE
Definition: winuser.h:1221
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
BOOL WINAPI DestroyWindow(_In_ HWND)
unsigned char BYTE
Definition: xxhash.c:193