[v2 PATCH 2/2] msscript: Implement SetClientSite()/GetClientSite()
Nikolay Sivov
nsivov at codeweavers.com
Tue Jun 7 03:29:36 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/msscript.ocx/msscript.c | 27 +++++++++---
dlls/msscript.ocx/tests/msscript.c | 87 ++++++++++++++++++++++++++++++++++++++
2 files changed, 109 insertions(+), 5 deletions(-)
diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index f837f1e..a53266c 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -32,6 +32,7 @@ struct ScriptControl {
IScriptControl IScriptControl_iface;
IOleObject IOleObject_iface;
LONG ref;
+ IOleClientSite *site;
};
static HINSTANCE msscript_instance;
@@ -168,8 +169,11 @@ static ULONG WINAPI ScriptControl_Release(IScriptControl *iface)
TRACE("(%p) ref=%d\n", This, ref);
- if(!ref)
+ if(!ref) {
+ if (This->site)
+ IOleClientSite_Release(This->site);
heap_free(This);
+ }
return ref;
}
@@ -445,18 +449,30 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
{
ScriptControl *This = impl_from_IOleObject(iface);
- FIXME("(%p)->(%p)\n", This, site);
+ TRACE("(%p)->(%p)\n", This, site);
- return E_NOTIMPL;
+ if (This->site)
+ IOleClientSite_Release(This->site);
+
+ if ((This->site = site))
+ IOleClientSite_AddRef(site);
+
+ return S_OK;
}
static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **site)
{
ScriptControl *This = impl_from_IOleObject(iface);
- FIXME("(%p)->(%p)\n", This, site);
+ TRACE("(%p)->(%p)\n", This, site);
- return E_NOTIMPL;
+ if (!site)
+ return E_POINTER;
+
+ if ((*site = This->site))
+ IOleClientSite_AddRef(*site);
+
+ return S_OK;
}
static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR containerapp, LPCOLESTR containerobj)
@@ -673,6 +689,7 @@ static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknow
script_control->IScriptControl_iface.lpVtbl = &ScriptControlVtbl;
script_control->IOleObject_iface.lpVtbl = &OleObjectVtbl;
script_control->ref = 1;
+ script_control->site = NULL;
hres = IScriptControl_QueryInterface(&script_control->IScriptControl_iface, riid, ppv);
IScriptControl_Release(&script_control->IScriptControl_iface);
diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c
index c9a409e..ab1c3c1 100644
--- a/dlls/msscript.ocx/tests/msscript.c
+++ b/dlls/msscript.ocx/tests/msscript.c
@@ -25,8 +25,77 @@
#include "msscript.h"
#include "wine/test.h"
+static HRESULT WINAPI OleClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **obj)
+{
+ if (IsEqualIID(riid, &IID_IOleClientSite) || IsEqualIID(riid, &IID_IUnknown))
+ {
+ *obj = iface;
+ IOleClientSite_AddRef(iface);
+ return S_OK;
+ }
+
+ *obj = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI OleClientSite_AddRef(IOleClientSite *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI OleClientSite_Release(IOleClientSite *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI OleClientSite_SaveObject(IOleClientSite *iface)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleClientSite_GetMoniker(IOleClientSite *iface, DWORD assign,
+ DWORD which, IMoniker **moniker)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleClientSite_GetContainer(IOleClientSite *iface, IOleContainer **container)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleClientSite_ShowObject(IOleClientSite *iface)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleClientSite_OnShowWindow(IOleClientSite *iface, BOOL show)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleClientSite_RequestNewObjectLayout(IOleClientSite *iface)
+{
+ return E_NOTIMPL;
+}
+
+static const IOleClientSiteVtbl OleClientSiteVtbl = {
+ OleClientSite_QueryInterface,
+ OleClientSite_AddRef,
+ OleClientSite_Release,
+ OleClientSite_SaveObject,
+ OleClientSite_GetMoniker,
+ OleClientSite_GetContainer,
+ OleClientSite_ShowObject,
+ OleClientSite_OnShowWindow,
+ OleClientSite_RequestNewObjectLayout
+};
+
+static IOleClientSite testclientsite = { &OleClientSiteVtbl };
+
static void test_oleobject(void)
{
+ IOleClientSite *site;
IOleObject *obj;
DWORD status;
HRESULT hr;
@@ -43,6 +112,24 @@ static void test_oleobject(void)
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(status != 0, "got 0x%08x\n", status);
+ hr = IOleObject_SetClientSite(obj, &testclientsite);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ if (0) /* crashes on w2k3 */
+ hr = IOleObject_GetClientSite(obj, NULL);
+
+ hr = IOleObject_GetClientSite(obj, &site);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(site == &testclientsite, "got %p, %p\n", site, &testclientsite);
+ IOleClientSite_Release(site);
+
+ hr = IOleObject_SetClientSite(obj, NULL);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = IOleObject_GetClientSite(obj, &site);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(site == NULL, "got %p\n", site);
+
IOleObject_Release(obj);
}
--
2.8.1
More information about the wine-patches
mailing list