Module: wine Branch: master Commit: 3ebdcb847d7c9f7087d024409a10f67f29a37f01 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ebdcb847d7c9f7087d024409a...
Author: Jacek Caban jacek@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);