Module: wine Branch: master Commit: 2e62330c67f1bd0145f0f27b89d6b3080ed4ba5d URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e62330c67f1bd0145f0f27b89...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Dec 28 14:53:25 2007 +0100
urlmon: Move setting protocol_sink to separated function.
---
dlls/urlmon/bindprot.c | 27 +++++++++++++++++++++------ dlls/urlmon/urlmon_main.h | 1 + 2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index f97fc4f..936d078 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -105,9 +105,8 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface) IInternetProtocol_Release(This->protocol); if(This->bind_info) IInternetBindInfo_Release(This->bind_info); - if(This->protocol_sink) - IInternetProtocolSink_Release(This->protocol_sink);
+ set_binding_sink(PROTOCOL(This), NULL); heap_free(This);
URLMON_UnlockModule(); @@ -172,10 +171,7 @@ static HRESULT WINAPI BindProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl IInternetBindInfo_AddRef(pOIBindInfo); This->bind_info = pOIBindInfo;
- IInternetProtocolSink_AddRef(pOIProtSink); - This->protocol_sink = pOIProtSink; - - IInternetProtocolSink_QueryInterface(pOIProtSink, &IID_IServiceProvider, (void**)&This->service_provider); + set_binding_sink(PROTOCOL(This), pOIProtSink);
hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority); if(SUCCEEDED(hres)) { @@ -268,6 +264,25 @@ static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocol *iface) return IInternetProtocol_UnlockRequest(This->protocol); }
+void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink) +{ + BindProtocol *This = PROTOCOL_THIS(bind_protocol); + 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); +} + #undef PROTOCOL_THIS
static const IInternetProtocolVtbl BindProtocolVtbl = { diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 631b60b..70906a1 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -71,6 +71,7 @@ HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, IClassFactory **ret); HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
HRESULT create_binding_protocol(LPCWSTR url, IInternetProtocol **protocol); +void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink);
static inline void *heap_alloc(size_t len) {