Nikolay Sivov : msscript: Implement SetAdvise/GetAdvise.

Alexandre Julliard julliard at winehq.org
Wed Jul 20 10:28:52 CDT 2016


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jul 20 13:47:44 2016 +0300

msscript: Implement SetAdvise/GetAdvise.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msscript.ocx/msscript.c       | 38 ++++++++++++++++++++++++++++++++------
 dlls/msscript.ocx/tests/msscript.c | 30 +++++++++++++++++++++++++++++-
 2 files changed, 61 insertions(+), 7 deletions(-)

diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index 319f901..3b097af 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -83,6 +83,10 @@ struct ScriptControl {
     ConnectionPoint cp_scsource;
     ConnectionPoint cp_propnotif;
 
+    /* IViewObject sink */
+    IAdviseSink *view_sink;
+    DWORD view_sink_flags;
+
     ScriptHost *host;
 };
 
@@ -1327,22 +1331,42 @@ static HRESULT WINAPI ViewObject_Unfreeze(IViewObjectEx *iface, DWORD freeze)
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD advf, IAdviseSink *sink)
+static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD flags, IAdviseSink *sink)
 {
     ScriptControl *This = impl_from_IViewObjectEx(iface);
 
-    FIXME("(%p)->(%d %d %p)\n", This, aspects, advf, sink);
+    TRACE("(%p)->(%d %#x %p)\n", This, aspects, flags, sink);
 
-    return E_NOTIMPL;
+    if (aspects != DVASPECT_CONTENT)
+        return DV_E_DVASPECT;
+
+    This->view_sink_flags = flags;
+    if (This->view_sink)
+        IAdviseSink_Release(This->view_sink);
+    This->view_sink = sink;
+    if (This->view_sink)
+        IAdviseSink_AddRef(This->view_sink);
+
+    return S_OK;
 }
 
-static HRESULT WINAPI ViewObject_GetAdvise(IViewObjectEx *iface, DWORD *aspects, DWORD *advf, IAdviseSink **sink)
+static HRESULT WINAPI ViewObject_GetAdvise(IViewObjectEx *iface, DWORD *aspects, DWORD *flags, IAdviseSink **sink)
 {
     ScriptControl *This = impl_from_IViewObjectEx(iface);
 
-    FIXME("(%p)->(%p %p %p)\n", This, aspects, advf, sink);
+    TRACE("(%p)->(%p %p %p)\n", This, aspects, flags, sink);
 
-    return E_NOTIMPL;
+    if (aspects)
+        *aspects = DVASPECT_CONTENT;
+    if (flags)
+        *flags = This->view_sink_flags;
+    if (sink) {
+        *sink = This->view_sink;
+        if (*sink)
+            IAdviseSink_AddRef(*sink);
+    }
+
+    return S_OK;
 }
 
 static HRESULT WINAPI ViewObject_GetExtent(IViewObjectEx *iface, DWORD draw_aspect, LONG index,
@@ -1676,6 +1700,8 @@ static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknow
     script_control->cp_list = NULL;
     script_control->host = NULL;
     script_control->timeout = 10000;
+    script_control->view_sink_flags = 0;
+    script_control->view_sink = NULL;
 
     ConnectionPoint_Init(&script_control->cp_scsource, script_control, &DIID_DScriptControlSource);
     ConnectionPoint_Init(&script_control->cp_propnotif, script_control, &IID_IPropertyNotifySink);
diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c
index 427d0ca..a211fe3 100644
--- a/dlls/msscript.ocx/tests/msscript.c
+++ b/dlls/msscript.ocx/tests/msscript.c
@@ -860,10 +860,11 @@ static void test_quickactivate(void)
 
 static void test_viewobject(void)
 {
+    DWORD status, aspect, flags;
     IViewObjectEx *viewex;
     IScriptControl *sc;
     IViewObject *view;
-    DWORD status;
+    IAdviseSink *sink;
     HRESULT hr;
 
     hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
@@ -876,6 +877,33 @@ static void test_viewobject(void)
 
     hr = IScriptControl_QueryInterface(sc, &IID_IViewObject2, (void**)&view);
     ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    sink = (IAdviseSink*)0xdeadbeef;
+    hr = IViewObject_GetAdvise(view, &aspect, &flags, &sink);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(aspect == DVASPECT_CONTENT, "got %u\n", aspect);
+    ok(flags == 0, "got %#x\n", flags);
+    ok(sink == NULL, "got %p\n", sink);
+
+    hr = IViewObject_SetAdvise(view, DVASPECT_CONTENT, 0, NULL);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IViewObject_SetAdvise(view, DVASPECT_THUMBNAIL, 0, NULL);
+    ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
+
+    hr = IViewObject_SetAdvise(view, DVASPECT_ICON, 0, NULL);
+    ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
+
+    hr = IViewObject_SetAdvise(view, DVASPECT_DOCPRINT, 0, NULL);
+    ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
+
+    sink = (IAdviseSink*)0xdeadbeef;
+    hr = IViewObject_GetAdvise(view, &aspect, &flags, &sink);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(aspect == DVASPECT_CONTENT, "got %u\n", aspect);
+    ok(flags == 0, "got %#x\n", flags);
+    ok(sink == NULL, "got %p\n", sink);
+
     IViewObject_Release(view);
 
     hr = IScriptControl_QueryInterface(sc, &IID_IViewObjectEx, (void**)&viewex);




More information about the wine-cvs mailing list