static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv) { Binding *This = BINDING_THIS(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = BINDING(This); } else if(IsEqualGUID(&IID_IBinding, riid)) { TRACE("(%p)->(IID_IBinding %p)\n", This, ppv); *ppv = BINDING(This); } else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); *ppv = PROTSINK(This); } else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) { TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv); *ppv = BINDINF(This); } else if(IsEqualGUID(&IID_IServiceProvider, riid)) { TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); *ppv = SERVPROV(This); } else if(IsEqualGUID(&IID_IWinInetInfo, riid)) { TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv); /* NOTE: This violidates COM rules, but tests prove that we should do it */ if(!get_wininet_info(This->protocol)) return E_NOINTERFACE; *ppv = INETINFO(This); } else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) { IWinInetHttpInfo *http_info; IWinInetInfo *info; HRESULT hres; TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv); info = get_wininet_info(This->protocol); if(!info) return E_NOINTERFACE; hres = IWinInetInfo_QueryInterface(info, &IID_IWinInetHttpInfo, (void**)&http_info); if(FAILED(hres)) return E_NOINTERFACE; IWinInetHttpInfo_Release(http_info); *ppv = INETINFO(This); } if(*ppv) { IBinding_AddRef(BINDING(This)); return S_OK; } WARN("Unsupported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static HRESULT WINAPI InstallCallback_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib) { set_status(IDS_DOWNLOADING); IBinding_AddRef(pib); dwl_binding = pib; return S_OK; }
static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv) { Binding *This = impl_from_IBinding(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IBinding_iface; }else if(IsEqualGUID(&IID_IBinding, riid)) { TRACE("(%p)->(IID_IBinding %p)\n", This, ppv); *ppv = &This->IBinding_iface; }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); *ppv = &This->IInternetProtocolSink_iface; }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) { TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv); *ppv = &This->IInternetBindInfo_iface; }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); *ppv = &This->IServiceProvider_iface; }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) { TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv); /* NOTE: This violidates COM rules, but tests prove that we should do it */ if(!This->protocol->wininet_info) return E_NOINTERFACE; *ppv = &This->IWinInetHttpInfo_iface; }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) { IWinInetHttpInfo *http_info; HRESULT hres; TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv); if(!This->protocol->wininet_info) return E_NOINTERFACE; hres = IWinInetInfo_QueryInterface(This->protocol->wininet_info, &IID_IWinInetHttpInfo, (void**)&http_info); if(FAILED(hres)) return E_NOINTERFACE; IWinInetHttpInfo_Release(http_info); *ppv = &This->IWinInetHttpInfo_iface; } if(*ppv) { IBinding_AddRef(&This->IBinding_iface); return S_OK; } WARN("Unsupported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pbind) { BindStatusCallback *This = impl_from_IBindStatusCallback(iface); TRACE("(%p)->(%d %p)\n", This, dwReserved, pbind); This->binding = pbind; IBinding_AddRef(This->binding); return S_OK; }
static HRESULT WINAPI XMLView_Binding_QueryInterface( IBinding *iface, REFIID riid, void **ppvObject) { Binding *This = impl_from_IBinding(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBinding)) { *ppvObject = iface; IBinding_AddRef(iface); return S_OK; } *ppvObject = NULL; return E_NOINTERFACE; }
static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallback *iface, DWORD reserved, IBinding *pbind) { BindStatusCallback *This = impl_from_IBindStatusCallback(iface); TRACE("(%p)->(%d %p)\n", This, reserved, pbind); if (!pbind) return E_INVALIDARG; This->binding = pbind; IBinding_AddRef(pbind); httprequest_setreadystate(This->request, READYSTATE_LOADED); return CreateStreamOnHGlobal(NULL, TRUE, &This->stream); }
static inline HRESULT XMLView_Binding_Create(IBinding *binding, IBinding **ret) { Binding *bind; bind = heap_alloc_zero(sizeof(Binding)); if(!bind) return E_OUTOFMEMORY; bind->IBinding_iface.lpVtbl = &XMLView_BindingVtbl; bind->ref = 1; bind->binding = binding; IBinding_AddRef(binding); *ret = &bind->IBinding_iface; return S_OK; }
static HRESULT WINAPI DownloadBSC_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pbind) { DownloadBSC *This = impl_from_IBindStatusCallback(iface); HRESULT hres = S_OK; TRACE("(%p)->(%d %p)\n", This, dwReserved, pbind); if(This->callback) { hres = IBindStatusCallback_OnStartBinding(This->callback, dwReserved, pbind); IBinding_AddRef(pbind); This->binding = pbind; } /* Windows seems to ignore E_NOTIMPL if it's returned from the client. */ return hres == E_NOTIMPL ? S_OK : hres; }
static HRESULT WINAPI Binding_QueryInterface(IBinding* iface, REFIID riid, void **ppvObject) { Binding *This = (Binding*)iface; TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject); if((This == NULL) || (ppvObject == NULL)) return E_INVALIDARG; if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IBinding, riid)) { *ppvObject = iface; IBinding_AddRef(iface); return S_OK; } *ppvObject = NULL; return E_NOINTERFACE; }
static HRESULT WINAPI bsc_OnStartBinding( IBindStatusCallback* iface, DWORD dwReserved, IBinding* pib) { bsc_t *This = impl_from_IBindStatusCallback(iface); HRESULT hr; TRACE("(%p)->(%x %p)\n", This, dwReserved, pib); This->binding = pib; IBinding_AddRef(pib); hr = CreateStreamOnHGlobal(NULL, TRUE, &This->memstream); if(FAILED(hr)) return hr; return S_OK; }
static ULONG WINAPI InternetBindInfo_AddRef(IInternetBindInfo *iface) { Binding *This = impl_from_IInternetBindInfo(iface); return IBinding_AddRef(&This->IBinding_iface); }
static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface) { Binding *This = SERVPROV_THIS(iface); return IBinding_AddRef(BINDING(This)); }
static ULONG WINAPI WinInetHttpInfo_AddRef(IWinInetHttpInfo *iface) { Binding *This = INETINFO_THIS(iface); return IBinding_AddRef(BINDING(This)); }
static ULONG WINAPI InternetBindInfo_AddRef(IInternetBindInfo *iface) { Binding *This = BINDINF_THIS(iface); return IBinding_AddRef(BINDING(This)); }
static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progress_max) { FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM}; BOOL sent_begindownloaddata = FALSE; TRACE("(%p)->(%d %u %u)\n", This, bscf, progress, progress_max); if(This->download_state == END_DOWNLOAD || (This->state & (BINDING_STOPPED|BINDING_ABORTED))) return; if(This->stgmed_buf->file != INVALID_HANDLE_VALUE) read_protocol_data(This->stgmed_buf); else if(This->download_state == BEFORE_DOWNLOAD) fill_stgmed_buffer(This->stgmed_buf); if(This->download_state == BEFORE_DOWNLOAD) { This->download_state = DOWNLOADING; sent_begindownloaddata = TRUE; IBindStatusCallback_OnProgress(This->callback, progress, progress_max, BINDSTATUS_BEGINDOWNLOADDATA, This->url); if(This->stgmed_buf->cache_file) IBindStatusCallback_OnProgress(This->callback, progress, progress_max, BINDSTATUS_CACHEFILENAMEAVAILABLE, This->stgmed_buf->cache_file); } if(This->stgmed_buf->hres == S_FALSE || (bscf & BSCF_LASTDATANOTIFICATION)) { This->download_state = END_DOWNLOAD; IBindStatusCallback_OnProgress(This->callback, progress, progress_max, BINDSTATUS_ENDDOWNLOADDATA, This->url); } else if(!sent_begindownloaddata) { IBindStatusCallback_OnProgress(This->callback, progress, progress_max, BINDSTATUS_DOWNLOADINGDATA, This->url); } if(This->state & (BINDING_STOPPED|BINDING_ABORTED)) return; if(This->to_object) { if(!(This->state & BINDING_OBJAVAIL)) { IBinding_AddRef(BINDING(This)); create_object(This); IBinding_Release(BINDING(This)); } } else { STGMEDIUM stgmed; HRESULT hres; if(!(This->state & BINDING_LOCKED)) { HRESULT hres = IInternetProtocol_LockRequest(This->protocol, 0); if(SUCCEEDED(hres)) This->state |= BINDING_LOCKED; } hres = This->stgmed_obj->vtbl->fill_stgmed(This->stgmed_obj, &stgmed); if(FAILED(hres)) { stop_binding(This, hres, NULL); return; } formatetc.tymed = stgmed.tymed; formatetc.cfFormat = This->clipboard_format; IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress, &formatetc, &stgmed); if(This->download_state == END_DOWNLOAD) stop_binding(This, S_OK, NULL); } }
static ULONG WINAPI InternetProtocolSink_AddRef(IInternetProtocolSink *iface) { Binding *This = PROTSINK_THIS(iface); return IBinding_AddRef(BINDING(This)); }
static ULONG WINAPI WinInetHttpInfo_AddRef(IWinInetHttpInfo *iface) { Binding *This = impl_from_IWinInetHttpInfo(iface); return IBinding_AddRef(&This->IBinding_iface); }
static ULONG WINAPI BindInfo_AddRef(IInternetBindInfo *iface) { BindProtocol *This = BINDINFO_THIS(iface); return IBinding_AddRef(PROTOCOL(This)); }
static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface) { HttpProtocol *This = INETINFO_THIS(iface); return IBinding_AddRef(PROTOCOL(This)); }
static ULONG WINAPI InternetProtocolSink_AddRef(IInternetProtocolSink *iface) { Binding *This = impl_from_IInternetProtocolSink(iface); return IBinding_AddRef(&This->IBinding_iface); }
static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface) { Binding *This = impl_from_IServiceProvider(iface); return IBinding_AddRef(&This->IBinding_iface); }