static inline HRESULT report_data(BindStatusCallback *This) { FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM}; STGMEDIUM stgmedium; LARGE_INTEGER off; ULARGE_INTEGER size; HRESULT hres; off.QuadPart = 0; hres = IStream_Seek(This->stream, off, STREAM_SEEK_CUR, &size); if(FAILED(hres)) return hres; hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL); if(FAILED(hres)) return hres; stgmedium.tymed = TYMED_ISTREAM; stgmedium.u.pstm = This->stream; stgmedium.pUnkForRelease = NULL; hres = IBindStatusCallback_OnDataAvailable(This->bsc, BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION, size.u.LowPart, &formatetc, &stgmedium); IStream_Release(This->stream); This->stream = NULL; return hres; }
static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallbackEx *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) { BindStatusCallback *This = impl_from_IBindStatusCallbackEx(iface); TRACE("(%p)->(%08x %d %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed); return IBindStatusCallback_OnDataAvailable(This->callback, grfBSCF, dwSize, pformatetc, pstgmed); }
static HRESULT WINAPI ProxyBindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed) { ProxyBindStatusCallback *This = (ProxyBindStatusCallback *)iface; if(This->pBSC) return IBindStatusCallback_OnDataAvailable(This->pBSC, grfBSCF, dwSize, pformatetc, pstgmed); return S_OK; }
static HRESULT Binding_MoreCacheData(Binding *This, const char *buf, DWORD dwBytes) { DWORD written; if (WriteFile(This->hCacheFile, buf, dwBytes, &written, NULL) && written == dwBytes) { HRESULT hr; This->total_read += written; hr = IBindStatusCallback_OnProgress(This->pbscb, This->total_read + written, This->expected_size, (This->total_read == written) ? BINDSTATUS_BEGINDOWNLOADDATA : BINDSTATUS_DOWNLOADINGDATA, This->URLName); if (hr == S_OK) { STGMEDIUM stg; FORMATETC fmt; fmt.cfFormat = 0; fmt.ptd = NULL; fmt.dwAspect = 0; fmt.lindex = -1; fmt.tymed = TYMED_ISTREAM; stg.tymed = TYMED_ISTREAM; stg.u.pstm = (IStream *)This->pstrCache; stg.pUnkForRelease = NULL; hr = IBindStatusCallback_OnDataAvailable(This->pbscb, (This->total_read == written) ? BSCF_FIRSTDATANOTIFICATION : BSCF_INTERMEDIATEDATANOTIFICATION, This->total_read + written, &fmt, &stg); } if (written < dwBytes) return STG_E_MEDIUMFULL; else return hr; } return HRESULT_FROM_WIN32(GetLastError()); }
static void Binding_FinishedDownload(Binding *This, HRESULT hr) { STGMEDIUM stg; FORMATETC fmt; fmt.ptd = NULL; fmt.dwAspect = 0; fmt.lindex = -1; fmt.tymed = TYMED_ISTREAM; stg.tymed = TYMED_ISTREAM; stg.u.pstm = (IStream *)This->pstrCache; stg.pUnkForRelease = NULL; IBindStatusCallback_OnProgress(This->pbscb, This->total_read, This->expected_size, BINDSTATUS_ENDDOWNLOADDATA, This->URLName); IBindStatusCallback_OnDataAvailable(This->pbscb, BSCF_LASTDATANOTIFICATION, This->total_read, &fmt, &stg); if (hr != S_OK) { WCHAR *pwchError = 0; FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, (DWORD) hr, 0, (LPWSTR) &pwchError, 0, NULL); if (!pwchError) { static const WCHAR achFormat[] = { '%', '0', '8', 'x', 0 }; pwchError =(WCHAR *) LocalAlloc(LMEM_FIXED, sizeof(WCHAR) * 9); wsprintfW(pwchError, achFormat, hr); } IBindStatusCallback_OnStopBinding(This->pbscb, hr, pwchError); LocalFree(pwchError); } else { IBindStatusCallback_OnStopBinding(This->pbscb, hr, NULL); } IBindStatusCallback_Release(This->pbscb); This->pbscb = 0; }
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); } }