Module: wine Branch: master Commit: b67a6a3c4becc96c0dbcfc9c3f3e30d42bbd8102 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b67a6a3c4becc96c0dbcfc9c3f...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Jun 7 11:29:36 2016 +0300
msscript: Implement SetClientSite()/GetClientSite().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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); }