Jacek Caban : mshtml: Add SETDOWNLOADSTATE task implementation and use it in IPersistMoniker:: Load.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Sep 25 14:45:40 CDT 2006


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Sep 24 23:12:06 2006 +0200

mshtml: Add SETDOWNLOADSTATE task implementation and use it in IPersistMoniker::Load.

---

 dlls/mshtml/htmldoc.c        |    2 +
 dlls/mshtml/mshtml_private.h |   15 ++++++
 dlls/mshtml/persist.c        |    9 +++
 dlls/mshtml/task.c           |  110 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 136 insertions(+), 0 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 066e87d..52c2c20 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -143,6 +143,8 @@ static ULONG WINAPI HTMLDocument_Release
     TRACE("(%p) ref = %lu\n", This, ref);
 
     if(!ref) {
+        remove_doc_tasks(This);
+
         if(This->client)
             IOleObject_SetClientSite(OLEOBJ(This), NULL);
         if(This->in_place_active)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 75d132c..6cb6ce4 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -340,12 +340,27 @@ void install_wine_gecko(void);
 
 extern DWORD mshtml_tls;
 
+typedef struct task_t {
+    HTMLDocument *doc;
+
+    enum {
+        TASK_SETDOWNLOADSTATE,
+        TASK_PARSECOMPLETE
+    } task_id;
+
+    struct task_t *next;
+} task_t;
+
 typedef struct {
     HWND thread_hwnd;
+    task_t *task_queue_head;
+    task_t *task_queue_tail;
 } thread_data_t;
 
 thread_data_t *get_thread_data(BOOL);
 HWND get_thread_hwnd(void);
+void push_task(task_t*);
+void remove_doc_tasks(HTMLDocument*);
 
 DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
 DEFINE_GUID(CLSID_JSProtocol, 0x3050F3B2, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 15af135..c9baf7c 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -156,6 +156,7 @@ static HRESULT WINAPI PersistMoniker_Loa
     HTMLDocument *This = PERSISTMON_THIS(iface);
     BSCallback *bscallback;
     LPOLESTR url = NULL;
+    task_t *task;
     HRESULT hres;
     nsresult nsres;
 
@@ -219,6 +220,14 @@ static HRESULT WINAPI PersistMoniker_Loa
 
     bscallback = create_bscallback(This, pimkName);
 
+    task = mshtml_alloc(sizeof(task_t));
+
+    task->doc = This;
+    task->task_id = TASK_SETDOWNLOADSTATE;
+    task->next = NULL;
+
+    push_task(task);
+
     if(This->nscontainer) {
         nsIInputStream *post_data_stream = get_post_data_stream(pibc);
 
diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c
index 0619cd1..6af1cda 100644
--- a/dlls/mshtml/task.c
+++ b/dlls/mshtml/task.c
@@ -37,8 +37,118 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
 #define WM_PROCESSTASK 0x8008
 
+void push_task(task_t *task)
+{
+    thread_data_t *thread_data = get_thread_data(TRUE);
+
+    if(thread_data->task_queue_tail)
+        thread_data->task_queue_tail->next = task;
+    else
+        thread_data->task_queue_head = task;
+
+    thread_data->task_queue_tail = task;
+
+    PostMessageW(thread_data->thread_hwnd, WM_PROCESSTASK, 0, 0);
+}
+
+static task_t *pop_task(void)
+{
+    thread_data_t *thread_data = get_thread_data(TRUE);
+    task_t *task = thread_data->task_queue_head;
+
+    if(!task)
+        return NULL;
+
+    thread_data->task_queue_head = task->next;
+    if(!thread_data->task_queue_head)
+        thread_data->task_queue_tail = NULL;
+
+    return task;
+}
+
+void remove_doc_tasks(HTMLDocument *doc)
+{
+    thread_data_t *thread_data = get_thread_data(FALSE);
+    task_t *iter, *tmp;
+
+    while(thread_data->task_queue_head
+          && thread_data->task_queue_head->doc == doc)
+        pop_task();
+
+    for(iter = thread_data->task_queue_head; iter; iter = iter->next) {
+        while(iter->next && iter->next->doc == doc) {
+            tmp = iter->next;
+            iter->next = tmp->next;
+            mshtml_free(tmp);
+        }
+
+        if(!iter->next)
+            thread_data->task_queue_tail = iter;
+    }
+}
+
+static void set_downloading(HTMLDocument *doc)
+{
+    IOleCommandTarget *olecmd;
+    HRESULT hres;
+
+    TRACE("(%p)\n", doc);
+
+    if(doc->frame) 
+        IOleInPlaceFrame_SetStatusText(doc->frame, NULL /* FIXME */);
+
+    if(!doc->client)
+        return;
+
+    hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
+    if(SUCCEEDED(hres)) {
+        VARIANT var;
+
+        V_VT(&var) = VT_I4;
+        V_I4(&var) = 1;
+
+        IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER,
+                               &var, NULL);
+        IOleCommandTarget_Release(olecmd);
+    }
+
+    if(doc->hostui) {
+        IDropTarget *drop_target = NULL;
+
+        hres = IDocHostUIHandler_GetDropTarget(doc->hostui, NULL /* FIXME */, &drop_target);
+        if(drop_target) {
+            FIXME("Use IDropTarget\n");
+            IDropTarget_Release(drop_target);
+        }
+    }
+}
+
+static void process_task(task_t *task)
+{
+    switch(task->task_id) {
+    case TASK_SETDOWNLOADSTATE:
+        return set_downloading(task->doc);
+    default:
+        ERR("Wrong task_id %d\n", task->task_id);
+    }
+}
+
 static LRESULT WINAPI hidden_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
+    switch(msg) {
+    case WM_PROCESSTASK:
+        while(1) {
+            task_t *task = pop_task();
+            if(!task)
+                break;
+
+            process_task(task);
+            mshtml_free(task);
+        }
+
+        return 0;
+    }
+
     if(msg > WM_USER)
         FIXME("(%p %d %x %lx)\n", hwnd, msg, wParam, lParam);
 




More information about the wine-cvs mailing list