Jacek Caban : urlmon: Added a helper function for releasing protocol handler.

Alexandre Julliard julliard at winehq.org
Tue Jun 6 15:23:35 CDT 2017


Module: wine
Branch: master
Commit: ccc5ba29ca1fd3a0334f06355de24ae237b676a1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ccc5ba29ca1fd3a0334f06355de24ae237b676a1

Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list