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 <[email protected]>
Date: Fri, 31 Jul 2009 20:40:10 +1000
Subject: [PATCH] Partial support for IAdviseSink
To: wine-patches <[email protected]>
---
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