Jacek Caban : shdocvw: Use task destructors for releasing task params.

Alexandre Julliard julliard at winehq.org
Thu May 26 10:56:28 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 26 17:01:31 2011 +0200

shdocvw: Use task destructors for releasing task params.

---

 dlls/shdocvw/dochost.c  |   27 ++++++++++++++++++-----
 dlls/shdocvw/navigate.c |   54 ++++++++++++++++++++++++++++++----------------
 dlls/shdocvw/shdocvw.h  |    4 ++-
 3 files changed, 59 insertions(+), 26 deletions(-)

diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c
index 301ea32..6d6c1e6 100644
--- a/dlls/shdocvw/dochost.c
+++ b/dlls/shdocvw/dochost.c
@@ -31,9 +31,10 @@ DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
 
 static ATOM doc_view_atom = 0;
 
-void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, BOOL send)
+void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, task_destr_t destr, BOOL send)
 {
     task->proc = proc;
+    task->destr = destr;
 
     /* FIXME: Don't use lParam */
     if(send)
@@ -48,7 +49,10 @@ LRESULT process_dochost_task(DocHost *This, LPARAM lparam)
 
     task->proc(This, task);
 
-    heap_free(task);
+    if(task->destr)
+        task->destr(task);
+    else
+        heap_free(task);
     return 0;
 }
 
@@ -185,14 +189,20 @@ typedef struct {
     READYSTATE ready_state;
 } ready_state_task_t;
 
+static void ready_state_task_destr(task_header_t *_task)
+{
+    ready_state_task_t *task = (ready_state_task_t*)_task;
+
+    IUnknown_Release(task->doc);
+    heap_free(task);
+}
+
 static void ready_state_proc(DocHost *This, task_header_t *_task)
 {
     ready_state_task_t *task = (ready_state_task_t*)_task;
 
     if(task->doc == This->document)
         update_ready_state(This, task->ready_state);
-
-    IUnknown_Release(task->doc);
 }
 
 static void push_ready_state_task(DocHost *This, READYSTATE ready_state)
@@ -203,7 +213,12 @@ static void push_ready_state_task(DocHost *This, READYSTATE ready_state)
     task->doc = This->document;
     task->ready_state = ready_state;
 
-    push_dochost_task(This, &task->header, ready_state_proc, FALSE);
+    push_dochost_task(This, &task->header, ready_state_proc, ready_state_task_destr, FALSE);
+}
+
+static void object_available_task_destr(task_header_t *task)
+{
+    heap_free(task);
 }
 
 static void object_available_proc(DocHost *This, task_header_t *task)
@@ -242,7 +257,7 @@ HRESULT dochost_object_available(DocHost *This, IUnknown *doc)
     /* FIXME: Call SetAdvise */
 
     task = heap_alloc(sizeof(*task));
-    push_dochost_task(This, task, object_available_proc, FALSE);
+    push_dochost_task(This, task, object_available_proc, object_available_task_destr, FALSE);
 
     hres = get_doc_ready_state(This, &ready_state);
     if(SUCCEEDED(hres)) {
diff --git a/dlls/shdocvw/navigate.c b/dlls/shdocvw/navigate.c
index 6b78870..32af0f1 100644
--- a/dlls/shdocvw/navigate.c
+++ b/dlls/shdocvw/navigate.c
@@ -674,15 +674,15 @@ typedef struct {
     BOOL async_notif;
 } task_doc_navigate_t;
 
-static HRESULT free_doc_navigate_task(task_doc_navigate_t *task, BOOL free_task)
+static void doc_navigate_task_destr(task_header_t *t)
 {
+    task_doc_navigate_t *task = (task_doc_navigate_t*)t;
+
     SysFreeString(task->url);
     SysFreeString(task->headers);
     if(task->post_data)
         SafeArrayDestroy(task->post_data);
-    if(free_task)
-        heap_free(task);
-    return E_OUTOFMEMORY;
+    heap_free(task);
 }
 
 static void doc_navigate_proc(DocHost *This, task_header_t *t)
@@ -691,15 +691,16 @@ static void doc_navigate_proc(DocHost *This, task_header_t *t)
     IHTMLPrivateWindow *priv_window;
     HRESULT hres;
 
-    if(!This->doc_navigate)
+    if(!This->doc_navigate) {
+        ERR("Skip nav\n");
         return;
+    }
 
     if(task->async_notif) {
         VARIANT_BOOL cancel = VARIANT_FALSE;
         on_before_navigate2(This, task->url, task->post_data, task->headers, &cancel);
         if(cancel) {
             TRACE("Navigation calnceled\n");
-            free_doc_navigate_task(task, FALSE);
             return;
         }
     }
@@ -711,8 +712,6 @@ static void doc_navigate_proc(DocHost *This, task_header_t *t)
     }else {
         WARN("Could not get IHTMLPrivateWindow iface: %08x\n", hres);
     }
-
-    free_doc_navigate_task(task, FALSE);
 }
 
 static HRESULT async_doc_navigate(DocHost *This, LPCWSTR url, LPCWSTR headers, PBYTE post_data, ULONG post_data_size,
@@ -720,24 +719,33 @@ static HRESULT async_doc_navigate(DocHost *This, LPCWSTR url, LPCWSTR headers, P
 {
     task_doc_navigate_t *task;
 
+    TRACE("%s\n", debugstr_w(url));
+
     task = heap_alloc_zero(sizeof(*task));
     if(!task)
         return E_OUTOFMEMORY;
 
     task->url = SysAllocString(url);
-    if(!task->url)
-        return free_doc_navigate_task(task, TRUE);
+    if(!task->url) {
+        doc_navigate_task_destr(&task->header);
+        return E_OUTOFMEMORY;
+    }
 
     if(headers) {
         task->headers = SysAllocString(headers);
-        if(!task->headers)
-            return free_doc_navigate_task(task, TRUE);
+        if(!task->headers) {
+            doc_navigate_task_destr(&task->header);
+            return E_OUTOFMEMORY;
+        }
     }
 
     if(post_data) {
         task->post_data = SafeArrayCreateVector(VT_UI1, 0, post_data_size);
-        if(!task->post_data)
-            return free_doc_navigate_task(task, TRUE);
+        if(!task->post_data) {
+            doc_navigate_task_destr(&task->header);
+            return E_OUTOFMEMORY;
+        }
+
         memcpy(task->post_data->pvData, post_data, post_data_size);
     }
 
@@ -747,13 +755,13 @@ static HRESULT async_doc_navigate(DocHost *This, LPCWSTR url, LPCWSTR headers, P
         on_before_navigate2(This, task->url, task->post_data, task->headers, &cancel);
         if(cancel) {
             TRACE("Navigation calnceled\n");
-            free_doc_navigate_task(task, TRUE);
+            doc_navigate_task_destr(&task->header);
             return S_OK;
         }
     }
 
     task->async_notif = async_notif;
-    push_dochost_task(This, &task->header, doc_navigate_proc, FALSE);
+    push_dochost_task(This, &task->header, doc_navigate_proc, doc_navigate_task_destr, FALSE);
     return S_OK;
 }
 
@@ -802,6 +810,14 @@ typedef struct {
     BindStatusCallback *bsc;
 } task_navigate_bsc_t;
 
+static void navigate_bsc_task_destr(task_header_t *t)
+{
+    task_navigate_bsc_t *task = (task_navigate_bsc_t*)t;
+
+    IBindStatusCallback_Release(&task->bsc->IBindStatusCallback_iface);
+    heap_free(task);
+}
+
 static void navigate_bsc_proc(DocHost *This, task_header_t *t)
 {
     task_navigate_bsc_t *task = (task_navigate_bsc_t*)t;
@@ -810,8 +826,6 @@ static void navigate_bsc_proc(DocHost *This, task_header_t *t)
         create_doc_view_hwnd(This);
 
     navigate_bsc(This, task->bsc, NULL);
-
-    IBindStatusCallback_Release(&task->bsc->IBindStatusCallback_iface);
 }
 
 
@@ -868,7 +882,7 @@ HRESULT navigate_url(DocHost *This, LPCWSTR url, const VARIANT *Flags,
 
         task = heap_alloc(sizeof(*task));
         task->bsc = create_callback(This, url, post_data, post_data_len, headers);
-        push_dochost_task(This, &task->header, navigate_bsc_proc, This->url == NULL);
+        push_dochost_task(This, &task->header, navigate_bsc_proc, navigate_bsc_task_destr, This->url == NULL);
     }
 
     if(post_data)
@@ -889,6 +903,8 @@ static HRESULT navigate_hlink(DocHost *This, IMoniker *mon, IBindCtx *bindctx,
     DWORD bindf = 0;
     HRESULT hres;
 
+    TRACE("\n");
+
     hres = IMoniker_GetDisplayName(mon, 0, NULL, &url);
     if(FAILED(hres))
         FIXME("GetDisplayName failed: %08x\n", hres);
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
index fd234d8..118dafb 100644
--- a/dlls/shdocvw/shdocvw.h
+++ b/dlls/shdocvw/shdocvw.h
@@ -80,9 +80,11 @@ typedef struct {
 struct _task_header_t;
 
 typedef void (*task_proc_t)(DocHost*, struct _task_header_t*);
+typedef void (*task_destr_t)(struct _task_header_t*);
 
 typedef struct _task_header_t {
     task_proc_t proc;
+    task_destr_t destr;
 } task_header_t;
 
 typedef struct _IDocHostContainerVtbl
@@ -244,7 +246,7 @@ HRESULT get_location_url(DocHost*,BSTR*) DECLSPEC_HIDDEN;
 void handle_navigation_error(DocHost*,HRESULT,BSTR,IHTMLWindow2*) DECLSPEC_HIDDEN;
 
 #define WM_DOCHOSTTASK (WM_USER+0x300)
-void push_dochost_task(DocHost*,task_header_t*,task_proc_t,BOOL) DECLSPEC_HIDDEN;
+void push_dochost_task(DocHost*,task_header_t*,task_proc_t,task_destr_t,BOOL) DECLSPEC_HIDDEN;
 LRESULT  process_dochost_task(DocHost*,LPARAM) DECLSPEC_HIDDEN;
 
 HRESULT InternetExplorer_Create(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list