static void report_progress(BindProtocol *This, ULONG status_code, LPCWSTR status_text) { switch(status_code) { case BINDSTATUS_FINDINGRESOURCE: case BINDSTATUS_CONNECTING: case BINDSTATUS_REDIRECTING: case BINDSTATUS_BEGINDOWNLOADDATA: case BINDSTATUS_SENDINGREQUEST: case BINDSTATUS_CACHEFILENAMEAVAILABLE: case BINDSTATUS_DIRECTBIND: case BINDSTATUS_ACCEPTRANGES: if(This->protocol_sink) IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text); break; case BINDSTATUS_MIMETYPEAVAILABLE: mime_available(This, status_text, FALSE); break; case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: mime_available(This, status_text, TRUE); break; default: FIXME("unsupported ulStatusCode %u\n", status_code); } }
static HRESULT report_data(BindProtocol *This, DWORD bscf, ULONG progress, ULONG progress_max) { if(!This->protocol_sink) return S_OK; if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) { BYTE buf[BUFFER_SIZE]; DWORD read = 0; LPWSTR mime; HRESULT hres; do { read = 0; hres = IInternetProtocol_Read(This->protocol, buf, sizeof(buf)-This->buf_size, &read); if(FAILED(hres) && hres != E_PENDING) return hres; if(!This->buf) { This->buf = heap_alloc(BUFFER_SIZE); if(!This->buf) return E_OUTOFMEMORY; }else if(read + This->buf_size > BUFFER_SIZE) { BYTE *tmp; tmp = heap_realloc(This->buf, read+This->buf_size); if(!tmp) return E_OUTOFMEMORY; This->buf = tmp; } memcpy(This->buf+This->buf_size, buf, read); This->buf_size += read; }while(This->buf_size < MIME_TEST_SIZE && hres == S_OK); if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE) return S_OK; bscf = BSCF_FIRSTDATANOTIFICATION; if(hres == S_FALSE) bscf |= BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE; if(!This->reported_mime) { hres = FindMimeFromData(NULL, This->url, This->buf, min(This->buf_size, MIME_TEST_SIZE), This->mime, 0, &mime, 0); if(FAILED(hres)) return hres; mime_available(This, mime, TRUE); CoTaskMemFree(mime); } } if(!This->protocol_sink) return S_OK; return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max); }
static HRESULT WINAPI ProtocolSinkHandler_ReportProgress(IInternetProtocolSink *iface, ULONG status_code, LPCWSTR status_text) { BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(status_code), debugstr_w(status_text)); if(!This->protocol_sink) return S_OK; switch(status_code) { case BINDSTATUS_FINDINGRESOURCE: case BINDSTATUS_CONNECTING: case BINDSTATUS_REDIRECTING: case BINDSTATUS_SENDINGREQUEST: case BINDSTATUS_CACHEFILENAMEAVAILABLE: case BINDSTATUS_DIRECTBIND: case BINDSTATUS_ACCEPTRANGES: case BINDSTATUS_DECODING: IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text); break; case BINDSTATUS_BEGINDOWNLOADDATA: IInternetProtocolSink_ReportData(This->protocol_sink, This->bscf, This->progress, This->progress_max); break; case BINDSTATUS_MIMETYPEAVAILABLE: mime_available(This, status_text, FALSE); break; case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: mime_available(This, status_text, TRUE); break; default: FIXME("unsupported ulStatusCode %u\n", status_code); } return S_OK; }
static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText) { Binding *This = PROTSINK_THIS(iface); TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); switch(ulStatusCode) { case BINDSTATUS_FINDINGRESOURCE: on_progress(This, 0, 0, BINDSTATUS_FINDINGRESOURCE, szStatusText); break; case BINDSTATUS_CONNECTING: on_progress(This, 0, 0, BINDSTATUS_CONNECTING, szStatusText); break; case BINDSTATUS_REDIRECTING: heap_free(This->redirect_url); This->redirect_url = heap_strdupW(szStatusText); on_progress(This, 0, 0, BINDSTATUS_REDIRECTING, szStatusText); break; case BINDSTATUS_BEGINDOWNLOADDATA: fill_stgmed_buffer(This->stgmed_buf); break; case BINDSTATUS_SENDINGREQUEST: on_progress(This, 0, 0, BINDSTATUS_SENDINGREQUEST, szStatusText); break; case BINDSTATUS_PROTOCOLCLASSID: break; case BINDSTATUS_MIMETYPEAVAILABLE: case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: mime_available(This, szStatusText); break; case BINDSTATUS_CACHEFILENAMEAVAILABLE: cache_file_available(This, szStatusText); break; case BINDSTATUS_DECODING: IBindStatusCallback_OnProgress(This->callback, 0, 0, BINDSTATUS_DECODING, szStatusText); break; case BINDSTATUS_LOADINGMIMEHANDLER: on_progress(This, 0, 0, BINDSTATUS_LOADINGMIMEHANDLER, szStatusText); break; case BINDSTATUS_DIRECTBIND: /* FIXME: Handle BINDSTATUS_DIRECTBIND in BindProtocol */ This->report_mime = FALSE; break; case BINDSTATUS_ACCEPTRANGES: break; default: FIXME("Unhandled status code %d\n", ulStatusCode); return E_NOTIMPL; }; return S_OK; }