[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