static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD dwOptions) { BindProtocol *This = PROTOCOLHANDLER_THIS(iface); TRACE("(%p)->(%08x)\n", This, dwOptions); if(!This->reported_result) return E_FAIL; IInternetProtocol_Terminate(This->protocol, 0); if(This->filter_proxy) { IInternetProtocol_Release(PROTOCOL(This->filter_proxy)); This->filter_proxy = NULL; } set_binding_sink(PROTOCOL(This), NULL); if(This->bind_info) { IInternetBindInfo_Release(This->bind_info); This->bind_info = NULL; } return S_OK; }
static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface) { BindProtocol *This = PROTOCOL_THIS(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->wininet_info) IWinInetInfo_Release(This->wininet_info); if(This->protocol) IInternetProtocol_Release(This->protocol); if(This->bind_info) IInternetBindInfo_Release(This->bind_info); if(This->protocol_handler && This->protocol_handler != PROTOCOLHANDLER(This)) IInternetProtocol_Release(This->protocol_handler); if(This->filter_proxy) IInternetProtocol_Release(PROTOCOL(This->filter_proxy)); set_binding_sink(PROTOCOL(This), NULL); if(This->notif_hwnd) release_notif_hwnd(This->notif_hwnd); DeleteCriticalSection(&This->section); heap_free(This->mime); heap_free(This->url); heap_free(This); URLMON_UnlockModule(); } return ref; }
static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched) { Binding *This = BINDINF_THIS(iface); TRACE("(%p)->(%d %p %d %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched); switch(ulStringType) { case BINDSTRING_ACCEPT_MIMES: { static const WCHAR wszMimes[] = {'*','/','*',0}; if(!ppwzStr || !pcElFetched) return E_INVALIDARG; ppwzStr[0] = CoTaskMemAlloc(sizeof(wszMimes)); memcpy(ppwzStr[0], wszMimes, sizeof(wszMimes)); *pcElFetched = 1; return S_OK; } case BINDSTRING_USER_AGENT: { IInternetBindInfo *bindinfo = NULL; HRESULT hres; hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IInternetBindInfo, (void**)&bindinfo); if(FAILED(hres)) return hres; hres = IInternetBindInfo_GetBindString(bindinfo, ulStringType, ppwzStr, cEl, pcElFetched); IInternetBindInfo_Release(bindinfo); return hres; } case BINDSTRING_URL: { DWORD size = (SysStringLen(This->url)+1) * sizeof(WCHAR); if(!ppwzStr || !pcElFetched) return E_INVALIDARG; *ppwzStr = CoTaskMemAlloc(size); memcpy(*ppwzStr, This->url, size); *pcElFetched = 1; return S_OK; } } FIXME("not supported string type %d\n", ulStringType); return E_NOTIMPL; }
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; IInternetProtocol_Terminate(This->protocol, 0); set_binding_sink(This, NULL, NULL); if(This->bind_info) { IInternetBindInfo_Release(This->bind_info); This->bind_info = NULL; } return S_OK; }
static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface) { BindProtocol *This = PROTOCOL_THIS(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->protocol) IInternetProtocol_Release(This->protocol); if(This->bind_info) IInternetBindInfo_Release(This->bind_info); set_binding_sink(PROTOCOL(This), NULL); heap_free(This); URLMON_UnlockModule(); } return ref; }
static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface) { BindProtocol *This = impl_from_IInternetProtocolEx(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->wininet_info) IWinInetInfo_Release(This->wininet_info); if(This->wininet_http_info) IWinInetHttpInfo_Release(This->wininet_http_info); if(This->protocol) IInternetProtocol_Release(This->protocol); if(This->bind_info) IInternetBindInfo_Release(This->bind_info); if(This->protocol_handler && This->protocol_handler != &This->default_protocol_handler.IInternetProtocol_iface) IInternetProtocol_Release(This->protocol_handler); if(This->protocol_sink_handler && This->protocol_sink_handler != &This->default_protocol_handler.IInternetProtocolSink_iface) IInternetProtocolSink_Release(This->protocol_sink_handler); if(This->uri) IUri_Release(This->uri); SysFreeString(This->display_uri); set_binding_sink(This, NULL, NULL); if(This->notif_hwnd) release_notif_hwnd(This->notif_hwnd); This->section.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->section); heap_free(This->mime); heap_free(This); URLMON_UnlockModule(); } return ref; }
void set_binding_sink(BindProtocol *This, IInternetProtocolSink *sink, IInternetBindInfo *bind_info) { IInternetProtocolSink *prev_sink; IServiceProvider *service_provider = NULL; if(sink) IInternetProtocolSink_AddRef(sink); prev_sink = InterlockedExchangePointer((void**)&This->protocol_sink, sink); if(prev_sink) IInternetProtocolSink_Release(prev_sink); if(sink) IInternetProtocolSink_QueryInterface(sink, &IID_IServiceProvider, (void**)&service_provider); service_provider = InterlockedExchangePointer((void**)&This->service_provider, service_provider); if(service_provider) IServiceProvider_Release(service_provider); if(bind_info) IInternetBindInfo_AddRef(bind_info); bind_info = InterlockedExchangePointer((void**)&This->bind_info, bind_info); if(bind_info) IInternetBindInfo_Release(bind_info); }