/*********************************************************************** * RegisterBindStatusCallback (urlmon.@) * * Register a bind status callback. * * PARAMS * pbc [I] Binding context * pbsc [I] Callback to register * ppbscPrevious [O] Destination for previous callback * dwReserved [I] Reserved, must be 0. * * RETURNS * Success: S_OK. * Failure: E_INVALIDARG, if any argument is invalid, or * E_OUTOFMEMORY if memory allocation fails. */ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbscPrevious, DWORD dwReserved) { BindStatusCallback *holder; IBindStatusCallback *bsc, *prev = NULL; HRESULT hres; TRACE("(%p %p %p %x)\n", pbc, pbsc, ppbscPrevious, dwReserved); if (!pbc || !pbsc) return E_INVALIDARG; bsc = bsch_from_bctx(pbc); if(bsc) { 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; } IBindCtx_RevokeObjectParam(pbc, bscb_holderW); } hres = wrap_callback(pbsc, &bsc); if(SUCCEEDED(hres)) { hres = IBindCtx_RegisterObjectParam(pbc, bscb_holderW, (IUnknown*)bsc); IBindStatusCallback_Release(bsc); } if(FAILED(hres)) { if(prev) IBindStatusCallback_Release(prev); return hres; } if(ppbscPrevious) *ppbscPrevious = prev; return S_OK; }
static HRESULT WINAPI BindStatusCallback_GetBindInfoEx(IBindStatusCallbackEx *iface, DWORD *grfBINDF, BINDINFO *pbindinfo, DWORD *grfBINDF2, DWORD *pdwReserved) { BindStatusCallback *This = impl_from_IBindStatusCallbackEx(iface); IBindStatusCallbackEx *bscex; HRESULT hres; TRACE("(%p)->(%p %p %p %p)\n", This, grfBINDF, pbindinfo, grfBINDF2, pdwReserved); hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IBindStatusCallbackEx, (void**)&bscex); if(SUCCEEDED(hres)) { hres = IBindStatusCallbackEx_GetBindInfoEx(bscex, grfBINDF, pbindinfo, grfBINDF2, pdwReserved); IBindStatusCallbackEx_Release(bscex); }else { hres = IBindStatusCallback_GetBindInfo(This->callback, grfBINDF, pbindinfo); } return hres; }
static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallbackEx *iface, DWORD *grfBINDF, BINDINFO *pbindinfo) { BindStatusCallback *This = STATUSCLB_THIS(iface); IBindStatusCallbackEx *bscex; HRESULT hres; TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IBindStatusCallbackEx, (void**)&bscex); if(SUCCEEDED(hres)) { DWORD bindf2 = 0, reserv = 0; hres = IBindStatusCallbackEx_GetBindInfoEx(bscex, grfBINDF, pbindinfo, &bindf2, &reserv); IBindStatusCallbackEx_Release(bscex); }else { hres = IBindStatusCallback_GetBindInfo(This->callback, grfBINDF, pbindinfo); } return hres; }
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 ULONG WINAPI BSCAuthenticate_Release(IAuthenticate *iface) { BindStatusCallback *This = impl_from_IAuthenticate(iface); return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); }
static ULONG WINAPI BSCHttpNegotiate_Release(IHttpNegotiate2 *iface) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); }
static ULONG WINAPI BSCServiceProvider_Release(IServiceProvider *iface) { BindStatusCallback *This = impl_from_IServiceProvider(iface); return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); }