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






Reply via email to