Module: wine Branch: master Commit: ccc5ba29ca1fd3a0334f06355de24ae237b676a1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ccc5ba29ca1fd3a0334f06355d...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jun 6 17:15:40 2017 +0200
urlmon: Added a helper function for releasing protocol handler.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/urlmon/bindprot.c | 39 ++++++++++++++++++++++++++++----------- dlls/urlmon/urlmon_main.h | 6 ++++-- 2 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index a4399ab..1e9dd5c 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -328,6 +328,31 @@ static ULONG WINAPI BindProtocol_AddRef(IInternetProtocolEx *iface) return ref; }
+static void release_protocol_handler(BindProtocol *This) +{ + if(This->wininet_info) { + IWinInetInfo_Release(This->wininet_info); + This->wininet_info = NULL; + } + if(This->wininet_http_info) { + IWinInetHttpInfo_Release(This->wininet_http_info); + This->wininet_http_info = NULL; + } + if(This->protocol) { + IInternetProtocol_Release(This->protocol); + This->protocol = NULL; + } + if(This->protocol_handler && This->protocol_handler != &This->default_protocol_handler.IInternetProtocol_iface) { + IInternetProtocol_Release(This->protocol_handler); + This->protocol_handler = &This->default_protocol_handler.IInternetProtocol_iface; + } + if(This->protocol_sink_handler && + This->protocol_sink_handler != &This->default_protocol_handler.IInternetProtocolSink_iface) { + IInternetProtocolSink_Release(This->protocol_sink_handler); + This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; + } +} + static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface) { BindProtocol *This = impl_from_IInternetProtocolEx(iface); @@ -336,19 +361,11 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface) 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); + release_protocol_handler(This); + if(This->redirect_callback) + IBindCallbackRedirect_Release(This->redirect_callback); 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); diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 5de1afe..ee26bed 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -176,11 +176,13 @@ typedef struct { LONG ref;
IInternetProtocol *protocol; + IWinInetInfo *wininet_info; + IWinInetHttpInfo *wininet_http_info; + IInternetBindInfo *bind_info; IInternetProtocolSink *protocol_sink; IServiceProvider *service_provider; - IWinInetInfo *wininet_info; - IWinInetHttpInfo *wininet_http_info; + IBindCallbackRedirect *redirect_callback;
struct { IInternetProtocol IInternetProtocol_iface;