static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **ret) { Binding *binding = NULL; HRESULT hres; MSG msg; hres = Binding_Create(mon, binding_ctx, uri, pbc, to_obj, riid, &binding); if(FAILED(hres)) return hres; hres = IBindStatusCallback_OnStartBinding(binding->callback, 0, &binding->IBinding_iface); if(FAILED(hres)) { WARN("OnStartBinding failed: %08x\n", hres); stop_binding(binding, INET_E_DOWNLOAD_FAILURE, NULL); IBinding_Release(&binding->IBinding_iface); return hres; } if(binding_ctx) { set_binding_sink(binding->protocol, &binding->IInternetProtocolSink_iface, &binding->IInternetBindInfo_iface); if(binding_ctx->redirect_url) IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url); report_data(binding, BSCF_FIRSTDATANOTIFICATION | (binding_ctx->download_state == END_DOWNLOAD ? BSCF_LASTDATANOTIFICATION : 0), 0, 0); }else { hres = IInternetProtocolEx_StartEx(&binding->protocol->IInternetProtocolEx_iface, uri, &binding->IInternetProtocolSink_iface, &binding->IInternetBindInfo_iface, PI_APARTMENTTHREADED|PI_MIMEVERIFICATION, 0); TRACE("start ret %08x\n", hres); if(FAILED(hres) && hres != E_PENDING) { stop_binding(binding, hres, NULL); IBinding_Release(&binding->IBinding_iface); return hres; } } while(!(binding->bindf & BINDF_ASYNCHRONOUS) && !(binding->state & BINDING_STOPPED)) { MsgWaitForMultipleObjects(0, NULL, FALSE, 5000, QS_POSTMESSAGE); while (PeekMessageW(&msg, binding->notif_hwnd, WM_USER, WM_USER+117, PM_REMOVE|PM_NOYIELD)) { TranslateMessage(&msg); DispatchMessageW(&msg); } } *ret = binding; return S_OK; }
static void create_object(Binding *binding) { LPWSTR clsid_str; CLSID clsid; HRESULT hres; if(!binding->mime) { FIXME("MIME not available\n"); return; } if(!(clsid_str = get_mime_clsid(binding->mime, &clsid))) { FIXME("Could not find object for MIME %s\n", debugstr_w(binding->mime)); return; } IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_CLASSIDAVAILABLE, clsid_str); IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_BEGINSYNCOPERATION, NULL); hres = create_mime_object(binding, &clsid, clsid_str); heap_free(clsid_str); IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_ENDSYNCOPERATION, NULL); stop_binding(binding, hres, NULL); if(FAILED(hres)) IInternetProtocol_Terminate(binding->protocol, 0); }
static HRESULT WINAPI InternetProtocolSink_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult) { Binding *This = PROTSINK_THIS(iface); TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); stop_binding(This, hrResult, szResult); IInternetProtocol_Terminate(This->protocol, 0); return S_OK; }
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); } }