/******************************************************************************* * BindCtx_QueryInterface *******************************************************************************/ static HRESULT WINAPI BindCtxImpl_QueryInterface(IBindCtx* iface,REFIID riid,void** ppvObject) { BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p %s %p)\n",This, debugstr_guid(riid), ppvObject); /* Perform a sanity check on the parameters.*/ if (!ppvObject) return E_POINTER; /* Initialize the return parameter.*/ *ppvObject = 0; /* Compare the riid with the interface IDs implemented by this object.*/ if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IBindCtx, riid)) { *ppvObject = This; IBindCtx_AddRef(iface); return S_OK; } return E_NOINTERFACE; }
/*********************************************************************** * CreateAsyncBindCtxEx (urlmon.@) * * Create an asynchronous bind context. */ HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx *ibind, DWORD options, IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx** pbind, DWORD reserved) { AsyncBindCtx *ret; IBindCtx *bindctx; HRESULT hres; TRACE("(%p %08x %p %p %p %d)\n", ibind, options, callback, format, pbind, reserved); if(!pbind) return E_INVALIDARG; if(reserved) WARN("reserved=%d\n", reserved); if(ibind) { IBindCtx_AddRef(ibind); bindctx = ibind; }else { hres = CreateBindCtx(0, &bindctx); if(FAILED(hres)) return hres; } ret = heap_alloc(sizeof(AsyncBindCtx)); ret->IBindCtx_iface.lpVtbl = &AsyncBindCtxVtbl; ret->ref = 1; ret->bindctx = bindctx; hres = init_bindctx(&ret->IBindCtx_iface, options, callback, format); if(FAILED(hres)) { IBindCtx_Release(&ret->IBindCtx_iface); return hres; } *pbind = &ret->IBindCtx_iface; return S_OK; }
static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **binding) { Binding *ret; HRESULT hres; URLMON_LockModule(); ret = heap_alloc_zero(sizeof(Binding)); ret->lpBindingVtbl = &BindingVtbl; ret->lpIInternetProtocolSinkVtbl = &InternetProtocolSinkVtbl; ret->lpInternetBindInfoVtbl = &InternetBindInfoVtbl; ret->lpWinInetHttpInfoVtbl = &WinInetHttpInfoVtbl; ret->lpServiceProviderVtbl = &ServiceProviderVtbl; ret->ref = 1; ret->to_object = to_obj; ret->iid = *riid; ret->notif_hwnd = get_notif_hwnd(); ret->report_mime = !binding_ctx; ret->download_state = BEFORE_DOWNLOAD; if(to_obj) { IBindCtx_AddRef(pbc); ret->bctx = pbc; } if(mon) { IMoniker_AddRef(mon); ret->mon = mon; } ret->bindinfo.cbSize = sizeof(BINDINFO); InitializeCriticalSection(&ret->section); ret->section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": Binding.section"); hres = get_callback(pbc, &ret->callback); if(FAILED(hres)) { WARN("Could not get IBindStatusCallback\n"); IBinding_Release(BINDING(ret)); return hres; } IBindStatusCallback_QueryInterface(ret->callback, &IID_IServiceProvider, (void**)&ret->service_provider); if(binding_ctx) { ret->protocol = binding_ctx->protocol; IInternetProtocol_AddRef(ret->protocol); } else { hres = create_binding_protocol(TRUE, &ret->protocol); if(FAILED(hres)) { WARN("Could not get protocol handler\n"); IBinding_Release(BINDING(ret)); return hres; } } hres = IBindStatusCallback_GetBindInfo(ret->callback, &ret->bindf, &ret->bindinfo); if(FAILED(hres)) { WARN("GetBindInfo failed: %08x\n", hres); IBinding_Release(BINDING(ret)); return hres; } TRACE("bindf %08x\n", ret->bindf); dump_BINDINFO(&ret->bindinfo); ret->bindf |= BINDF_FROMURLMON; if(to_obj) ret->bindinfo.dwOptions |= 0x100000; if(!(ret->bindf & BINDF_ASYNCHRONOUS) || !(ret->bindf & BINDF_PULLDATA)) { ret->bindf |= BINDF_NEEDFILE; ret->use_cache_file = TRUE; } else if(!is_urlmon_protocol(uri)) { ret->bindf |= BINDF_NEEDFILE; } hres = IUri_GetDisplayUri(uri, &ret->url); if(FAILED(hres)) { IBinding_Release(BINDING(ret)); return hres; } if(binding_ctx) { ret->stgmed_buf = binding_ctx->stgmed_buf; IUnknown_AddRef(STGMEDUNK(ret->stgmed_buf)); ret->clipboard_format = binding_ctx->clipboard_format; } else { ret->stgmed_buf = create_stgmed_buf(ret->protocol); } if(to_obj) { ret->stgmed_obj = NULL; } else if(IsEqualGUID(&IID_IStream, riid)) { ret->stgmed_obj = create_stgmed_stream(ret->stgmed_buf); } else if(IsEqualGUID(&IID_IUnknown, riid)) { ret->bindf |= BINDF_NEEDFILE; ret->stgmed_obj = create_stgmed_file(ret->stgmed_buf); } else { FIXME("Unsupported riid %s\n", debugstr_guid(riid)); IBinding_Release(BINDING(ret)); return E_NOTIMPL; } *binding = ret; return S_OK; }