ReactOS 0.4.17-dev-573-g8315b8c
bindprot.c File Reference
#include "urlmon_main.h"
#include "wine/debug.h"
Include dependency graph for bindprot.c:

Go to the source code of this file.

Classes

struct  _task_header_t
 
struct  switch_task_t
 
struct  on_progress_task_t
 
struct  report_data_task_t
 
struct  report_result_task_t
 

Macros

#define BUFFER_SIZE   2048
 
#define MIME_TEST_SIZE   255
 
#define WM_MK_CONTINUE   (WM_USER+101)
 
#define WM_MK_RELEASE   (WM_USER+102)
 

Typedefs

typedef void(* task_proc_t) (BindProtocol *, task_header_t *)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (urlmon)
 
static void process_tasks (BindProtocol *This)
 
static LRESULT WINAPI notif_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
static BOOL WINAPI register_notif_wnd_class (INIT_ONCE *once, void *param, void **context)
 
void unregister_notif_wnd_class (void)
 
HWND get_notif_hwnd (void)
 
void release_notif_hwnd (HWND hwnd)
 
static void push_task (BindProtocol *This, task_header_t *task, task_proc_t proc)
 
static BOOL is_apartment_thread (BindProtocol *This)
 
static BOOL do_direct_notif (BindProtocol *This)
 
static HRESULT handle_mime_filter (BindProtocol *This, IInternetProtocol *mime_filter)
 
static void mime_available (BindProtocol *This, LPCWSTR mime, BOOL verified)
 
static BindProtocolimpl_from_IInternetProtocolEx (IInternetProtocolEx *iface)
 
static HRESULT WINAPI BindProtocol_QueryInterface (IInternetProtocolEx *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI BindProtocol_AddRef (IInternetProtocolEx *iface)
 
static void release_protocol_handler (BindProtocol *This)
 
static ULONG WINAPI BindProtocol_Release (IInternetProtocolEx *iface)
 
static HRESULT WINAPI BindProtocol_Start (IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
 
static HRESULT WINAPI BindProtocol_Continue (IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
 
static HRESULT WINAPI BindProtocol_Abort (IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
 
static HRESULT WINAPI BindProtocol_Terminate (IInternetProtocolEx *iface, DWORD dwOptions)
 
static HRESULT WINAPI BindProtocol_Suspend (IInternetProtocolEx *iface)
 
static HRESULT WINAPI BindProtocol_Resume (IInternetProtocolEx *iface)
 
static HRESULT WINAPI BindProtocol_Read (IInternetProtocolEx *iface, void *pv, ULONG cb, ULONG *pcbRead)
 
static HRESULT WINAPI BindProtocol_Seek (IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
 
static HRESULT WINAPI BindProtocol_LockRequest (IInternetProtocolEx *iface, DWORD dwOptions)
 
static HRESULT WINAPI BindProtocol_UnlockRequest (IInternetProtocolEx *iface)
 
static HRESULT WINAPI BindProtocol_StartEx (IInternetProtocolEx *iface, IUri *pUri, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
 
void set_binding_sink (BindProtocol *This, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
 
static BindProtocolimpl_from_IInternetProtocol (IInternetProtocol *iface)
 
static HRESULT WINAPI ProtocolHandler_QueryInterface (IInternetProtocol *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI ProtocolHandler_AddRef (IInternetProtocol *iface)
 
static ULONG WINAPI ProtocolHandler_Release (IInternetProtocol *iface)
 
static HRESULT WINAPI ProtocolHandler_Start (IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
 
static HRESULT WINAPI ProtocolHandler_Continue (IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
 
static HRESULT WINAPI ProtocolHandler_Abort (IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions)
 
static HRESULT WINAPI ProtocolHandler_Terminate (IInternetProtocol *iface, DWORD dwOptions)
 
static HRESULT WINAPI ProtocolHandler_Suspend (IInternetProtocol *iface)
 
static HRESULT WINAPI ProtocolHandler_Resume (IInternetProtocol *iface)
 
static HRESULT WINAPI ProtocolHandler_Read (IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
 
static HRESULT WINAPI ProtocolHandler_Seek (IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
 
static HRESULT WINAPI ProtocolHandler_LockRequest (IInternetProtocol *iface, DWORD dwOptions)
 
static HRESULT WINAPI ProtocolHandler_UnlockRequest (IInternetProtocol *iface)
 
static BindProtocolimpl_from_IInternetProtocolSinkHandler (IInternetProtocolSink *iface)
 
static HRESULT WINAPI ProtocolSinkHandler_QueryInterface (IInternetProtocolSink *iface, REFIID riid, void **ppvObject)
 
static ULONG WINAPI ProtocolSinkHandler_AddRef (IInternetProtocolSink *iface)
 
static ULONG WINAPI ProtocolSinkHandler_Release (IInternetProtocolSink *iface)
 
static HRESULT WINAPI ProtocolSinkHandler_Switch (IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
 
static HRESULT WINAPI ProtocolSinkHandler_ReportProgress (IInternetProtocolSink *iface, ULONG status_code, LPCWSTR status_text)
 
static HRESULT report_data (BindProtocol *This)
 
static HRESULT WINAPI ProtocolSinkHandler_ReportData (IInternetProtocolSink *iface, DWORD bscf, ULONG progress, ULONG progress_max)
 
static HRESULT handle_redirect (BindProtocol *This, const WCHAR *url)
 
static HRESULT WINAPI ProtocolSinkHandler_ReportResult (IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
 
static BindProtocolimpl_from_IInternetBindInfo (IInternetBindInfo *iface)
 
static HRESULT WINAPI BindInfo_QueryInterface (IInternetBindInfo *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI BindInfo_AddRef (IInternetBindInfo *iface)
 
static ULONG WINAPI BindInfo_Release (IInternetBindInfo *iface)
 
static HRESULT WINAPI BindInfo_GetBindInfo (IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
 
static HRESULT WINAPI BindInfo_GetBindString (IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
 
static BindProtocolimpl_from_IInternetPriority (IInternetPriority *iface)
 
static HRESULT WINAPI InternetPriority_QueryInterface (IInternetPriority *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI InternetPriority_AddRef (IInternetPriority *iface)
 
static ULONG WINAPI InternetPriority_Release (IInternetPriority *iface)
 
static HRESULT WINAPI InternetPriority_SetPriority (IInternetPriority *iface, LONG nPriority)
 
static HRESULT WINAPI InternetPriority_GetPriority (IInternetPriority *iface, LONG *pnPriority)
 
static BindProtocolimpl_from_IInternetProtocolSink (IInternetProtocolSink *iface)
 
static HRESULT WINAPI BPInternetProtocolSink_QueryInterface (IInternetProtocolSink *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI BPInternetProtocolSink_AddRef (IInternetProtocolSink *iface)
 
static ULONG WINAPI BPInternetProtocolSink_Release (IInternetProtocolSink *iface)
 
static void switch_proc (BindProtocol *bind, task_header_t *t)
 
static HRESULT WINAPI BPInternetProtocolSink_Switch (IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
 
static void on_progress_proc (BindProtocol *This, task_header_t *t)
 
static HRESULT WINAPI BPInternetProtocolSink_ReportProgress (IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
 
static void report_data_proc (BindProtocol *This, task_header_t *t)
 
static HRESULT WINAPI BPInternetProtocolSink_ReportData (IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
 
static void report_result_proc (BindProtocol *This, task_header_t *t)
 
static HRESULT WINAPI BPInternetProtocolSink_ReportResult (IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
 
static BindProtocolimpl_from_IServiceProvider (IServiceProvider *iface)
 
static HRESULT WINAPI BPServiceProvider_QueryInterface (IServiceProvider *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI BPServiceProvider_AddRef (IServiceProvider *iface)
 
static ULONG WINAPI BPServiceProvider_Release (IServiceProvider *iface)
 
static HRESULT WINAPI BPServiceProvider_QueryService (IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
 
HRESULT create_binding_protocol (BindProtocol **protocol)
 

Variables

static ATOM notif_wnd_class
 
static const IInternetProtocolExVtbl BindProtocolVtbl
 
static const IInternetProtocolVtbl InternetProtocolHandlerVtbl
 
static const IInternetProtocolSinkVtbl InternetProtocolSinkHandlerVtbl
 
static const IInternetBindInfoVtbl InternetBindInfoVtbl
 
static const IInternetPriorityVtbl InternetPriorityVtbl
 
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
 
static const IServiceProviderVtbl ServiceProviderVtbl
 

Macro Definition Documentation

◆ BUFFER_SIZE

#define BUFFER_SIZE   2048

Definition at line 31 of file bindprot.c.

◆ MIME_TEST_SIZE

#define MIME_TEST_SIZE   255

Definition at line 32 of file bindprot.c.

◆ WM_MK_CONTINUE

#define WM_MK_CONTINUE   (WM_USER+101)

Definition at line 34 of file bindprot.c.

◆ WM_MK_RELEASE

#define WM_MK_RELEASE   (WM_USER+102)

Definition at line 35 of file bindprot.c.

Typedef Documentation

◆ task_proc_t

typedef void(* task_proc_t) (BindProtocol *, task_header_t *)

Definition at line 24 of file bindprot.c.

Function Documentation

◆ BindInfo_AddRef()

static ULONG WINAPI BindInfo_AddRef ( IInternetBindInfo iface)
static

Definition at line 1080 of file bindprot.c.

1081{
1083 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1084}
static BindProtocol * impl_from_IInternetBindInfo(IInternetBindInfo *iface)
Definition: bindprot.c:1068

◆ BindInfo_GetBindInfo()

static HRESULT WINAPI BindInfo_GetBindInfo ( IInternetBindInfo iface,
DWORD grfBINDF,
BINDINFO *  pbindinfo 
)
static

Definition at line 1092 of file bindprot.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static IServiceProvider service_provider
Definition: mimeole.c:1286
HRESULT hres
Definition: protocol.c:465
#define TRACE(s)
Definition: solgame.cpp:4

◆ BindInfo_GetBindString()

static HRESULT WINAPI BindInfo_GetBindString ( IInternetBindInfo iface,
ULONG  ulStringType,
LPOLESTR *  ppwzStr,
ULONG  cEl,
ULONG pcElFetched 
)
static

Definition at line 1121 of file bindprot.c.

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}

◆ BindInfo_QueryInterface()

static HRESULT WINAPI BindInfo_QueryInterface ( IInternetBindInfo iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1073 of file bindprot.c.

1075{
1077 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1078}
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ BindInfo_Release()

static ULONG WINAPI BindInfo_Release ( IInternetBindInfo iface)
static

Definition at line 1086 of file bindprot.c.

1087{
1089 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1090}

◆ BindProtocol_Abort()

static HRESULT WINAPI BindProtocol_Abort ( IInternetProtocolEx iface,
HRESULT  hrReason,
DWORD  dwOptions 
)
static

Definition at line 391 of file bindprot.c.

393{
395
396 TRACE("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
397
398 return IInternetProtocol_Abort(This->protocol_handler, hrReason, dwOptions);
399}
static BindProtocol * impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
Definition: bindprot.c:246
DWORD dwOptions
Definition: solitaire.cpp:25

◆ BindProtocol_AddRef()

static ULONG WINAPI BindProtocol_AddRef ( IInternetProtocolEx iface)
static

Definition at line 298 of file bindprot.c.

299{
302 TRACE("(%p) ref=%ld\n", This, ref);
303 return ref;
304}
#define InterlockedIncrement
Definition: armddk.h:53
long LONG
Definition: pedump.c:60
Definition: send.c:48

◆ BindProtocol_Continue()

static HRESULT WINAPI BindProtocol_Continue ( IInternetProtocolEx iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 382 of file bindprot.c.

383{
385
386 TRACE("(%p)->(%p)\n", This, pProtocolData);
387
388 return IInternetProtocol_Continue(This->protocol_handler, pProtocolData);
389}

◆ BindProtocol_LockRequest()

static HRESULT WINAPI BindProtocol_LockRequest ( IInternetProtocolEx iface,
DWORD  dwOptions 
)
static

Definition at line 444 of file bindprot.c.

445{
447
448 TRACE("(%p)->(%08lx)\n", This, dwOptions);
449
450 return IInternetProtocol_LockRequest(This->protocol_handler, dwOptions);
451}

◆ BindProtocol_QueryInterface()

static HRESULT WINAPI BindProtocol_QueryInterface ( IInternetProtocolEx iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 251 of file bindprot.c.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53
const GUID IID_IUnknown
#define NULL
Definition: types.h:112
#define S_OK
Definition: intsafe.h:52
#define debugstr_guid
Definition: kernel32.h:35
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ BindProtocol_Read()

static HRESULT WINAPI BindProtocol_Read ( IInternetProtocolEx iface,
void pv,
ULONG  cb,
ULONG pcbRead 
)
static

Definition at line 424 of file bindprot.c.

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}
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118

◆ BindProtocol_Release()

static ULONG WINAPI BindProtocol_Release ( IInternetProtocolEx iface)
static

Definition at line 327 of file bindprot.c.

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}
#define InterlockedDecrement
Definition: armddk.h:52
static void release_protocol_handler(BindProtocol *This)
Definition: bindprot.c:306
void set_binding_sink(BindProtocol *This, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
Definition: bindprot.c:560
void release_notif_hwnd(HWND hwnd)
Definition: bindprot.c:137
#define free
Definition: debug_ros.c:5
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:65
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

◆ BindProtocol_Resume()

static HRESULT WINAPI BindProtocol_Resume ( IInternetProtocolEx iface)
static

Definition at line 417 of file bindprot.c.

418{
420 FIXME("(%p)\n", This);
421 return E_NOTIMPL;
422}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ BindProtocol_Seek()

static HRESULT WINAPI BindProtocol_Seek ( IInternetProtocolEx iface,
LARGE_INTEGER  dlibMove,
DWORD  dwOrigin,
ULARGE_INTEGER plibNewPosition 
)
static

Definition at line 436 of file bindprot.c.

438{
440 FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
441 return E_NOTIMPL;
442}
struct _LARGE_INTEGER::@2527 u

◆ BindProtocol_Start()

static HRESULT WINAPI BindProtocol_Start ( IInternetProtocolEx iface,
LPCWSTR  szUrl,
IInternetProtocolSink pOIProtSink,
IInternetBindInfo pOIBindInfo,
DWORD  grfPI,
HANDLE_PTR  dwReserved 
)
static

Definition at line 360 of file bindprot.c.

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}
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5382
#define debugstr_w
Definition: kernel32.h:32
const WCHAR * uri
Definition: sec_mgr.c:1564
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95

◆ BindProtocol_StartEx()

static HRESULT WINAPI BindProtocol_StartEx ( IInternetProtocolEx iface,
IUri pUri,
IInternetProtocolSink pOIProtSink,
IInternetBindInfo pOIBindInfo,
DWORD  grfPI,
HANDLE dwReserved 
)
static

Definition at line 462 of file bindprot.c.

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}
static void process_tasks(BindProtocol *This)
Definition: bindprot.c:37
#define E_INVALIDARG
Definition: ddrawi.h:101
HRESULT WINAPI StringFromCLSID(REFCLSID clsid, LPOLESTR *str)
Definition: combase.c:1515
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, IClassFactory **ret)
Definition: session.c:212
static int priority
Definition: timer.c:163
const CLSID * clsid
Definition: msctf.cpp:50
#define IID_NULL
Definition: guiddef.h:98
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771

◆ BindProtocol_Suspend()

static HRESULT WINAPI BindProtocol_Suspend ( IInternetProtocolEx iface)
static

Definition at line 410 of file bindprot.c.

411{
413 FIXME("(%p)\n", This);
414 return E_NOTIMPL;
415}

◆ BindProtocol_Terminate()

static HRESULT WINAPI BindProtocol_Terminate ( IInternetProtocolEx iface,
DWORD  dwOptions 
)
static

Definition at line 401 of file bindprot.c.

402{
404
405 TRACE("(%p)->(%08lx)\n", This, dwOptions);
406
407 return IInternetProtocol_Terminate(This->protocol_handler, dwOptions);
408}

◆ BindProtocol_UnlockRequest()

static HRESULT WINAPI BindProtocol_UnlockRequest ( IInternetProtocolEx iface)
static

Definition at line 453 of file bindprot.c.

454{
456
457 TRACE("(%p)\n", This);
458
459 return IInternetProtocol_UnlockRequest(This->protocol_handler);
460}

◆ BPInternetProtocolSink_AddRef()

static ULONG WINAPI BPInternetProtocolSink_AddRef ( IInternetProtocolSink iface)
static

Definition at line 1204 of file bindprot.c.

1205{
1207 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1208}
static BindProtocol * impl_from_IInternetProtocolSink(IInternetProtocolSink *iface)
Definition: bindprot.c:1192

◆ BPInternetProtocolSink_QueryInterface()

static HRESULT WINAPI BPInternetProtocolSink_QueryInterface ( IInternetProtocolSink iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1197 of file bindprot.c.

1199{
1201 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1202}

◆ BPInternetProtocolSink_Release()

static ULONG WINAPI BPInternetProtocolSink_Release ( IInternetProtocolSink iface)
static

Definition at line 1210 of file bindprot.c.

1211{
1213 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1214}

◆ BPInternetProtocolSink_ReportData()

static HRESULT WINAPI BPInternetProtocolSink_ReportData ( IInternetProtocolSink iface,
DWORD  grfBSCF,
ULONG  ulProgress,
ULONG  ulProgressMax 
)
static

Definition at line 1323 of file bindprot.c.

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}
static void push_task(BindProtocol *This, task_header_t *task, task_proc_t proc)
Definition: bindprot.c:155
static void report_data_proc(BindProtocol *This, task_header_t *t)
Definition: bindprot.c:1313
static BOOL do_direct_notif(BindProtocol *This)
Definition: bindprot.c:185
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define malloc
Definition: debug_ros.c:4
DWORD task
Definition: delayimp.cpp:484

◆ BPInternetProtocolSink_ReportProgress()

static HRESULT WINAPI BPInternetProtocolSink_ReportProgress ( IInternetProtocolSink iface,
ULONG  ulStatusCode,
LPCWSTR  szStatusText 
)
static

Definition at line 1283 of file bindprot.c.

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}
static void on_progress_proc(BindProtocol *This, task_header_t *t)
Definition: bindprot.c:1273
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94

◆ BPInternetProtocolSink_ReportResult()

static HRESULT WINAPI BPInternetProtocolSink_ReportResult ( IInternetProtocolSink iface,
HRESULT  hrResult,
DWORD  dwError,
LPCWSTR  szResult 
)
static

Definition at line 1370 of file bindprot.c.

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}
static void report_result_proc(BindProtocol *This, task_header_t *t)
Definition: bindprot.c:1360
#define E_FAIL
Definition: ddrawi.h:102
#define TRUE
Definition: types.h:120

◆ BPInternetProtocolSink_Switch()

static HRESULT WINAPI BPInternetProtocolSink_Switch ( IInternetProtocolSink iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 1230 of file bindprot.c.

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}
static void switch_proc(BindProtocol *bind, task_header_t *t)
Definition: bindprot.c:1221
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

◆ BPServiceProvider_AddRef()

static ULONG WINAPI BPServiceProvider_AddRef ( IServiceProvider iface)
static

Definition at line 1421 of file bindprot.c.

1422{
1424 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1425}
static BindProtocol * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: bindprot.c:1409

◆ BPServiceProvider_QueryInterface()

static HRESULT WINAPI BPServiceProvider_QueryInterface ( IServiceProvider iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1414 of file bindprot.c.

1416{
1418 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1419}

◆ BPServiceProvider_QueryService()

static HRESULT WINAPI BPServiceProvider_QueryService ( IServiceProvider iface,
REFGUID  guidService,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1433 of file bindprot.c.

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}

◆ BPServiceProvider_Release()

static ULONG WINAPI BPServiceProvider_Release ( IServiceProvider iface)
static

Definition at line 1427 of file bindprot.c.

1428{
1430 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1431}

◆ create_binding_protocol()

HRESULT create_binding_protocol ( BindProtocol **  protocol)

Definition at line 1453 of file bindprot.c.

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}
static const IInternetProtocolVtbl InternetProtocolHandlerVtbl
Definition: bindprot.c:823
static const IInternetBindInfoVtbl InternetBindInfoVtbl
Definition: bindprot.c:1131
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
Definition: bindprot.c:1399
static const IInternetProtocolExVtbl BindProtocolVtbl
Definition: bindprot.c:584
HWND get_notif_hwnd(void)
Definition: bindprot.c:107
static const IInternetPriorityVtbl InternetPriorityVtbl
Definition: bindprot.c:1183
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: bindprot.c:1446
static const IInternetProtocolSinkVtbl InternetProtocolSinkHandlerVtbl
Definition: bindprot.c:1058
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
return ret
Definition: mutex.c:146
#define calloc
Definition: rosglue.h:14
#define DWORD_PTR
Definition: treelist.c:76
static void URLMON_LockModule(void)
Definition: urlmon_main.h:64
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156

Referenced by Binding_Create(), and InternetSession_CreateBinding().

◆ do_direct_notif()

static BOOL do_direct_notif ( BindProtocol This)
inlinestatic

Definition at line 185 of file bindprot.c.

186{
187 return !(This->pi & PI_APARTMENTTHREADED) || (is_apartment_thread(This) && !This->continue_call);
188}
static BOOL is_apartment_thread(BindProtocol *This)
Definition: bindprot.c:180

Referenced by BPInternetProtocolSink_ReportData(), BPInternetProtocolSink_ReportProgress(), BPInternetProtocolSink_ReportResult(), and BPInternetProtocolSink_Switch().

◆ get_notif_hwnd()

HWND get_notif_hwnd ( void  )

Definition at line 107 of file bindprot.c.

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}
static BOOL WINAPI register_notif_wnd_class(INIT_ONCE *once, void *param, void **context)
Definition: bindprot.c:88
static ATOM notif_wnd_class
Definition: bindprot.c:86
HINSTANCE hProxyDll
Definition: combase.c:40
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
#define L(x)
Definition: resources.c:13
HWND notif_hwnd
Definition: urlmon_main.h:222
DWORD notif_hwnd_cnt
Definition: urlmon_main.h:223
tls_data_t * get_tls_data(void)
Definition: urlmon_main.c:60
RTL_RUN_ONCE INIT_ONCE
Definition: winbase.h:3652
#define INIT_ONCE_STATIC_INIT
Definition: winbase.h:591
#define HWND_MESSAGE
Definition: winuser.h:1221
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)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

Referenced by Binding_Create(), and create_binding_protocol().

◆ handle_mime_filter()

static HRESULT handle_mime_filter ( BindProtocol This,
IInternetProtocol mime_filter 
)
static

Definition at line 190 of file bindprot.c.

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}
unsigned long HANDLE_PTR
Definition: basetsd.h:72
IInternetProtocol * pProtocol
Definition: urlmon.idl:1747
struct _tagPROTOCOLFILTERDATA PROTOCOLFILTERDATA

Referenced by mime_available().

◆ handle_redirect()

static HRESULT handle_redirect ( BindProtocol This,
const WCHAR url 
)
static

Definition at line 1016 of file bindprot.c.

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}
short VARIANT_BOOL
Definition: compat.h:2290
static const WCHAR url[]
Definition: encode.c:1384
#define INET_E_REDIRECT_FAILED
Definition: winerror.h:4667

Referenced by ProtocolSinkHandler_ReportResult().

◆ impl_from_IInternetBindInfo()

static BindProtocol * impl_from_IInternetBindInfo ( IInternetBindInfo iface)
inlinestatic

Definition at line 1068 of file bindprot.c.

1069{
1070 return CONTAINING_RECORD(iface, BindProtocol, IInternetBindInfo_iface);
1071}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by BindInfo_AddRef(), BindInfo_GetBindInfo(), BindInfo_GetBindString(), BindInfo_QueryInterface(), and BindInfo_Release().

◆ impl_from_IInternetPriority()

static BindProtocol * impl_from_IInternetPriority ( IInternetPriority iface)
inlinestatic

◆ impl_from_IInternetProtocol()

◆ impl_from_IInternetProtocolEx()

◆ impl_from_IInternetProtocolSink()

◆ impl_from_IInternetProtocolSinkHandler()

static BindProtocol * impl_from_IInternetProtocolSinkHandler ( IInternetProtocolSink iface)
inlinestatic

◆ impl_from_IServiceProvider()

static BindProtocol * impl_from_IServiceProvider ( IServiceProvider iface)
inlinestatic

Definition at line 1409 of file bindprot.c.

1410{
1411 return CONTAINING_RECORD(iface, BindProtocol, IServiceProvider_iface);
1412}

Referenced by BPServiceProvider_AddRef(), BPServiceProvider_QueryInterface(), BPServiceProvider_QueryService(), and BPServiceProvider_Release().

◆ InternetPriority_AddRef()

static ULONG WINAPI InternetPriority_AddRef ( IInternetPriority iface)
static

Definition at line 1151 of file bindprot.c.

1152{
1154 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
1155}
static BindProtocol * impl_from_IInternetPriority(IInternetPriority *iface)
Definition: bindprot.c:1139

◆ InternetPriority_GetPriority()

static HRESULT WINAPI InternetPriority_GetPriority ( IInternetPriority iface,
LONG pnPriority 
)
static

Definition at line 1173 of file bindprot.c.

1174{
1176
1177 TRACE("(%p)->(%p)\n", This, pnPriority);
1178
1179 *pnPriority = This->priority;
1180 return S_OK;
1181}

◆ InternetPriority_QueryInterface()

static HRESULT WINAPI InternetPriority_QueryInterface ( IInternetPriority iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1144 of file bindprot.c.

1146{
1148 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
1149}

◆ InternetPriority_Release()

static ULONG WINAPI InternetPriority_Release ( IInternetPriority iface)
static

Definition at line 1157 of file bindprot.c.

1158{
1160 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
1161}

◆ InternetPriority_SetPriority()

static HRESULT WINAPI InternetPriority_SetPriority ( IInternetPriority iface,
LONG  nPriority 
)
static

Definition at line 1163 of file bindprot.c.

1164{
1166
1167 TRACE("(%p)->(%ld)\n", This, nPriority);
1168
1169 This->priority = nPriority;
1170 return S_OK;
1171}

◆ is_apartment_thread()

static BOOL is_apartment_thread ( BindProtocol This)
inlinestatic

Definition at line 180 of file bindprot.c.

181{
182 return This->apartment_thread == GetCurrentThreadId();
183}

Referenced by do_direct_notif(), ProtocolHandler_Read(), and ProtocolSinkHandler_ReportData().

◆ mime_available()

static void mime_available ( BindProtocol This,
LPCWSTR  mime,
BOOL  verified 
)
static

Definition at line 222 of file bindprot.c.

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}
static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter)
Definition: bindprot.c:190
IInternetProtocol * get_mime_filter(LPCWSTR mime)
Definition: session.c:242
const WCHAR * mime
Definition: mimefilter.c:487

Referenced by ProtocolSinkHandler_ReportProgress().

◆ notif_wnd_proc()

static LRESULT WINAPI notif_wnd_proc ( HWND  hwnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 62 of file bindprot.c.

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}
#define msg(x)
Definition: auth_time.c:54
#define WM_MK_CONTINUE
Definition: bindprot.c:34
#define WM_MK_RELEASE
Definition: bindprot.c:35
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DestroyWindow(_In_ HWND)

Referenced by register_notif_wnd_class().

◆ on_progress_proc()

static void on_progress_proc ( BindProtocol This,
task_header_t t 
)
static

Definition at line 1273 of file bindprot.c.

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}
GLdouble GLdouble t
Definition: gl.h:2047

Referenced by BPInternetProtocolSink_ReportProgress().

◆ process_tasks()

static void process_tasks ( BindProtocol This)
static

Definition at line 37 of file bindprot.c.

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}
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

Referenced by BindProtocol_StartEx(), notif_wnd_proc(), and ProtocolSinkHandler_ReportData().

◆ ProtocolHandler_Abort()

static HRESULT WINAPI ProtocolHandler_Abort ( IInternetProtocol iface,
HRESULT  hrReason,
DWORD  dwOptions 
)
static

Definition at line 679 of file bindprot.c.

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}
static BindProtocol * impl_from_IInternetProtocol(IInternetProtocol *iface)
Definition: bindprot.c:601

◆ ProtocolHandler_AddRef()

static ULONG WINAPI ProtocolHandler_AddRef ( IInternetProtocol iface)
static

Definition at line 634 of file bindprot.c.

635{
637 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
638}

◆ ProtocolHandler_Continue()

static HRESULT WINAPI ProtocolHandler_Continue ( IInternetProtocol iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 654 of file bindprot.c.

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}

◆ ProtocolHandler_LockRequest()

static HRESULT WINAPI ProtocolHandler_LockRequest ( IInternetProtocol iface,
DWORD  dwOptions 
)
static

Definition at line 803 of file bindprot.c.

804{
806
807 TRACE("(%p)->(%08lx)\n", This, dwOptions);
808
809 return IInternetProtocol_LockRequest(This->protocol, dwOptions);
810}

◆ ProtocolHandler_QueryInterface()

static HRESULT WINAPI ProtocolHandler_QueryInterface ( IInternetProtocol iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 606 of file bindprot.c.

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}

◆ ProtocolHandler_Read()

static HRESULT WINAPI ProtocolHandler_Read ( IInternetProtocol iface,
void pv,
ULONG  cb,
ULONG pcbRead 
)
static

Definition at line 743 of file bindprot.c.

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}
#define read
Definition: acwin.h:97
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define min(a, b)
Definition: monoChain.cc:55
uint32_t ULONG
Definition: typedefs.h:59
#define E_ABORT
Definition: winerror.h:3481
unsigned char BYTE
Definition: xxhash.c:193

◆ ProtocolHandler_Release()

static ULONG WINAPI ProtocolHandler_Release ( IInternetProtocol iface)
static

Definition at line 640 of file bindprot.c.

641{
643 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
644}

◆ ProtocolHandler_Resume()

static HRESULT WINAPI ProtocolHandler_Resume ( IInternetProtocol iface)
static

Definition at line 736 of file bindprot.c.

737{
739 FIXME("(%p)\n", This);
740 return E_NOTIMPL;
741}

◆ ProtocolHandler_Seek()

static HRESULT WINAPI ProtocolHandler_Seek ( IInternetProtocol iface,
LARGE_INTEGER  dlibMove,
DWORD  dwOrigin,
ULARGE_INTEGER plibNewPosition 
)
static

Definition at line 795 of file bindprot.c.

797{
799 FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
800 return E_NOTIMPL;
801}

◆ ProtocolHandler_Start()

static HRESULT WINAPI ProtocolHandler_Start ( IInternetProtocol iface,
LPCWSTR  szUrl,
IInternetProtocolSink pOIProtSink,
IInternetBindInfo pOIBindInfo,
DWORD  grfPI,
HANDLE_PTR  dwReserved 
)
static

Definition at line 646 of file bindprot.c.

649{
650 ERR("Should not be called\n");
651 return E_NOTIMPL;
652}
#define ERR(fmt,...)
Definition: precomp.h:57

◆ ProtocolHandler_Suspend()

static HRESULT WINAPI ProtocolHandler_Suspend ( IInternetProtocol iface)
static

Definition at line 729 of file bindprot.c.

730{
732 FIXME("(%p)\n", This);
733 return E_NOTIMPL;
734}

◆ ProtocolHandler_Terminate()

static HRESULT WINAPI ProtocolHandler_Terminate ( IInternetProtocol iface,
DWORD  dwOptions 
)
static

Definition at line 692 of file bindprot.c.

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}

◆ ProtocolHandler_UnlockRequest()

static HRESULT WINAPI ProtocolHandler_UnlockRequest ( IInternetProtocol iface)
static

Definition at line 812 of file bindprot.c.

813{
815
816 TRACE("(%p)\n", This);
817
818 if (This->protocol)
819 return IInternetProtocol_UnlockRequest(This->protocol);
820 return S_OK;
821}

◆ ProtocolSinkHandler_AddRef()

static ULONG WINAPI ProtocolSinkHandler_AddRef ( IInternetProtocolSink iface)
static

Definition at line 852 of file bindprot.c.

853{
855 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
856}
static BindProtocol * impl_from_IInternetProtocolSinkHandler(IInternetProtocolSink *iface)
Definition: bindprot.c:839

◆ ProtocolSinkHandler_QueryInterface()

static HRESULT WINAPI ProtocolSinkHandler_QueryInterface ( IInternetProtocolSink iface,
REFIID  riid,
void **  ppvObject 
)
static

Definition at line 844 of file bindprot.c.

846{
848 return IInternetProtocol_QueryInterface(&This->default_protocol_handler.IInternetProtocol_iface,
849 riid, ppvObject);
850}

◆ ProtocolSinkHandler_Release()

static ULONG WINAPI ProtocolSinkHandler_Release ( IInternetProtocolSink iface)
static

Definition at line 858 of file bindprot.c.

859{
861 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
862}

◆ ProtocolSinkHandler_ReportData()

static HRESULT WINAPI ProtocolSinkHandler_ReportData ( IInternetProtocolSink iface,
DWORD  bscf,
ULONG  progress,
ULONG  progress_max 
)
static

Definition at line 989 of file bindprot.c.

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}
static HRESULT report_data(BindProtocol *This)
Definition: bindprot.c:920
cd_progress_ptr progress
Definition: cdjpeg.h:152

◆ ProtocolSinkHandler_ReportProgress()

static HRESULT WINAPI ProtocolSinkHandler_ReportProgress ( IInternetProtocolSink iface,
ULONG  status_code,
LPCWSTR  status_text 
)
static

Definition at line 879 of file bindprot.c.

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}
static void mime_available(BindProtocol *This, LPCWSTR mime, BOOL verified)
Definition: bindprot.c:222
#define FALSE
Definition: types.h:117
const char * debugstr_bindstatus(ULONG status)
Definition: urlmon_main.c:173

◆ ProtocolSinkHandler_ReportResult()

static HRESULT WINAPI ProtocolSinkHandler_ReportResult ( IInternetProtocolSink iface,
HRESULT  hrResult,
DWORD  dwError,
LPCWSTR  szResult 
)
static

Definition at line 1039 of file bindprot.c.

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}
static HRESULT handle_redirect(BindProtocol *This, const WCHAR *url)
Definition: bindprot.c:1016

◆ ProtocolSinkHandler_Switch()

static HRESULT WINAPI ProtocolSinkHandler_Switch ( IInternetProtocolSink iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 864 of file bindprot.c.

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}

◆ push_task()

static void push_task ( BindProtocol This,
task_header_t task,
task_proc_t  proc 
)
static

Definition at line 155 of file bindprot.c.

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}
unsigned int BOOL
Definition: ntddk_ex.h:94
LONG_PTR LPARAM
Definition: minwindef.h:175
static HANDLE proc()
Definition: pdb.c:32
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by BPInternetProtocolSink_ReportData(), BPInternetProtocolSink_ReportProgress(), BPInternetProtocolSink_ReportResult(), and BPInternetProtocolSink_Switch().

◆ register_notif_wnd_class()

static BOOL WINAPI register_notif_wnd_class ( INIT_ONCE once,
void param,
void **  context 
)
static

Definition at line 88 of file bindprot.c.

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}
static LRESULT WINAPI notif_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: bindprot.c:62
HINSTANCE hInstance
Definition: winuser.h:3329
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)

Referenced by get_notif_hwnd().

◆ release_notif_hwnd()

void release_notif_hwnd ( HWND  hwnd)

Definition at line 137 of file bindprot.c.

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}

Referenced by Binding_Release(), and BindProtocol_Release().

◆ release_protocol_handler()

static void release_protocol_handler ( BindProtocol This)
static

Definition at line 306 of file bindprot.c.

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}

Referenced by BindProtocol_Release(), and handle_redirect().

◆ report_data()

static HRESULT report_data ( BindProtocol This)
static

Definition at line 920 of file bindprot.c.

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}
#define MIME_TEST_SIZE
Definition: bindprot.c:32
#define BUFFER_SIZE
Definition: bindprot.c:31
#define realloc
Definition: debug_ros.c:6
#define E_PENDING
Definition: dinput.h:172
OLECHAR * BSTR
Definition: compat.h:2293
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
HRESULT WINAPI FindMimeFromData(LPBC pBC, LPCWSTR pwzUrl, LPVOID pBuffer, DWORD cbSize, LPCWSTR pwzMimeProposed, DWORD dwMimeFlags, LPWSTR *ppwzMimeOut, DWORD dwReserved)
Definition: mimefilter.c:655
uint16_t * LPWSTR
Definition: typedefs.h:56
#define S_FALSE
Definition: winerror.h:3451

Referenced by ProtocolSinkHandler_ReportData().

◆ report_data_proc()

static void report_data_proc ( BindProtocol This,
task_header_t t 
)
static

Definition at line 1313 of file bindprot.c.

1314{
1316
1317 IInternetProtocolSink_ReportData(This->protocol_sink_handler,
1318 task->bscf, task->progress, task->progress_max);
1319
1320 free(task);
1321}

Referenced by BPInternetProtocolSink_ReportData().

◆ report_result_proc()

static void report_result_proc ( BindProtocol This,
task_header_t t 
)
static

Definition at line 1360 of file bindprot.c.

1361{
1363
1364 IInternetProtocolSink_ReportResult(This->protocol_sink_handler, task->hres, task->err, task->str);
1365
1366 free(task->str);
1367 free(task);
1368}

Referenced by BPInternetProtocolSink_ReportResult().

◆ set_binding_sink()

void set_binding_sink ( BindProtocol This,
IInternetProtocolSink sink,
IInternetBindInfo bind_info 
)

Definition at line 560 of file bindprot.c.

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}
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
static IInternetBindInfo bind_info
Definition: mimeole.c:1246

Referenced by BindProtocol_Release(), BindProtocol_StartEx(), ProtocolHandler_Terminate(), and start_binding().

◆ switch_proc()

static void switch_proc ( BindProtocol bind,
task_header_t t 
)
static

Definition at line 1221 of file bindprot.c.

1222{
1224
1225 IInternetProtocol_Continue(bind->protocol_handler, task->data);
1226
1227 free(task);
1228}
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36

Referenced by BPInternetProtocolSink_Switch().

◆ unregister_notif_wnd_class()

void unregister_notif_wnd_class ( void  )

Definition at line 101 of file bindprot.c.

102{
105}
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)

Referenced by process_detach().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( urlmon  )

Variable Documentation

◆ BindProtocolVtbl

const IInternetProtocolExVtbl BindProtocolVtbl
static
Initial value:
= {
}
static HRESULT WINAPI BindProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: bindprot.c:444
static HRESULT WINAPI BindProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: bindprot.c:360
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 BindProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: bindprot.c:401
static HRESULT WINAPI BindProtocol_Resume(IInternetProtocolEx *iface)
Definition: bindprot.c:417
static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
Definition: bindprot.c:462
static HRESULT WINAPI BindProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
Definition: bindprot.c:391
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 BindProtocol_UnlockRequest(IInternetProtocolEx *iface)
Definition: bindprot.c:453
static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface)
Definition: bindprot.c:327
static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
Definition: bindprot.c:251
static ULONG WINAPI BindProtocol_AddRef(IInternetProtocolEx *iface)
Definition: bindprot.c:298

Definition at line 584 of file bindprot.c.

Referenced by create_binding_protocol().

◆ InternetBindInfoVtbl

const IInternetBindInfoVtbl InternetBindInfoVtbl
static
Initial value:
= {
}
static ULONG WINAPI BindInfo_Release(IInternetBindInfo *iface)
Definition: bindprot.c:1086
static HRESULT WINAPI BindInfo_QueryInterface(IInternetBindInfo *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1073
static HRESULT WINAPI BindInfo_GetBindInfo(IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: bindprot.c:1092
static HRESULT WINAPI BindInfo_GetBindString(IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
Definition: bindprot.c:1121
static ULONG WINAPI BindInfo_AddRef(IInternetBindInfo *iface)
Definition: bindprot.c:1080

Definition at line 1131 of file bindprot.c.

Referenced by create_binding_protocol().

◆ InternetPriorityVtbl

const IInternetPriorityVtbl InternetPriorityVtbl
static
Initial value:
= {
}
static HRESULT WINAPI InternetPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1144
static HRESULT WINAPI InternetPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
Definition: bindprot.c:1163
static HRESULT WINAPI InternetPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
Definition: bindprot.c:1173
static ULONG WINAPI InternetPriority_Release(IInternetPriority *iface)
Definition: bindprot.c:1157
static ULONG WINAPI InternetPriority_AddRef(IInternetPriority *iface)
Definition: bindprot.c:1151

Definition at line 1183 of file bindprot.c.

Referenced by create_binding_protocol().

◆ InternetProtocolHandlerVtbl

const IInternetProtocolVtbl InternetProtocolHandlerVtbl
static
Initial value:
= {
}
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 ProtocolHandler_UnlockRequest(IInternetProtocol *iface)
Definition: bindprot.c:812
static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: bindprot.c:646
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 ProtocolHandler_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
Definition: bindprot.c:606
static HRESULT WINAPI ProtocolHandler_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: bindprot.c:795
static HRESULT WINAPI ProtocolHandler_Suspend(IInternetProtocol *iface)
Definition: bindprot.c:729
static HRESULT WINAPI ProtocolHandler_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
Definition: bindprot.c:654
static HRESULT WINAPI ProtocolHandler_Resume(IInternetProtocol *iface)
Definition: bindprot.c:736
static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: bindprot.c:743

Definition at line 823 of file bindprot.c.

Referenced by create_binding_protocol().

◆ InternetProtocolSinkHandlerVtbl

const IInternetProtocolSinkVtbl InternetProtocolSinkHandlerVtbl
static
Initial value:
= {
}
static ULONG WINAPI ProtocolSinkHandler_AddRef(IInternetProtocolSink *iface)
Definition: bindprot.c:852
static HRESULT WINAPI ProtocolSinkHandler_ReportData(IInternetProtocolSink *iface, DWORD bscf, ULONG progress, ULONG progress_max)
Definition: bindprot.c:989
static HRESULT WINAPI ProtocolSinkHandler_ReportProgress(IInternetProtocolSink *iface, ULONG status_code, LPCWSTR status_text)
Definition: bindprot.c:879
static HRESULT WINAPI ProtocolSinkHandler_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: bindprot.c:864
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
static HRESULT WINAPI ProtocolSinkHandler_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
Definition: bindprot.c:1039

Definition at line 1058 of file bindprot.c.

Referenced by create_binding_protocol().

◆ InternetProtocolSinkVtbl

const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
static
Initial value:
= {
}
static HRESULT WINAPI BPInternetProtocolSink_QueryInterface(IInternetProtocolSink *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1197
static HRESULT WINAPI BPInternetProtocolSink_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
Definition: bindprot.c:1370
static HRESULT WINAPI BPInternetProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: bindprot.c:1230
static ULONG WINAPI BPInternetProtocolSink_Release(IInternetProtocolSink *iface)
Definition: bindprot.c:1210
static HRESULT WINAPI BPInternetProtocolSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: bindprot.c:1283
static ULONG WINAPI BPInternetProtocolSink_AddRef(IInternetProtocolSink *iface)
Definition: bindprot.c:1204
static HRESULT WINAPI BPInternetProtocolSink_ReportData(IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
Definition: bindprot.c:1323

Definition at line 1399 of file bindprot.c.

Referenced by create_binding_protocol().

◆ notif_wnd_class

ATOM notif_wnd_class
static

Definition at line 86 of file bindprot.c.

Referenced by get_notif_hwnd(), register_notif_wnd_class(), and unregister_notif_wnd_class().

◆ ServiceProviderVtbl

const IServiceProviderVtbl ServiceProviderVtbl
static
Initial value:
= {
}
static HRESULT WINAPI BPServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: bindprot.c:1433
static ULONG WINAPI BPServiceProvider_AddRef(IServiceProvider *iface)
Definition: bindprot.c:1421
static HRESULT WINAPI BPServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: bindprot.c:1414
static ULONG WINAPI BPServiceProvider_Release(IServiceProvider *iface)
Definition: bindprot.c:1427

Definition at line 1446 of file bindprot.c.

Referenced by create_binding_protocol().