Jacek Caban : shdocvw: Store DocHost in BindStatusCallback.

Alexandre Julliard julliard at winehq.org
Fri Jan 4 07:12:36 CST 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jan  3 16:36:04 2008 +0100

shdocvw: Store DocHost in BindStatusCallback.

---

 dlls/shdocvw/navigate.c |   25 ++++++++++++++++++++-----
 1 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/dlls/shdocvw/navigate.c b/dlls/shdocvw/navigate.c
index ecb6727..e932b77 100644
--- a/dlls/shdocvw/navigate.c
+++ b/dlls/shdocvw/navigate.c
@@ -36,6 +36,8 @@ typedef struct {
 
     LONG ref;
 
+    DocHost *doc_host;
+
     HGLOBAL post_data;
     LPWSTR headers;
     ULONG post_data_len;
@@ -135,6 +137,8 @@ static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
     TRACE("(%p) ref=%d\n", This, ref);
 
     if(!ref) {
+        if(This->doc_host)
+            IOleClientSite_Release(CLIENTSITE(This->doc_host));
         if(This->post_data)
             GlobalFree(This->post_data);
         heap_free(This->headers);
@@ -181,7 +185,14 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac
         HRESULT hresult, LPCWSTR szError)
 {
     BindStatusCallback *This = BINDSC_THIS(iface);
+
     FIXME("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError));
+
+    if(This->doc_host) {
+        IOleClientSite_Release(CLIENTSITE(This->doc_host));
+        This->doc_host = NULL;
+    }
+
     return E_NOTIMPL;
 }
 
@@ -299,8 +310,8 @@ static const IHttpNegotiateVtbl HttpNegotiateVtbl = {
     HttpNegotiate_OnResponse
 };
 
-static IBindStatusCallback *create_callback(DocHost *This, PBYTE post_data,
-        ULONG post_data_len, LPWSTR headers, VARIANT_BOOL *cancel)
+static IBindStatusCallback *create_callback(DocHost *doc_host, PBYTE post_data,
+        ULONG post_data_len, LPWSTR headers)
 {
     BindStatusCallback *ret = heap_alloc(sizeof(BindStatusCallback));
 
@@ -312,6 +323,9 @@ static IBindStatusCallback *create_callback(DocHost *This, PBYTE post_data,
     ret->post_data_len = post_data_len;
     ret->headers = NULL;
 
+    ret->doc_host = doc_host;
+    IOleClientSite_AddRef(CLIENTSITE(doc_host));
+
     if(post_data) {
         ret->post_data = GlobalAlloc(0, post_data_len);
         memcpy(ret->post_data, post_data, post_data_len);
@@ -496,7 +510,6 @@ static HRESULT bind_url_to_object(DocHost *This, LPCWSTR url, PBYTE post_data, U
     IBindStatusCallback *callback;
     IMoniker *mon;
     IBindCtx *bindctx;
-    VARIANT_BOOL cancel = VARIANT_FALSE;
     HRESULT hres;
 
     if(!This->hwnd)
@@ -511,12 +524,14 @@ static HRESULT bind_url_to_object(DocHost *This, LPCWSTR url, PBYTE post_data, U
     IMoniker_GetDisplayName(mon, NULL, NULL, &This->url);
     TRACE("navigating to %s\n", debugstr_w(This->url));
 
-    callback = create_callback(This, post_data, post_data_len, (LPWSTR)headers, &cancel);
+    callback = create_callback(This, post_data, post_data_len, (LPWSTR)headers);
     CreateAsyncBindCtx(0, callback, 0, &bindctx);
-    IBindStatusCallback_Release(callback);
 
     hres = navigate(This, mon, bindctx);
 
+    IBindStatusCallback_OnStopBinding(callback, hres, NULL);
+
+    IBindStatusCallback_Release(callback);
     IBindCtx_Release(bindctx);
     IMoniker_Release(mon);
 




More information about the wine-cvs mailing list