Module: wine Branch: master Commit: 2eb2d74052f32d1fffa0c651b3a837447c3fbba6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2eb2d74052f32d1fffa0c651b3...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Feb 7 17:29:52 2007 +0100
urlmon: Use queue for whole ReportData implementation.
---
dlls/urlmon/binding.c | 71 +++++++++++++++++++++++++++--------------------- 1 files changed, 40 insertions(+), 31 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c index b0eb9a8..8bc954d 100644 --- a/dlls/urlmon/binding.c +++ b/dlls/urlmon/binding.c @@ -812,26 +812,61 @@ static HRESULT WINAPI InternetProtocolSi return S_OK; }
-static void report_data(Binding *This, DWORD bscf) +static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progress_max) { FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM};
+ TRACE("(%p)->(%d %u %u)\n", This, bscf, progress, progress_max); + + if(GetCurrentThreadId() != This->apartment_thread) + FIXME("called from worked hread\n"); + + if(!This->verified_mime) { + LPWSTR mime; + + This->verified_mime = TRUE; + + fill_stream_buffer(This->stream); + + FindMimeFromData(NULL, This->url, This->stream->buf, + min(This->stream->buf_size, 255), This->mime, 0, &mime, 0); + + on_progress(This, progress, progress_max, BINDSTATUS_MIMETYPEAVAILABLE, mime); + } + + if(bscf & BSCF_FIRSTDATANOTIFICATION) { + on_progress(This, progress, progress_max, BINDSTATUS_BEGINDOWNLOADDATA, This->url); + } + + if(bscf & BSCF_LASTDATANOTIFICATION) + on_progress(This, progress, progress_max, BINDSTATUS_ENDDOWNLOADDATA, This->url); + + if(!This->request_locked) { + HRESULT hres = IInternetProtocol_LockRequest(This->protocol, 0); + This->request_locked = SUCCEEDED(hres); + } + fill_stream_buffer(This->stream);
IBindStatusCallback_OnDataAvailable(This->callback, bscf, This->stream->buf_size, &formatetc, &This->stgmed); + + if(bscf & BSCF_LASTDATANOTIFICATION) + IBindStatusCallback_OnStopBinding(This->callback, S_OK, NULL); }
typedef struct { task_header_t header; DWORD bscf; + ULONG progress; + ULONG progress_max; } report_data_task_t;
static void report_data_proc(Binding *binding, task_header_t *t) { report_data_task_t *task = (report_data_task_t*)t;
- report_data(binding, task->bscf); + report_data(binding, task->bscf, task->progress, task->progress_max);
HeapFree(GetProcessHeap(), 0, task); } @@ -846,43 +881,17 @@ static HRESULT WINAPI InternetProtocolSi if(GetCurrentThreadId() != This->apartment_thread) FIXME("called from worked hread\n");
- if(!This->verified_mime) { - LPWSTR mime; - - This->verified_mime = TRUE; - - fill_stream_buffer(This->stream); - - FindMimeFromData(NULL, This->url, This->stream->buf, - min(This->stream->buf_size, 255), This->mime, 0, &mime, 0); - - on_progress(This, ulProgress, ulProgressMax, BINDSTATUS_MIMETYPEAVAILABLE, mime); - } - - if(grfBSCF & BSCF_FIRSTDATANOTIFICATION) { - on_progress(This, ulProgress, ulProgressMax, BINDSTATUS_BEGINDOWNLOADDATA, This->url); - } - - if(grfBSCF & BSCF_LASTDATANOTIFICATION) - on_progress(This, ulProgress, ulProgressMax, BINDSTATUS_ENDDOWNLOADDATA, This->url); - - if(!This->request_locked) { - HRESULT hres = IInternetProtocol_LockRequest(This->protocol, 0); - This->request_locked = SUCCEEDED(hres); - } - if(This->continue_call) { report_data_task_t *task = HeapAlloc(GetProcessHeap(), 0, sizeof(report_data_task_t)); task->bscf = grfBSCF; + task->progress = ulProgress; + task->progress_max = ulProgressMax;
push_task(This, &task->header, report_data_proc); }else { - report_data(This, grfBSCF); + report_data(This, grfBSCF, ulProgress, ulProgressMax); }
- if(grfBSCF & BSCF_LASTDATANOTIFICATION) - IBindStatusCallback_OnStopBinding(This->callback, S_OK, NULL); - return S_OK; }