From: Nikolay Sivov Subject: [PATCH 3/3] msscript: Implement Language() property Message-Id: <1465494015-16202-3-git-send-email-nsivov@codeweavers.com> Date: Thu, 9 Jun 2016 20:40:15 +0300 In-Reply-To: <1465494015-16202-1-git-send-email-nsivov@codeweavers.com> References: <1465494015-16202-1-git-send-email-nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov --- dlls/msscript.ocx/msscript.c | 48 +++++++++++++++++++++++--- dlls/msscript.ocx/tests/Makefile.in | 2 +- dlls/msscript.ocx/tests/msscript.c | 68 +++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 5 deletions(-) diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c index b2f4e77..2667c7c 100644 --- a/dlls/msscript.ocx/msscript.c +++ b/dlls/msscript.ocx/msscript.c @@ -29,6 +29,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(msscript); +static const WCHAR vbscriptW[] = {'V','B','S','c','r','i','p','t',0}; +static const WCHAR jscriptW[] = {'J','S','c','r','i','p','t',0}; + +enum script_language { + LANGUAGE_UNDEFINED, + LANGUAGE_VBSCRIPT, + LANGUAGE_JSCRIPT +}; + struct ScriptControl { IScriptControl IScriptControl_iface; IPersistStreamInit IPersistStreamInit_iface; @@ -37,6 +46,7 @@ struct ScriptControl { LONG ref; IOleClientSite *site; SIZEL extent; + enum script_language language; }; static HINSTANCE msscript_instance; @@ -259,15 +269,44 @@ static HRESULT WINAPI ScriptControl_Invoke(IScriptControl *iface, DISPID dispIdM static HRESULT WINAPI ScriptControl_get_Language(IScriptControl *iface, BSTR *p) { ScriptControl *This = impl_from_IScriptControl(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + if (!p) + return E_POINTER; + + switch (This->language) + { + case LANGUAGE_VBSCRIPT: + *p = SysAllocString(vbscriptW); + break; + case LANGUAGE_JSCRIPT: + *p = SysAllocString(jscriptW); + break; + default: + *p = NULL; + return S_OK; + } + + return *p ? S_OK : E_OUTOFMEMORY; } static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR language) { ScriptControl *This = impl_from_IScriptControl(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(language)); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_w(language)); + + if (!lstrcmpiW(language, vbscriptW)) + This->language = LANGUAGE_VBSCRIPT; + else if (!lstrcmpiW(language, jscriptW)) + This->language = LANGUAGE_JSCRIPT; + else if (!language) + This->language = LANGUAGE_UNDEFINED; + else + return CTL_E_INVALIDPROPERTYVALUE; + + return S_OK; } static HRESULT WINAPI ScriptControl_get_State(IScriptControl *iface, ScriptControlStates *p) @@ -869,6 +908,7 @@ static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknow script_control->IOleControl_iface.lpVtbl = &OleControlVtbl; script_control->ref = 1; script_control->site = NULL; + script_control->language = LANGUAGE_UNDEFINED; hdc = GetDC(0); dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); diff --git a/dlls/msscript.ocx/tests/Makefile.in b/dlls/msscript.ocx/tests/Makefile.in index 8d769d3..b8b7624 100644 --- a/dlls/msscript.ocx/tests/Makefile.in +++ b/dlls/msscript.ocx/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = msscript.ocx -IMPORTS = user32 gdi32 ole32 +IMPORTS = user32 gdi32 ole32 oleaut32 C_SRCS = \ msscript.c diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c index f0245a6..f0a1194 100644 --- a/dlls/msscript.ocx/tests/msscript.c +++ b/dlls/msscript.ocx/tests/msscript.c @@ -190,6 +190,73 @@ static void test_olecontrol(void) IOleControl_Release(olecontrol); } +static void test_Language(void) +{ + static const WCHAR vbW[] = {'V','B','S','c','r','i','p','t',0}; + static const WCHAR jsW[] = {'J','S','c','r','i','p','t',0}; + static const WCHAR vb2W[] = {'v','B','s','c','r','i','p','t',0}; + static const WCHAR dummyW[] = {'d','u','m','m','y',0}; + IScriptControl *sc; + HRESULT hr; + BSTR str; + + hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IScriptControl, (void**)&sc); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IScriptControl_get_Language(sc, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + str = (BSTR)0xdeadbeef; + hr = IScriptControl_get_Language(sc, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(str == NULL, "got %s\n", wine_dbgstr_w(str)); + + str = SysAllocString(vbW); + hr = IScriptControl_put_Language(sc, str); + ok(hr == S_OK, "got 0x%08x\n", hr); + SysFreeString(str); + + str = SysAllocString(vb2W); + hr = IScriptControl_put_Language(sc, str); + ok(hr == S_OK, "got 0x%08x\n", hr); + SysFreeString(str); + + hr = IScriptControl_get_Language(sc, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = SysAllocString(dummyW); + hr = IScriptControl_put_Language(sc, str); + ok(hr == CTL_E_INVALIDPROPERTYVALUE, "got 0x%08x\n", hr); + SysFreeString(str); + + hr = IScriptControl_get_Language(sc, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = SysAllocString(jsW); + hr = IScriptControl_put_Language(sc, str); + ok(hr == S_OK, "got 0x%08x\n", hr); + SysFreeString(str); + + hr = IScriptControl_get_Language(sc, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(str, jsW), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + hr = IScriptControl_put_Language(sc, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IScriptControl_get_Language(sc, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(str == NULL, "got %s\n", wine_dbgstr_w(str)); + + IScriptControl_Release(sc); +} + START_TEST(msscript) { IUnknown *unk; @@ -208,6 +275,7 @@ START_TEST(msscript) test_oleobject(); test_persiststreaminit(); test_olecontrol(); + test_Language(); CoUninitialize(); } -- 2.8.1