Synchronize with trunk r58606.
[reactos.git] / dll / win32 / urlmon / bindctx.c
index c7bd4e4..c017e8f 100644 (file)
@@ -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,45 @@ 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;
+}
+
+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;
+        IBindStatusCallback_AddRef(bsc);
+    }
+
+    IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface);
+    return bsc;
+}
+
 static inline BindStatusCallback *impl_from_IBindStatusCallbackEx(IBindStatusCallbackEx *iface)
 {
     return CONTAINING_RECORD(iface, BindStatusCallback, IBindStatusCallbackEx_iface);
@@ -90,7 +129,7 @@ static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallbackEx *i
     }
 
     if(*ppv) {
-        IBindStatusCallback_AddRef((IUnknown*)*ppv);
+        IUnknown_AddRef((IUnknown*)*ppv);
         return S_OK;
     }
 
@@ -158,7 +197,7 @@ static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallbackEx *iface
 {
     BindStatusCallback *This = impl_from_IBindStatusCallbackEx(iface);
 
-    TRACE("%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode,
+    TRACE("%p)->(%u %u %s %s)\n", This, ulProgress, ulProgressMax, debugstr_bindstatus(ulStatusCode),
             debugstr_w(szStatusText));
 
     return IBindStatusCallback_OnProgress(This->callback, ulProgress,
@@ -261,19 +300,19 @@ static HRESULT WINAPI BSCServiceProvider_QueryInterface(IServiceProvider *iface,
         REFIID riid, void **ppv)
 {
     BindStatusCallback *This = impl_from_IServiceProvider(iface);
-    return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
+    return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
 }
 
 static ULONG WINAPI BSCServiceProvider_AddRef(IServiceProvider *iface)
 {
     BindStatusCallback *This = impl_from_IServiceProvider(iface);
-    return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface);
+    return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface);
 }
 
 static ULONG WINAPI BSCServiceProvider_Release(IServiceProvider *iface)
 {
     BindStatusCallback *This = impl_from_IServiceProvider(iface);
-    return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface);
+    return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface);
 }
 
 static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface,
@@ -284,17 +323,17 @@ static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface,
 
     if(IsEqualGUID(&IID_IHttpNegotiate, guidService)) {
         TRACE("(%p)->(IID_IHttpNegotiate %s %p)\n", This, debugstr_guid(riid), ppv);
-        return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
+        return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
     }
 
     if(IsEqualGUID(&IID_IHttpNegotiate2, guidService)) {
         TRACE("(%p)->(IID_IHttpNegotiate2 %s %p)\n", This, debugstr_guid(riid), ppv);
-        return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
+        return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
     }
 
     if(IsEqualGUID(&IID_IAuthenticate, guidService)) {
         TRACE("(%p)->(IID_IAuthenticate %s %p)\n", This, debugstr_guid(riid), ppv);
-        return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
+        return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
     }
 
     TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
@@ -328,19 +367,19 @@ static HRESULT WINAPI BSCHttpNegotiate_QueryInterface(IHttpNegotiate2 *iface,
         REFIID riid, void **ppv)
 {
     BindStatusCallback *This = impl_from_IHttpNegotiate2(iface);
-    return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
+    return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
 }
 
 static ULONG WINAPI BSCHttpNegotiate_AddRef(IHttpNegotiate2 *iface)
 {
     BindStatusCallback *This = impl_from_IHttpNegotiate2(iface);
-    return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface);
+    return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface);
 }
 
 static ULONG WINAPI BSCHttpNegotiate_Release(IHttpNegotiate2 *iface)
 {
     BindStatusCallback *This = impl_from_IHttpNegotiate2(iface);
-    return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface);
+    return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface);
 }
 
 static HRESULT WINAPI BSCHttpNegotiate_BeginningTransaction(IHttpNegotiate2 *iface,
@@ -428,19 +467,19 @@ static inline BindStatusCallback *impl_from_IAuthenticate(IAuthenticate *iface)
 static HRESULT WINAPI BSCAuthenticate_QueryInterface(IAuthenticate *iface, REFIID riid, void **ppv)
 {
     BindStatusCallback *This = impl_from_IAuthenticate(iface);
-    return IBindStatusCallback_QueryInterface(&This->IAuthenticate_iface, riid, ppv);
+    return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
 }
 
 static ULONG WINAPI BSCAuthenticate_AddRef(IAuthenticate *iface)
 {
     BindStatusCallback *This = impl_from_IAuthenticate(iface);
-    return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface);
+    return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface);
 }
 
 static ULONG WINAPI BSCAuthenticate_Release(IAuthenticate *iface)
 {
     BindStatusCallback *This = impl_from_IAuthenticate(iface);
-    return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface);
+    return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface);
 }
 
 static HRESULT WINAPI BSCAuthenticate_Authenticate(IAuthenticate *iface,
@@ -516,7 +555,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 +562,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);
-                IBindStatusCallback_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 +613,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;
-        IBindStatusCallback_Release(&holder->IBindStatusCallbackEx_iface);
-    }else if(pbsc == callback) {
-        dorevoke = TRUE;
-    }
     IBindStatusCallback_Release(callback);
-
-    if(dorevoke)
-        IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
-
     return S_OK;
 }