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;
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);
}
if(*ppv) {
- IBindStatusCallback_AddRef((IUnknown*)*ppv);
+ IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
{
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,
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,
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);
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,
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,
{
BindStatusCallback *holder;
IBindStatusCallback *bsc, *prev = NULL;
- IUnknown *unk;
HRESULT hres;
TRACE("(%p %p %p %x)\n", pbc, pbsc, ppbscPrevious, dwReserved);
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)) {
*/
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;
}