Jacek Caban : urlmon: Replace also bind_info in set_binding_sink.

Alexandre Julliard julliard at winehq.org
Fri Oct 1 11:38:51 CDT 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct  1 13:56:56 2010 +0200

urlmon: Replace also bind_info in set_binding_sink.

---

 dlls/urlmon/binding.c     |    7 +++++--
 dlls/urlmon/bindprot.c    |   17 ++++++++++-------
 dlls/urlmon/tests/url.c   |    8 +++-----
 dlls/urlmon/urlmon_main.h |    2 +-
 4 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index e0f3624..02053b0 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -1077,8 +1077,11 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
     }
 
     if(This->to_object) {
-        if(!(This->state & BINDING_OBJAVAIL))
+        if(!(This->state & BINDING_OBJAVAIL)) {
+            IBinding_AddRef(BINDING(This));
             create_object(This);
+            IBinding_Release(BINDING(This));
+        }
     }else {
         STGMEDIUM stgmed;
         HRESULT hres;
@@ -1519,7 +1522,7 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I
     }
 
     if(binding_ctx) {
-        set_binding_sink(binding->protocol, PROTSINK(binding));
+        set_binding_sink(binding->protocol, PROTSINK(binding), BINDINF(binding));
         if(binding_ctx->redirect_url)
             IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url);
         report_data(binding, 0, 0, 0);
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c
index 29b8532..01443e3 100644
--- a/dlls/urlmon/bindprot.c
+++ b/dlls/urlmon/bindprot.c
@@ -382,7 +382,7 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface)
         if(This->filter_proxy)
             IInternetProtocol_Release(PROTOCOL(This->filter_proxy));
 
-        set_binding_sink(PROTOCOL(This), NULL);
+        set_binding_sink(PROTOCOL(This), NULL, NULL);
 
         if(This->notif_hwnd)
             release_notif_hwnd(This->notif_hwnd);
@@ -488,7 +488,7 @@ static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocol *iface)
     return IInternetProtocol_UnlockRequest(This->protocol_handler);
 }
 
-void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink)
+void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
 {
     BindProtocol *This = PROTOCOL_THIS(bind_protocol);
     IInternetProtocolSink *prev_sink;
@@ -505,6 +505,12 @@ void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *s
     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);
 }
 
 IWinInetInfo *get_wininet_info(IInternetProtocol *bind_protocol)
@@ -619,10 +625,7 @@ static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR sz
     if(urlmon_protocol)
         IInternetProtocol_QueryInterface(protocol, &IID_IWinInetInfo, (void**)&This->wininet_info);
 
-    IInternetBindInfo_AddRef(pOIBindInfo);
-    This->bind_info = pOIBindInfo;
-
-    set_binding_sink(PROTOCOL(This), pOIProtSink);
+    set_binding_sink(PROTOCOL(This), pOIProtSink, pOIBindInfo);
 
     hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority);
     if(SUCCEEDED(hres)) {
@@ -670,7 +673,7 @@ static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD
         This->filter_proxy = NULL;
     }
 
-    set_binding_sink(PROTOCOL(This), NULL);
+    set_binding_sink(PROTOCOL(This), NULL, NULL);
 
     if(This->bind_info) {
         IInternetBindInfo_Release(This->bind_info);
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index e25db0b..a010d23 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -2674,13 +2674,11 @@ static void test_BindToObject(int protocol, DWORD flags)
         CHECK_CALLED(Obj_OnStopBinding);
     }
 
-    if(test_protocol != HTTP_TEST || emulate_protocol || !(bindf & BINDF_ASYNCHRONOUS)) {
-        ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n");
+    ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n");
+    if(test_protocol != HTTP_TEST || emulate_protocol || !(bindf & BINDF_ASYNCHRONOUS))
         ok(IBindCtx_Release(bctx) == 0, "bctx should be destroyed here\n");
-    }else {
-        todo_wine ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n");
+    else
         IBindCtx_Release(bctx);
-    }
 
     if(emulate_protocol)
         CoRevokeClassObject(regid);
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index e6bc594..3aada09 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -78,7 +78,7 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
 HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
 
 HRESULT create_binding_protocol(LPCWSTR url, BOOL from_urlmon, IInternetProtocol **protocol);
-void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink);
+void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info);
 IWinInetInfo *get_wininet_info(IInternetProtocol*);
 
 typedef struct ProtocolVtbl ProtocolVtbl;




More information about the wine-cvs mailing list