2 * Copyright 2011 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
39 #define CTXARG_T DWORDLONG
40 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
44 #define CTXARG_T DWORD
45 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
50 IActiveScript IActiveScript_iface;
51 IActiveScriptParse IActiveScriptParse_iface;
52 IObjectSafety IObjectSafety_iface;
58 IActiveScriptSite *site;
64 static void change_state(VBScript *This, SCRIPTSTATE state)
66 if(This->state == state)
71 IActiveScriptSite_OnStateChange(This->site, state);
74 static HRESULT set_ctx_site(VBScript *This)
76 This->ctx->lcid = This->lcid;
78 IActiveScriptSite_AddRef(This->site);
79 This->ctx->site = This->site;
81 change_state(This, SCRIPTSTATE_INITIALIZED);
85 static void destroy_script(script_ctx_t *ctx)
88 IActiveScriptSite_Release(ctx->site);
92 static void decrease_state(VBScript *This, SCRIPTSTATE state)
95 case SCRIPTSTATE_CONNECTED:
96 case SCRIPTSTATE_STARTED:
97 case SCRIPTSTATE_DISCONNECTED:
98 FIXME("unimplemented state %d\n", This->state);
99 if(state == SCRIPTSTATE_INITIALIZED)
102 case SCRIPTSTATE_INITIALIZED:
103 destroy_script(This->ctx);
107 change_state(This, state);
108 if(state == SCRIPTSTATE_UNINITIALIZED)
111 case SCRIPTSTATE_UNINITIALIZED:
113 IActiveScriptSite_Release(This->site);
123 static inline VBScript *impl_from_IActiveScript(IActiveScript *iface)
125 return CONTAINING_RECORD(iface, VBScript, IActiveScript_iface);
128 static HRESULT WINAPI VBScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
130 VBScript *This = impl_from_IActiveScript(iface);
132 if(IsEqualGUID(riid, &IID_IUnknown)) {
133 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
134 *ppv = &This->IActiveScript_iface;
135 }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
136 TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
137 *ppv = &This->IActiveScript_iface;
138 }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
139 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
140 *ppv = &This->IActiveScriptParse_iface;
141 }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
142 TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
143 *ppv = &This->IObjectSafety_iface;
145 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
147 return E_NOINTERFACE;
150 IUnknown_AddRef((IUnknown*)*ppv);
154 static ULONG WINAPI VBScript_AddRef(IActiveScript *iface)
156 VBScript *This = impl_from_IActiveScript(iface);
157 LONG ref = InterlockedIncrement(&This->ref);
159 TRACE("(%p) ref=%d\n", This, ref);
164 static ULONG WINAPI VBScript_Release(IActiveScript *iface)
166 VBScript *This = impl_from_IActiveScript(iface);
167 LONG ref = InterlockedDecrement(&This->ref);
169 TRACE("(%p) ref=%d\n", iface, ref);
173 IActiveScriptSite_Release(This->site);
180 static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass)
182 VBScript *This = impl_from_IActiveScript(iface);
186 TRACE("(%p)->(%p)\n", This, pass);
194 if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
198 IActiveScriptSite_AddRef(This->site);
200 hres = IActiveScriptSite_GetLCID(This->site, &lcid);
204 return This->ctx ? set_ctx_site(This) : S_OK;
207 static HRESULT WINAPI VBScript_GetScriptSite(IActiveScript *iface, REFIID riid,
210 VBScript *This = impl_from_IActiveScript(iface);
211 FIXME("(%p)->()\n", This);
215 static HRESULT WINAPI VBScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
217 VBScript *This = impl_from_IActiveScript(iface);
218 FIXME("(%p)->(%d)\n", This, ss);
222 static HRESULT WINAPI VBScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
224 VBScript *This = impl_from_IActiveScript(iface);
226 TRACE("(%p)->(%p)\n", This, pssState);
231 if(This->thread_id && This->thread_id != GetCurrentThreadId())
234 *pssState = This->state;
238 static HRESULT WINAPI VBScript_Close(IActiveScript *iface)
240 VBScript *This = impl_from_IActiveScript(iface);
242 TRACE("(%p)->()\n", This);
244 if(This->thread_id && This->thread_id != GetCurrentThreadId())
247 decrease_state(This, SCRIPTSTATE_CLOSED);
251 static HRESULT WINAPI VBScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstrName, DWORD dwFlags)
253 VBScript *This = impl_from_IActiveScript(iface);
254 FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
258 static HRESULT WINAPI VBScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
259 DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
261 VBScript *This = impl_from_IActiveScript(iface);
262 FIXME("(%p)->()\n", This);
266 static HRESULT WINAPI VBScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName, IDispatch **ppdisp)
268 VBScript *This = impl_from_IActiveScript(iface);
269 FIXME("(%p)->(%p)\n", This, ppdisp);
273 static HRESULT WINAPI VBScript_GetCurrentScriptThreadID(IActiveScript *iface,
274 SCRIPTTHREADID *pstridThread)
276 VBScript *This = impl_from_IActiveScript(iface);
277 FIXME("(%p)->()\n", This);
281 static HRESULT WINAPI VBScript_GetScriptThreadID(IActiveScript *iface,
282 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
284 VBScript *This = impl_from_IActiveScript(iface);
285 FIXME("(%p)->()\n", This);
289 static HRESULT WINAPI VBScript_GetScriptThreadState(IActiveScript *iface,
290 SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
292 VBScript *This = impl_from_IActiveScript(iface);
293 FIXME("(%p)->()\n", This);
297 static HRESULT WINAPI VBScript_InterruptScriptThread(IActiveScript *iface,
298 SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
300 VBScript *This = impl_from_IActiveScript(iface);
301 FIXME("(%p)->()\n", This);
305 static HRESULT WINAPI VBScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
307 VBScript *This = impl_from_IActiveScript(iface);
308 FIXME("(%p)->()\n", This);
312 static const IActiveScriptVtbl VBScriptVtbl = {
313 VBScript_QueryInterface,
316 VBScript_SetScriptSite,
317 VBScript_GetScriptSite,
318 VBScript_SetScriptState,
319 VBScript_GetScriptState,
321 VBScript_AddNamedItem,
323 VBScript_GetScriptDispatch,
324 VBScript_GetCurrentScriptThreadID,
325 VBScript_GetScriptThreadID,
326 VBScript_GetScriptThreadState,
327 VBScript_InterruptScriptThread,
331 static inline VBScript *impl_from_IActiveScriptParse(IActiveScriptParse *iface)
333 return CONTAINING_RECORD(iface, VBScript, IActiveScriptParse_iface);
336 static HRESULT WINAPI VBScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
338 VBScript *This = impl_from_IActiveScriptParse(iface);
339 return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
342 static ULONG WINAPI VBScriptParse_AddRef(IActiveScriptParse *iface)
344 VBScript *This = impl_from_IActiveScriptParse(iface);
345 return IActiveScript_AddRef(&This->IActiveScript_iface);
348 static ULONG WINAPI VBScriptParse_Release(IActiveScriptParse *iface)
350 VBScript *This = impl_from_IActiveScriptParse(iface);
351 return IActiveScript_Release(&This->IActiveScript_iface);
354 static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface)
356 VBScript *This = impl_from_IActiveScriptParse(iface);
357 script_ctx_t *ctx, *old_ctx;
359 TRACE("(%p)\n", This);
364 ctx = heap_alloc_zero(sizeof(script_ctx_t));
366 return E_OUTOFMEMORY;
368 old_ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL);
374 return This->site ? set_ctx_site(This) : S_OK;
377 static HRESULT WINAPI VBScriptParse_AddScriptlet(IActiveScriptParse *iface,
378 LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
379 LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
380 CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
381 BSTR *pbstrName, EXCEPINFO *pexcepinfo)
383 VBScript *This = impl_from_IActiveScriptParse(iface);
384 FIXME("(%p)->(%s %s %s %s %s %s %s %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
385 debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
386 debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie),
387 ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
391 static HRESULT WINAPI VBScriptParse_ParseScriptText(IActiveScriptParse *iface,
392 LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
393 LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine,
394 DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
396 VBScript *This = impl_from_IActiveScriptParse(iface);
397 FIXME("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode),
398 debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
399 wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo);
403 static const IActiveScriptParseVtbl VBScriptParseVtbl = {
404 VBScriptParse_QueryInterface,
405 VBScriptParse_AddRef,
406 VBScriptParse_Release,
407 VBScriptParse_InitNew,
408 VBScriptParse_AddScriptlet,
409 VBScriptParse_ParseScriptText
412 static inline VBScript *impl_from_IObjectSafety(IObjectSafety *iface)
414 return CONTAINING_RECORD(iface, VBScript, IObjectSafety_iface);
417 static HRESULT WINAPI VBScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
419 VBScript *This = impl_from_IObjectSafety(iface);
420 return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
423 static ULONG WINAPI VBScriptSafety_AddRef(IObjectSafety *iface)
425 VBScript *This = impl_from_IObjectSafety(iface);
426 return IActiveScript_AddRef(&This->IActiveScript_iface);
429 static ULONG WINAPI VBScriptSafety_Release(IObjectSafety *iface)
431 VBScript *This = impl_from_IObjectSafety(iface);
432 return IActiveScript_Release(&This->IActiveScript_iface);
435 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
437 static HRESULT WINAPI VBScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
438 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
440 VBScript *This = impl_from_IObjectSafety(iface);
442 TRACE("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
444 if(!pdwSupportedOptions || !pdwEnabledOptions)
447 *pdwSupportedOptions = SUPPORTED_OPTIONS;
448 *pdwEnabledOptions = This->safeopt;
452 static HRESULT WINAPI VBScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
453 DWORD dwOptionSetMask, DWORD dwEnabledOptions)
455 VBScript *This = impl_from_IObjectSafety(iface);
457 TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
459 if(dwOptionSetMask & ~SUPPORTED_OPTIONS)
462 This->safeopt = (dwEnabledOptions & dwOptionSetMask) | (This->safeopt & ~dwOptionSetMask) | INTERFACE_USES_DISPEX;
466 static const IObjectSafetyVtbl VBScriptSafetyVtbl = {
467 VBScriptSafety_QueryInterface,
468 VBScriptSafety_AddRef,
469 VBScriptSafety_Release,
470 VBScriptSafety_GetInterfaceSafetyOptions,
471 VBScriptSafety_SetInterfaceSafetyOptions
474 HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppv)
479 TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
481 ret = heap_alloc_zero(sizeof(*ret));
483 return E_OUTOFMEMORY;
485 ret->IActiveScript_iface.lpVtbl = &VBScriptVtbl;
486 ret->IActiveScriptParse_iface.lpVtbl = &VBScriptParseVtbl;
487 ret->IObjectSafety_iface.lpVtbl = &VBScriptSafetyVtbl;
490 ret->state = SCRIPTSTATE_UNINITIALIZED;
491 ret->safeopt = INTERFACE_USES_DISPEX;
493 hres = IActiveScript_QueryInterface(&ret->IActiveScript_iface, riid, ppv);
494 IActiveScript_Release(&ret->IActiveScript_iface);