Jacek Caban : urlmon: Use queue for whole ReportData implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 7 16:00:23 CST 2007


Module: wine
Branch: master
Commit: 2eb2d74052f32d1fffa0c651b3a837447c3fbba6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2eb2d74052f32d1fffa0c651b3a837447c3fbba6

Author: Jacek Caban <jacek at 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;
 }
 




More information about the wine-cvs mailing list