Module: wine Branch: master Commit: 89ca878d1bc9bed3f78240762b34cbcccba9bfe7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=89ca878d1bc9bed3f78240762b...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jul 27 15:52:17 2010 +0200
wscript.exe: Added script engine host implementation.
---
programs/wscript/Makefile.in | 2 +- programs/wscript/main.c | 178 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletions(-)
diff --git a/programs/wscript/Makefile.in b/programs/wscript/Makefile.in index 36d25f7..64c9678 100644 --- a/programs/wscript/Makefile.in +++ b/programs/wscript/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = wscript.exe APPMODE = -mwindows -municode -IMPORTS = ole32 advapi32 +IMPORTS = uuid ole32 advapi32 EXTRADEFS = -DWINE_NO_UNICODE_MACROS
C_SRCS = \ diff --git a/programs/wscript/main.c b/programs/wscript/main.c index 5169b74..674bcba 100644 --- a/programs/wscript/main.c +++ b/programs/wscript/main.c @@ -18,16 +18,119 @@
#include <stdarg.h>
+#define COBJMACROS + #include <windef.h> #include <winbase.h> #include <winreg.h> #include <ole2.h> +#include <activscp.h>
#include <wine/debug.h> #include <wine/unicode.h>
WINE_DEFAULT_DEBUG_CHANNEL(wscript);
+static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, + REFIID riid, void **ppv) +{ + if(IsEqualGUID(riid, &IID_IUnknown)) { + WINE_TRACE("(IID_IUnknown %p)\n", ppv); + *ppv = iface; + }else if(IsEqualGUID(riid, &IID_IActiveScriptSite)) { + WINE_TRACE("(IID_IActiveScriptSite %p)\n", ppv); + *ppv = iface; + }else { + *ppv = NULL; + WINE_TRACE("(%s %p)\n", wine_dbgstr_guid(riid), ppv); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface) +{ + return 2; +} + +static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface) +{ + return 1; +} + +static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid) +{ + WINE_TRACE("()\n"); + + *plcid = GetUserDefaultLCID(); + return S_OK; +} + +static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, + LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppunkItem, ITypeInfo **ppti) +{ + WINE_FIXME("(%s %x %p %p)\n", wine_dbgstr_w(pstrName), dwReturnMask, ppunkItem, ppti); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, + BSTR *pbstrVersion) +{ + WINE_FIXME("()\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, + const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo) +{ + WINE_FIXME("()\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, + SCRIPTSTATE ssScriptState) +{ + WINE_TRACE("(%x)\n", ssScriptState); + return S_OK; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, + IActiveScriptError *pscripterror) +{ + WINE_FIXME("()\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface) +{ + WINE_TRACE("()\n"); + return S_OK; +} + +static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface) +{ + WINE_TRACE("()\n"); + return S_OK; +} + +static IActiveScriptSiteVtbl ActiveScriptSiteVtbl = { + ActiveScriptSite_QueryInterface, + ActiveScriptSite_AddRef, + ActiveScriptSite_Release, + ActiveScriptSite_GetLCID, + ActiveScriptSite_GetItemInfo, + ActiveScriptSite_GetDocVersionString, + ActiveScriptSite_OnScriptTerminate, + ActiveScriptSite_OnStateChange, + ActiveScriptSite_OnScriptError, + ActiveScriptSite_OnEnterScript, + ActiveScriptSite_OnLeaveScript +}; + +IActiveScriptSite script_site = { &ActiveScriptSiteVtbl }; + static BOOL get_engine_clsid(const WCHAR *ext, CLSID *clsid) { WCHAR fileid[64], progid[64]; @@ -68,8 +171,64 @@ static BOOL get_engine_clsid(const WCHAR *ext, CLSID *clsid) return SUCCEEDED(hres); }
+static HRESULT create_engine(CLSID *clsid, IActiveScript **script_ret, + IActiveScriptParse **parser) +{ + IActiveScript *script; + IUnknown *unk; + HRESULT hres; + + hres = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IUnknown, (void**)&unk); + if(FAILED(hres)) + return FALSE; + + hres = IUnknown_QueryInterface(unk, &IID_IActiveScript, (void**)&script); + IUnknown_Release(unk); + if(FAILED(hres)) + return FALSE; + + hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)parser); + if(FAILED(hres)) { + IActiveScript_Release(script); + return FALSE; + } + + *script_ret = script; + return TRUE; +} + +static HRESULT init_engine(IActiveScript *script, IActiveScriptParse *parser) +{ + HRESULT hres; + + static const WCHAR wscriptW[] = {'W','S','c','r','i','p','t',0}; + static const WCHAR wshW[] = {'W','S','H',0}; + + hres = IActiveScript_SetScriptSite(script, &script_site); + if(FAILED(hres)) + return FALSE; + + hres = IActiveScriptParse64_InitNew(parser); + if(FAILED(hres)) + return FALSE; + + hres = IActiveScript_AddNamedItem(script, wscriptW, SCRIPTITEM_ISVISIBLE); + if(FAILED(hres)) + return FALSE; + + hres = IActiveScript_AddNamedItem(script, wshW, SCRIPTITEM_ISVISIBLE); + if(FAILED(hres)) + return FALSE; + + hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_INITIALIZED); + return SUCCEEDED(hres); +} + int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cmdshow) { + IActiveScriptParse *parser; + IActiveScript *script; const WCHAR *ext; CLSID clsid;
@@ -86,5 +245,24 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cm return 1; }
+ CoInitialize(NULL); + + if(!create_engine(&clsid, &script, &parser)) { + WINE_FIXME("Could not create script engine\n"); + CoUninitialize(); + return 1; + } + + if(init_engine(script, parser)) { + IActiveScript_Close(script); + }else { + WINE_FIXME("Script initialization failed\n"); + } + + IActiveScript_Release(script); + IUnknown_Release(parser); + + CoUninitialize(); + return 0; }