Jacek Caban : urlmon: Move setting protocol_sink to separated function.
Alexandre Julliard
julliard at winehq.org
Mon Dec 31 12:32:16 CST 2007
Module: wine
Branch: master
Commit: 2e62330c67f1bd0145f0f27b89d6b3080ed4ba5d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e62330c67f1bd0145f0f27b89d6b3080ed4ba5d
Author: Jacek Caban <jacek at 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)
{
More information about the wine-cvs
mailing list