static void WINAPI internet_status_callback(HINTERNET internet, DWORD_PTR context, DWORD internet_status, LPVOID status_info, DWORD status_info_len) { Protocol *protocol = (Protocol*)context; switch(internet_status) { case INTERNET_STATUS_RESOLVING_NAME: TRACE("%p INTERNET_STATUS_RESOLVING_NAME\n", protocol); report_progress(protocol, BINDSTATUS_FINDINGRESOURCE, (LPWSTR)status_info); break; case INTERNET_STATUS_CONNECTING_TO_SERVER: TRACE("%p INTERNET_STATUS_CONNECTING_TO_SERVER\n", protocol); report_progress(protocol, BINDSTATUS_CONNECTING, (LPWSTR)status_info); break; case INTERNET_STATUS_SENDING_REQUEST: TRACE("%p INTERNET_STATUS_SENDING_REQUEST\n", protocol); report_progress(protocol, BINDSTATUS_SENDINGREQUEST, (LPWSTR)status_info); break; case INTERNET_STATUS_REDIRECT: TRACE("%p INTERNET_STATUS_REDIRECT\n", protocol); report_progress(protocol, BINDSTATUS_REDIRECTING, (LPWSTR)status_info); break; case INTERNET_STATUS_REQUEST_COMPLETE: request_complete(protocol, status_info); break; case INTERNET_STATUS_HANDLE_CREATED: TRACE("%p INTERNET_STATUS_HANDLE_CREATED\n", protocol); IInternetProtocol_AddRef(protocol->protocol); break; case INTERNET_STATUS_HANDLE_CLOSING: TRACE("%p INTERNET_STATUS_HANDLE_CLOSING\n", protocol); if(*(HINTERNET *)status_info == protocol->request) { protocol->request = NULL; if(protocol->protocol_sink) { IInternetProtocolSink_Release(protocol->protocol_sink); protocol->protocol_sink = NULL; } if(protocol->bind_info.cbSize) { ReleaseBindInfo(&protocol->bind_info); memset(&protocol->bind_info, 0, sizeof(protocol->bind_info)); } }else if(*(HINTERNET *)status_info == protocol->connection) { protocol->connection = NULL; } IInternetProtocol_Release(protocol->protocol); break; default: WARN("Unhandled Internet status callback %d\n", internet_status); } }
static HRESULT WINAPI MimeFilterProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { MimeFilter *This = impl_from_IInternetProtocol(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); *ppv = &This->IInternetProtocolSink_iface; } if(*ppv) { IInternetProtocol_AddRef(iface); return S_OK; } WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static HRESULT WINAPI ResProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { ResProtocol *This = ResProtocol_from_IInternetProtocol(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); if(This->pUnkOuter) return IUnknown_QueryInterface(This->pUnkOuter, &IID_IUnknown, ppv); *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", iface, ppv); *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", iface, ppv); *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { FIXME("IServiceProvider is not implemented\n"); return E_NOINTERFACE; } if(!*ppv) { TRACE("unknown interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } IInternetProtocol_AddRef(iface); return S_OK; }
static HRESULT WINAPI ProtocolProxy_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { ProtocolProxy *This = PROTOCOL_THIS(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); *ppv = PROTSINK(This); } if(*ppv) { IInternetProtocol_AddRef(iface); return S_OK; } WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter) { PROTOCOLFILTERDATA filter_data = { sizeof(PROTOCOLFILTERDATA), NULL, NULL, NULL, 0 }; HRESULT hres; hres = IInternetProtocol_QueryInterface(mime_filter, &IID_IInternetProtocolSink, (void**)&This->protocol_sink_handler); if(FAILED(hres)) { This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; return hres; } IInternetProtocol_AddRef(mime_filter); This->protocol_handler = mime_filter; filter_data.pProtocol = &This->default_protocol_handler.IInternetProtocol_iface; hres = IInternetProtocol_Start(mime_filter, This->mime, &This->default_protocol_handler.IInternetProtocolSink_iface, &This->IInternetBindInfo_iface, PI_FILTER_MODE|PI_FORCE_ASYNC, (HANDLE_PTR)&filter_data); if(FAILED(hres)) { IInternetProtocolSink_Release(This->protocol_sink_handler); IInternetProtocol_Release(This->protocol_handler); This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; This->protocol_handler = &This->default_protocol_handler.IInternetProtocol_iface; return hres; } /* NOTE: IE9 calls it on the new protocol_sink. It doesn't make sense to is seems to be a bug there. */ IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_LOADINGMIMEHANDLER, NULL); return S_OK; }
static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { HttpProtocol *This = PROTOCOL_THIS(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetPriority, riid)) { TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv); *ppv = PRIORITY(This); }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) { TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv); *ppv = INETHTTPINFO(This); }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) { TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv); *ppv = INETHTTPINFO(This); } if(*ppv) { IInternetProtocol_AddRef(iface); return S_OK; } WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static stgmed_buf_t *create_stgmed_buf(IInternetProtocolEx *protocol) { stgmed_buf_t *ret = heap_alloc(sizeof(*ret)); ret->IUnknown_iface.lpVtbl = &StgMedUnkVtbl; ret->ref = 1; ret->file = INVALID_HANDLE_VALUE; ret->hres = S_OK; ret->cache_file = NULL; IInternetProtocol_AddRef(protocol); ret->protocol = protocol; URLMON_LockModule(); return ret; }
HRESULT create_protocol_proxy(IInternetProtocol *protocol, IInternetProtocolSink *protocol_sink, ProtocolProxy **ret) { ProtocolProxy *sink; sink = heap_alloc(sizeof(ProtocolProxy)); if(!sink) return E_OUTOFMEMORY; sink->lpIInternetProtocolVtbl = &ProtocolProxyVtbl; sink->lpIInternetProtocolSinkVtbl = &InternetProtocolSinkVtbl; sink->ref = 1; IInternetProtocol_AddRef(protocol); sink->protocol = protocol; IInternetProtocolSink_AddRef(protocol_sink); sink->protocol_sink = protocol_sink; *ret = sink; return S_OK; }
static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter, LPCWSTR mime) { PROTOCOLFILTERDATA filter_data = { sizeof(PROTOCOLFILTERDATA), NULL, NULL, NULL, 0 }; IInternetProtocolSink *protocol_sink, *old_sink; ProtocolProxy *filter_proxy; HRESULT hres; hres = IInternetProtocol_QueryInterface(mime_filter, &IID_IInternetProtocolSink, (void**)&protocol_sink); if(FAILED(hres)) return hres; hres = create_protocol_proxy(PROTOCOLHANDLER(This), This->protocol_sink, &filter_proxy); if(FAILED(hres)) { IInternetProtocolSink_Release(protocol_sink); return hres; } old_sink = This->protocol_sink; This->protocol_sink = protocol_sink; This->filter_proxy = filter_proxy; IInternetProtocol_AddRef(mime_filter); This->protocol_handler = mime_filter; filter_data.pProtocol = PROTOCOL(filter_proxy); hres = IInternetProtocol_Start(mime_filter, mime, PROTSINK(filter_proxy), BINDINFO(This), PI_FILTER_MODE|PI_FORCE_ASYNC, (HANDLE_PTR)&filter_data); if(FAILED(hres)) { IInternetProtocolSink_Release(old_sink); return hres; } IInternetProtocolSink_ReportProgress(old_sink, BINDSTATUS_LOADINGMIMEHANDLER, NULL); IInternetProtocolSink_Release(old_sink); This->pi &= ~PI_MIMEVERIFICATION; /* FIXME: more tests */ return S_OK; }
static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { BindProtocol *This = PROTOCOL_THIS(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) { TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv); *ppv = BINDINFO(This); }else if(IsEqualGUID(&IID_IInternetPriority, riid)) { TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv); *ppv = PRIORITY(This); }else if(IsEqualGUID(&IID_IAuthenticate, riid)) { FIXME("(%p)->(IID_IAuthenticate %p)\n", This, ppv); }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); *ppv = SERVPROV(This); }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); *ppv = PROTSINK(This); } if(*ppv) { IInternetProtocol_AddRef(iface); return S_OK; } WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv) { HttpProtocol *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; }else if(IsEqualGUID(&IID_IInternetPriority, riid)) { TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv); *ppv = &This->IInternetPriority_iface; }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) { TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv); *ppv = &This->IWinInetHttpInfo_iface; }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) { TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv); *ppv = &This->IWinInetHttpInfo_iface; } if(*ppv) { IInternetProtocol_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) { IInternetProtocol_AddRef(PROTOCOL(This)); PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)This); } }
static ULONG WINAPI MimeFilterSink_AddRef(IInternetProtocolSink *iface) { MimeFilter *This = impl_from_IInternetProtocolSink(iface); return IInternetProtocol_AddRef(&This->IInternetProtocol_iface); }
static ULONG WINAPI ITSProtocolInfo_AddRef(IInternetProtocolInfo *iface) { ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); return IInternetProtocol_AddRef(&This->IInternetProtocol_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->lpBindingVtbl = &BindingVtbl; ret->lpIInternetProtocolSinkVtbl = &InternetProtocolSinkVtbl; ret->lpInternetBindInfoVtbl = &InternetBindInfoVtbl; ret->lpWinInetHttpInfoVtbl = &WinInetHttpInfoVtbl; ret->lpServiceProviderVtbl = &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(BINDING(ret)); return hres; } IBindStatusCallback_QueryInterface(ret->callback, &IID_IServiceProvider, (void**)&ret->service_provider); if(binding_ctx) { ret->protocol = binding_ctx->protocol; IInternetProtocol_AddRef(ret->protocol); } else { hres = create_binding_protocol(TRUE, &ret->protocol); if(FAILED(hres)) { WARN("Could not get protocol handler\n"); IBinding_Release(BINDING(ret)); return hres; } } hres = IBindStatusCallback_GetBindInfo(ret->callback, &ret->bindf, &ret->bindinfo); if(FAILED(hres)) { WARN("GetBindInfo failed: %08x\n", hres); IBinding_Release(BINDING(ret)); 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(BINDING(ret)); return hres; } if(binding_ctx) { ret->stgmed_buf = binding_ctx->stgmed_buf; IUnknown_AddRef(STGMEDUNK(ret->stgmed_buf)); ret->clipboard_format = binding_ctx->clipboard_format; } else { ret->stgmed_buf = create_stgmed_buf(ret->protocol); } 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(BINDING(ret)); return E_NOTIMPL; } *binding = ret; return S_OK; }
static ULONG WINAPI BPServiceProvider_AddRef(IServiceProvider *iface) { BindProtocol *This = SERVPROV_THIS(iface); return IInternetProtocol_AddRef(PROTOCOL(This)); }
static ULONG WINAPI BPInternetProtocolSink_AddRef(IInternetProtocolSink *iface) { BindProtocol *This = PROTSINK_THIS(iface); return IInternetProtocol_AddRef(PROTOCOL(This)); }
static ULONG WINAPI InternetPriority_AddRef(IInternetPriority *iface) { BindProtocol *This = PRIORITY_THIS(iface); return IInternetProtocol_AddRef(PROTOCOL(This)); }
static ULONG WINAPI WinInetHttpInfo_AddRef(IWinInetHttpInfo *iface) { BindProtocol *This = INETINFO_THIS(iface); return IInternetProtocol_AddRef(PROTOCOL(This)); }
static ULONG WINAPI ProtocolHandler_AddRef(IInternetProtocol *iface) { BindProtocol *This = PROTOCOLHANDLER_THIS(iface); return IInternetProtocol_AddRef(PROTOCOL(This)); }
static ULONG WINAPI ITSProtocolInfo_AddRef(IInternetProtocolInfo *iface) { ITSProtocol *This = PROTINFO_THIS(iface); return IInternetProtocol_AddRef(PROTOCOL(This)); }
static ULONG WINAPI GopherPriority_AddRef(IInternetPriority *iface) { GopherProtocol *This = impl_from_IInternetPriority(iface); return IInternetProtocol_AddRef(&This->IInternetProtocol_iface); }