Jacek Caban : urlmon: Moved extracting callback from IBindCtx to separated function.

Alexandre Julliard julliard at winehq.org
Fri Nov 2 15:52:02 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov  2 13:49:36 2012 +0100

urlmon: Moved extracting callback from IBindCtx to separated function.

---

 dlls/urlmon/bindctx.c |  103 ++++++++++++++++++++++++++++---------------------
 1 files changed, 59 insertions(+), 44 deletions(-)

diff --git a/dlls/urlmon/bindctx.c b/dlls/urlmon/bindctx.c
index 79260ef..914ed9f 100644
--- a/dlls/urlmon/bindctx.c
+++ b/dlls/urlmon/bindctx.c
@@ -23,7 +23,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 
-static WCHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
+static WCHAR bscb_holderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
 
 extern IID IID_IBindStatusCallbackHolder;
 
@@ -51,6 +51,44 @@ static void *get_callback_iface(BindStatusCallback *This, REFIID riid)
     return SUCCEEDED(hres) ? ret : NULL;
 }
 
+static IBindStatusCallback *bsch_from_bctx(IBindCtx *bctx)
+{
+    IBindStatusCallback *bsc;
+    IUnknown *unk;
+    HRESULT hres;
+
+    hres = IBindCtx_GetObjectParam(bctx, bscb_holderW, &unk);
+    if(FAILED(hres))
+        return NULL;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc);
+    IUnknown_Release(unk);
+    return SUCCEEDED(hres) ? bsc : NULL;
+}
+
+static IBindStatusCallback *bsc_from_bctx(IBindCtx *bctx)
+{
+    BindStatusCallback *holder;
+    IBindStatusCallback *bsc;
+    HRESULT hres;
+
+    bsc = bsch_from_bctx(bctx);
+    if(!bsc)
+        return NULL;
+
+    hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder);
+    if(FAILED(hres))
+        return bsc;
+
+    if(holder->callback) {
+        IBindStatusCallback_Release(bsc);
+        bsc = holder->callback;
+    }
+
+    IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface);
+    return bsc;
+}
+
 static inline BindStatusCallback *impl_from_IBindStatusCallbackEx(IBindStatusCallbackEx *iface)
 {
     return CONTAINING_RECORD(iface, BindStatusCallback, IBindStatusCallbackEx_iface);
@@ -516,7 +554,6 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb
 {
     BindStatusCallback *holder;
     IBindStatusCallback *bsc, *prev = NULL;
-    IUnknown *unk;
     HRESULT hres;
 
     TRACE("(%p %p %p %x)\n", pbc, pbsc, ppbscPrevious, dwReserved);
@@ -524,34 +561,30 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb
     if (!pbc || !pbsc)
         return E_INVALIDARG;
 
-    hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk);
-    if(SUCCEEDED(hres)) {
-        hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc);
-        IUnknown_Release(unk);
+    bsc = bsch_from_bctx(pbc);
+    if(bsc) {
+        hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder);
         if(SUCCEEDED(hres)) {
-            hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder);
-            if(SUCCEEDED(hres)) {
-                if(ppbscPrevious) {
-                    IBindStatusCallback_AddRef(holder->callback);
-                    *ppbscPrevious = holder->callback;
-                }
-
-                set_callback(holder, pbsc);
-
-                IBindStatusCallback_Release(bsc);
-                IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface);
-                return S_OK;
-            }else {
-                prev = bsc;
+            if(ppbscPrevious) {
+                IBindStatusCallback_AddRef(holder->callback);
+                *ppbscPrevious = holder->callback;
             }
+
+            set_callback(holder, pbsc);
+
+            IBindStatusCallback_Release(bsc);
+            IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface);
+            return S_OK;
+        }else {
+            prev = bsc;
         }
 
-        IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
+        IBindCtx_RevokeObjectParam(pbc, bscb_holderW);
     }
 
     hres = wrap_callback(pbsc, &bsc);
     if(SUCCEEDED(hres)) {
-        hres = IBindCtx_RegisterObjectParam(pbc, BSCBHolder, (IUnknown*)bsc);
+        hres = IBindCtx_RegisterObjectParam(pbc, bscb_holderW, (IUnknown*)bsc);
         IBindStatusCallback_Release(bsc);
     }
     if(FAILED(hres)) {
@@ -579,39 +612,21 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb
  */
 HRESULT WINAPI RevokeBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc)
 {
-    BindStatusCallback *holder;
     IBindStatusCallback *callback;
-    IUnknown *unk;
-    BOOL dorevoke = FALSE;
-    HRESULT hres;
 
     TRACE("(%p %p)\n", pbc, pbsc);
 
     if (!pbc || !pbsc)
         return E_INVALIDARG;
 
-    hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk);
-    if(FAILED(hres))
+    callback = bsc_from_bctx(pbc);
+    if(!callback)
         return S_OK;
 
-    hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&callback);
-    IUnknown_Release(unk);
-    if(FAILED(hres))
-        return S_OK;
+    if(callback == pbsc)
+        IBindCtx_RevokeObjectParam(pbc, bscb_holderW);
 
-    hres = IBindStatusCallback_QueryInterface(callback, &IID_IBindStatusCallbackHolder, (void**)&holder);
-    if(SUCCEEDED(hres)) {
-        if(pbsc == holder->callback)
-            dorevoke = TRUE;
-        IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface);
-    }else if(pbsc == callback) {
-        dorevoke = TRUE;
-    }
     IBindStatusCallback_Release(callback);
-
-    if(dorevoke)
-        IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
-
     return S_OK;
 }
 




More information about the wine-cvs mailing list