static HRESULT WINAPI MkProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv) { MkProtocol *This = impl_from_IInternetProtocolEx(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IInternetProtocolEx_iface; }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); *ppv = &This->IInternetProtocolEx_iface; }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); *ppv = &This->IInternetProtocolEx_iface; }else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) { TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv); *ppv = &This->IInternetProtocolEx_iface; } if(*ppv) { IInternetProtocolEx_AddRef(iface); return S_OK; } WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static void push_task(BindProtocol *This, task_header_t *task, task_proc_t proc) { BOOL do_post = FALSE; task->proc = proc; task->next = NULL; EnterCriticalSection(&This->section); if(This->task_queue_tail) { This->task_queue_tail->next = task; This->task_queue_tail = task; }else { This->task_queue_tail = This->task_queue_head = task; do_post = !This->continue_call; } LeaveCriticalSection(&This->section); if(do_post) { IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)This); } }
static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD dwOptions) { BindProtocol *This = impl_from_IInternetProtocol(iface); TRACE("(%p)->(%08x)\n", This, dwOptions); if(!This->reported_result) return E_FAIL; /* This may get released in Terminate call. */ IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); IInternetProtocol_Terminate(This->protocol, 0); set_binding_sink(This, NULL, NULL); if(This->bind_info) { IInternetBindInfo_Release(This->bind_info); This->bind_info = NULL; } IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface); return S_OK; }
static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface) { FtpProtocol *This = impl_from_IWinInetHttpInfo(iface); return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); }
static ULONG WINAPI FtpPriority_AddRef(IInternetPriority *iface) { FtpProtocol *This = impl_from_IInternetPriority(iface); return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); }
static ULONG WINAPI BindInfo_AddRef(IInternetBindInfo *iface) { BindProtocol *This = impl_from_IInternetBindInfo(iface); return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); }
static ULONG WINAPI ProtocolSinkHandler_AddRef(IInternetProtocolSink *iface) { BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); }
static ULONG WINAPI BPServiceProvider_AddRef(IServiceProvider *iface) { BindProtocol *This = impl_from_IServiceProvider(iface); return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); }
static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **binding) { Binding *ret; HRESULT hres; URLMON_LockModule(); ret = heap_alloc_zero(sizeof(Binding)); ret->IBinding_iface.lpVtbl = &BindingVtbl; ret->IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkVtbl; ret->IInternetBindInfo_iface.lpVtbl = &InternetBindInfoVtbl; ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl; ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl; ret->ref = 1; ret->to_object = to_obj; ret->iid = *riid; ret->notif_hwnd = get_notif_hwnd(); ret->report_mime = !binding_ctx; ret->download_state = BEFORE_DOWNLOAD; if(to_obj) { IBindCtx_AddRef(pbc); ret->bctx = pbc; } if(mon) { IMoniker_AddRef(mon); ret->mon = mon; } ret->bindinfo.cbSize = sizeof(BINDINFO); InitializeCriticalSection(&ret->section); ret->section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": Binding.section"); hres = get_callback(pbc, &ret->callback); if(FAILED(hres)) { WARN("Could not get IBindStatusCallback\n"); IBinding_Release(&ret->IBinding_iface); return hres; } IBindStatusCallback_QueryInterface(ret->callback, &IID_IServiceProvider, (void**)&ret->service_provider); if(binding_ctx) { ret->protocol = binding_ctx->protocol; IInternetProtocolEx_AddRef(&ret->protocol->IInternetProtocolEx_iface); }else { hres = create_binding_protocol(TRUE, &ret->protocol); if(FAILED(hres)) { WARN("Could not get protocol handler\n"); IBinding_Release(&ret->IBinding_iface); return hres; } } hres = IBindStatusCallback_GetBindInfo(ret->callback, &ret->bindf, &ret->bindinfo); if(FAILED(hres)) { WARN("GetBindInfo failed: %08x\n", hres); IBinding_Release(&ret->IBinding_iface); return hres; } TRACE("bindf %08x\n", ret->bindf); dump_BINDINFO(&ret->bindinfo); ret->bindf |= BINDF_FROMURLMON; if(to_obj) ret->bindinfo.dwOptions |= 0x100000; if(!(ret->bindf & BINDF_ASYNCHRONOUS) || !(ret->bindf & BINDF_PULLDATA)) { ret->bindf |= BINDF_NEEDFILE; ret->use_cache_file = TRUE; }else if(!is_urlmon_protocol(uri)) { ret->bindf |= BINDF_NEEDFILE; } hres = IUri_GetDisplayUri(uri, &ret->url); if(FAILED(hres)) { IBinding_Release(&ret->IBinding_iface); return hres; } if(binding_ctx) { ret->stgmed_buf = binding_ctx->stgmed_buf; IUnknown_AddRef(&ret->stgmed_buf->IUnknown_iface); ret->clipboard_format = binding_ctx->clipboard_format; }else { ret->stgmed_buf = create_stgmed_buf(&ret->protocol->IInternetProtocolEx_iface); } if(to_obj) { ret->stgmed_obj = NULL; }else if(IsEqualGUID(&IID_IStream, riid)) { ret->stgmed_obj = create_stgmed_stream(ret->stgmed_buf); }else if(IsEqualGUID(&IID_IUnknown, riid)) { ret->bindf |= BINDF_NEEDFILE; ret->stgmed_obj = create_stgmed_file(ret->stgmed_buf); }else { FIXME("Unsupported riid %s\n", debugstr_guid(riid)); IBinding_Release(&ret->IBinding_iface); return E_NOTIMPL; } *binding = ret; return S_OK; }