Hi, Could I get some feedback on this patch please?
Best Regards Alistair Leslie-Hughes Alistair Leslie-Hughes wrote:
Hi, Changelog: shdocvw: Added support for IAdviseSink Best Regards Alistair Leslie-Hughes
>From 9925900c771af32a1dfb2567d8354e888949c352 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes <leslie_alist...@hotmail.com> Date: Fri, 31 Jul 2009 20:40:10 +1000 Subject: [PATCH] Partial support for IAdviseSink To: wine-patches <wine-patc...@winehq.org> --- dlls/shdocvw/oleobject.c | 30 +++++++++++-- dlls/shdocvw/shdocvw.h | 1 + dlls/shdocvw/tests/webbrowser.c | 92 +++++++++++++++++++++++++++++++++++++++ dlls/shdocvw/webbrowser.c | 4 ++ 4 files changed, 123 insertions(+), 4 deletions(-) diff --git a/dlls/shdocvw/oleobject.c b/dlls/shdocvw/oleobject.c index 017e738..bdffc86 100644 --- a/dlls/shdocvw/oleobject.c +++ b/dlls/shdocvw/oleobject.c @@ -501,15 +501,37 @@ static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD* pdwConnection) { WebBrowser *This = OLEOBJ_THIS(iface); - FIXME("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection); - return E_NOTIMPL; + HRESULT hr = E_INVALIDARG; + + TRACE("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection); + + if(!pdwConnection || !pAdvSink) + return hr; + + if(!This->holder) + { + hr = CreateOleAdviseHolder(&This->holder); + if(FAILED(hr)) + ERR("CreateOleAdviseHolder failed\n"); + } + + if(hr == S_OK && This->holder) + { + hr = IOleAdviseHolder_Advise(This->holder, pAdvSink, pdwConnection); + } + + return hr; } static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection) { WebBrowser *This = OLEOBJ_THIS(iface); - FIXME("(%p)->(%d)\n", This, dwConnection); - return E_NOTIMPL; + TRACE("(%p)->(%d)\n", This, dwConnection); + + if(!This->holder) + return OLE_E_NOCONNECTION; + + return IOleAdviseHolder_Unadvise(This->holder, dwConnection); } static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise) diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index b148611..ed96882 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -128,6 +128,7 @@ struct WebBrowser { IOleClientSite *client; IOleContainer *container; IOleInPlaceSite *inplace; + IOleAdviseHolder *holder; /* window context */ diff --git a/dlls/shdocvw/tests/webbrowser.c b/dlls/shdocvw/tests/webbrowser.c index 131b29c..3485e50 100644 --- a/dlls/shdocvw/tests/webbrowser.c +++ b/dlls/shdocvw/tests/webbrowser.c @@ -468,6 +468,68 @@ static HRESULT WINAPI WebBrowserEvents2_QueryInterface(IDispatch *iface, REFIID return E_NOINTERFACE; } +/* IAdviseSink */ +static HRESULT WINAPI WebBrowserAdviseSink_QueryInterface(IAdviseSink *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IAdviseSink, riid)) { + *ppv = iface; + return S_OK; + } + + ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI WebBrowserAdviseSink_AddRef(IAdviseSink *iface) +{ + return 2; +} + +static ULONG WINAPI WebBrowserAdviseSink_Release(IAdviseSink *iface) +{ + return 1; +} + +static void WINAPI WebBrowserAdviseSink_OnDataChange(IAdviseSink *iface, FORMATETC *pFormatetc, STGMEDIUM *pStgmed) +{ + ok(0, "unexpected OnDataChange\n"); +} + +static void WINAPI WebBrowserAdviseSink_OnViewChange(IAdviseSink *iface, DWORD dwAspect, LONG lindex) +{ + ok(0, "unexpected OnViewChange\n"); +} + +static void WINAPI WebBrowserAdviseSink_OnRename(IAdviseSink *iface, IMoniker *pmk) +{ + ok(0, "unexpected OnRename\n"); +} + +static void WINAPI WebBrowserAdviseSink_OnSave(IAdviseSink *iface) +{ + ok(0, "unexpected OnSave\n"); +} + +static void WINAPI WebBrowserAdviseSink_OnClose(IAdviseSink *iface) +{ + ok(0, "unexpected OnClose\n"); +} + +static IAdviseSinkVtbl AdviseSinkVtbl = { + WebBrowserAdviseSink_QueryInterface, + WebBrowserAdviseSink_AddRef, + WebBrowserAdviseSink_Release, + WebBrowserAdviseSink_OnDataChange, + WebBrowserAdviseSink_OnViewChange, + WebBrowserAdviseSink_OnRename, + WebBrowserAdviseSink_OnSave, + WebBrowserAdviseSink_OnClose +}; + +static IAdviseSink AdviseSink = { &AdviseSinkVtbl }; + #define test_invoke_bool(p,s) _test_invoke_bool(__LINE__,p,s) static void _test_invoke_bool(unsigned line, const DISPPARAMS *params, BOOL strict) { @@ -1451,6 +1513,35 @@ static void test_DoVerb(IUnknown *unk) IOleObject_Release(oleobj); } +static void test_IOleObject_Sink(IUnknown *unk) +{ + IOleObject *oleobj; + HRESULT hres; + DWORD sink; + + hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj); + ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres); + if(FAILED(hres)) + return; + + hres = IOleObject_Advise(oleobj, &AdviseSink, NULL); + ok(hres == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hres); + + hres = IOleObject_Advise(oleobj, NULL, &sink); + ok(hres == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hres); + + hres = IOleObject_Advise(oleobj, &AdviseSink, &sink); + ok(hres == S_OK, "Advise failed: %08x\n", hres); + if(hres == S_OK) + { + hres = IOleObject_Unadvise(oleobj, sink); + ok(hres == S_OK, "Advise failed: %08x\n", hres); + } + + + IOleObject_Release(oleobj); +} + static void test_GetMiscStatus(IOleObject *oleobj) { DWORD st, i; @@ -2346,6 +2437,7 @@ static void test_WebBrowser(BOOL do_download) test_wb_funcs(unk, FALSE); test_ConnectionPoint(unk, FALSE); test_IServiceProvider(unk); + test_IOleObject_Sink(unk); IWebBrowser2_Release(wb); ref = IUnknown_Release(unk); diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c index 5e97961..c0baf21 100644 --- a/dlls/shdocvw/webbrowser.c +++ b/dlls/shdocvw/webbrowser.c @@ -153,6 +153,9 @@ static ULONG WINAPI WebBrowser_Release(IWebBrowser2 *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) { + if(This->holder) + IOleAdviseHolder_Release(This->holder); + if(This->doc_host.document) IUnknown_Release(This->doc_host.document); @@ -1113,6 +1116,7 @@ static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, voi ret->tool_bar = VARIANT_TRUE; ret->full_screen = VARIANT_FALSE; ret->theater_mode = VARIANT_FALSE; + ret->holder = NULL; WebBrowser_OleObject_Init(ret); WebBrowser_ViewObject_Init(ret); -- 1.6.3.3