#include "winbase.h"
#include "winuser.h"
#include "ole2.h"
-#include "mshtmcid.h"
-#include "shlguid.h"
#include "wine/debug.h"
struct list entry;
} task_timer_t;
-void push_task(task_t *task)
+void push_task(task_t *task, task_proc_t proc, LONG magic)
{
thread_data_t *thread_data = get_thread_data(TRUE);
+ task->target_magic = magic;
+ task->proc = proc;
+ task->next = NULL;
+
if(thread_data->task_queue_tail)
thread_data->task_queue_tail->next = task;
else
heap_free(timer);
}
-void remove_doc_tasks(const HTMLDocument *doc)
+void remove_target_tasks(LONG target)
{
thread_data_t *thread_data = get_thread_data(FALSE);
struct list *liter, *ltmp;
LIST_FOR_EACH_SAFE(liter, ltmp, &thread_data->timer_list) {
timer = LIST_ENTRY(liter, task_timer_t, entry);
- if(timer->doc == doc)
+ if(timer->doc->task_magic == target)
release_task_timer(thread_data->thread_hwnd, timer);
}
}
while(thread_data->task_queue_head
- && thread_data->task_queue_head->doc == doc)
+ && thread_data->task_queue_head->target_magic == target)
pop_task();
for(iter = thread_data->task_queue_head; iter; iter = iter->next) {
- while(iter->next && iter->next->doc == doc) {
+ while(iter->next && iter->next->target_magic == target) {
tmp = iter->next;
iter->next = tmp->next;
heap_free(tmp);
}
}
+LONG get_task_target_magic(void)
+{
+ static LONG magic = 0x10000000;
+ return InterlockedIncrement(&magic);
+}
+
static BOOL queue_timer(thread_data_t *thread_data, task_timer_t *timer)
{
task_timer_t *iter;
return S_OK;
}
-static void set_downloading(HTMLDocumentObj *doc)
+void parse_complete(HTMLDocumentObj *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);
- }
- }
-}
-
-/* Calls undocumented 69 cmd of CGID_Explorer */
-static void call_explorer_69(HTMLDocumentObj *doc)
-{
- IOleCommandTarget *olecmd;
- VARIANT var;
- HRESULT hres;
-
- if(!doc->client)
- return;
-
- hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
- if(FAILED(hres))
- return;
-
- VariantInit(&var);
- hres = IOleCommandTarget_Exec(olecmd, &CGID_Explorer, 69, 0, NULL, &var);
- IOleCommandTarget_Release(olecmd);
- if(SUCCEEDED(hres) && V_VT(&var) != VT_NULL)
- FIXME("handle result\n");
-}
-
-static void set_parsecomplete(HTMLDocument *doc)
-{
- IOleCommandTarget *olecmd = NULL;
-
- TRACE("(%p)\n", doc);
-
- if(doc->doc_obj->usermode == EDITMODE)
- init_editor(doc);
-
- call_explorer_69(doc->doc_obj);
- call_property_onchanged(&doc->cp_propnotif, 1005);
- call_explorer_69(doc->doc_obj);
-
- /* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */
-
- doc->doc_obj->readystate = READYSTATE_INTERACTIVE;
- call_property_onchanged(&doc->cp_propnotif, DISPID_READYSTATE);
-
- if(doc->doc_obj->client)
- IOleClientSite_QueryInterface(doc->doc_obj->client, &IID_IOleCommandTarget, (void**)&olecmd);
-
- if(olecmd) {
- VARIANT state, progress;
-
- V_VT(&progress) = VT_I4;
- V_I4(&progress) = 0;
- IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
- &progress, NULL);
-
- V_VT(&state) = VT_I4;
- V_I4(&state) = 0;
- IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER,
- &state, NULL);
-
- IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 103, 0, NULL, NULL);
- IOleCommandTarget_Exec(olecmd, &CGID_MSHTML, IDM_PARSECOMPLETE, 0, NULL, NULL);
- IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_HTTPEQUIV_DONE, 0, NULL, NULL);
-
- IOleCommandTarget_Release(olecmd);
- }
-
- doc->doc_obj->readystate = READYSTATE_COMPLETE;
- call_property_onchanged(&doc->cp_propnotif, DISPID_READYSTATE);
-
- if(doc->doc_obj->frame) {
- static const WCHAR wszDone[] = {'D','o','n','e',0};
- IOleInPlaceFrame_SetStatusText(doc->doc_obj->frame, wszDone);
- }
-
- update_title(doc->doc_obj);
-}
-
-static void set_progress(HTMLDocument *doc)
-{
- IOleCommandTarget *olecmd = NULL;
- HRESULT hres;
-
- TRACE("(%p)\n", doc);
-
- if(doc->doc_obj->client)
- IOleClientSite_QueryInterface(doc->doc_obj->client, &IID_IOleCommandTarget, (void**)&olecmd);
-
- if(olecmd) {
- VARIANT progress_max, progress;
-
- V_VT(&progress_max) = VT_I4;
- V_I4(&progress_max) = 0; /* FIXME */
- IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER,
- &progress_max, NULL);
-
- V_VT(&progress) = VT_I4;
- V_I4(&progress) = 0; /* FIXME */
- IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
- &progress, NULL);
- }
-
- if(doc->doc_obj->usermode == EDITMODE && doc->doc_obj->hostui) {
- DOCHOSTUIINFO hostinfo;
-
- memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
- hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
- hres = IDocHostUIHandler_GetHostInfo(doc->doc_obj->hostui, &hostinfo);
- if(SUCCEEDED(hres))
- /* FIXME: use hostinfo */
- TRACE("hostinfo = {%u %08x %08x %s %s}\n",
- hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
- debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
- }
-}
-
-static void task_start_binding(HTMLDocument *doc, BSCallback *bscallback)
-{
- if(doc)
- start_binding(doc, bscallback, NULL);
- IUnknown_Release((IUnknown*)bscallback);
-}
-
-static void process_task(task_t *task)
-{
- switch(task->task_id) {
- case TASK_SETDOWNLOADSTATE:
- set_downloading(task->doc->doc_obj);
- break;
- case TASK_PARSECOMPLETE:
- set_parsecomplete(task->doc);
- break;
- case TASK_SETPROGRESS:
- set_progress(task->doc);
- break;
- case TASK_START_BINDING:
- task_start_binding(task->doc, (BSCallback*)task->bscallback);
- break;
- default:
- ERR("Wrong task_id %d\n", task->task_id);
- }
}
static void call_timer_disp(IDispatch *disp)
if(!task)
break;
- process_task(task);
+ task->proc(task);
heap_free(task);
}