From 89ca878d1bc9bed3f78240762b34cbcccba9bfe7 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 27 Jul 2010 15:52:17 +0200 Subject: [PATCH] wscript.exe: Added script engine host implementation. --- programs/wscript/Makefile.in | 2 +- programs/wscript/main.c | 178 +++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletion(-) diff --git a/programs/wscript/Makefile.in b/programs/wscript/Makefile.in index 36d25f71407..64c9678b280 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 5169b749e1e..674bcba12c7 100644 --- a/programs/wscript/main.c +++ b/programs/wscript/main.c @@ -18,16 +18,119 @@ #include +#define COBJMACROS + #include #include #include #include +#include #include #include 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; }