[PATCH 3/3] msscript: Implement Language() property

Nikolay Sivov nsivov at codeweavers.com
Thu Jun 9 12:40:15 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 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




More information about the wine-patches mailing list