2 * Copyright 2008 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
22 #include "wine/debug.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
27 const IActiveScriptVtbl *lpIActiveScriptVtbl;
28 const IActiveScriptParseVtbl *lpIActiveScriptParseVtbl;
29 const IActiveScriptParseProcedure2Vtbl *lpIActiveScriptParseProcedure2Vtbl;
30 const IActiveScriptPropertyVtbl *lpIActiveScriptPropertyVtbl;
31 const IObjectSafetyVtbl *lpIObjectSafetyVtbl;
39 #define ACTSCRIPT(x) ((IActiveScript*) &(x)->lpIActiveScriptVtbl)
40 #define ASPARSE(x) ((IActiveScriptParse*) &(x)->lpIActiveScriptParseVtbl)
41 #define ASPARSEPROC(x) ((IActiveScriptParseProcedure2*) &(x)->lpIActiveScriptParseProcedure2Vtbl)
42 #define ACTSCPPROP(x) ((IActiveScriptProperty*) &(x)->lpIActiveScriptPropertyVtbl)
43 #define OBJSAFETY(x) ((IObjectSafety*) &(x)->lpIObjectSafetyVtbl)
45 void script_release(script_ctx_t *ctx)
53 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
55 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
57 JScript *This = ACTSCRIPT_THIS(iface);
61 if(IsEqualGUID(riid, &IID_IUnknown)) {
62 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
63 *ppv = ACTSCRIPT(This);
64 }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
65 TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
66 *ppv = ACTSCRIPT(This);
67 }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
68 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
70 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure)) {
71 TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This, ppv);
72 *ppv = ASPARSEPROC(This);
73 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure2)) {
74 TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This, ppv);
75 *ppv = ASPARSEPROC(This);
76 }else if(IsEqualGUID(riid, &IID_IActiveScriptProperty)) {
77 TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This, ppv);
78 *ppv = ACTSCPPROP(This);
79 }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
80 TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
81 *ppv = OBJSAFETY(This);
85 IUnknown_AddRef((IUnknown*)*ppv);
89 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
93 static ULONG WINAPI JScript_AddRef(IActiveScript *iface)
95 JScript *This = ACTSCRIPT_THIS(iface);
96 LONG ref = InterlockedIncrement(&This->ref);
98 TRACE("(%p) ref=%d\n", This, ref);
103 static ULONG WINAPI JScript_Release(IActiveScript *iface)
105 JScript *This = ACTSCRIPT_THIS(iface);
106 LONG ref = InterlockedDecrement(&This->ref);
108 TRACE("(%p) ref=%d\n", iface, ref);
112 script_release(This->ctx);
120 static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
121 IActiveScriptSite *pass)
123 JScript *This = ACTSCRIPT_THIS(iface);
124 FIXME("(%p)->(%p)\n", This, pass);
128 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
131 JScript *This = ACTSCRIPT_THIS(iface);
132 FIXME("(%p)->()\n", This);
136 static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
138 JScript *This = ACTSCRIPT_THIS(iface);
139 FIXME("(%p)->(%d)\n", This, ss);
143 static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
145 JScript *This = ACTSCRIPT_THIS(iface);
146 FIXME("(%p)->(%p)\n", This, pssState);
150 static HRESULT WINAPI JScript_Close(IActiveScript *iface)
152 JScript *This = ACTSCRIPT_THIS(iface);
153 FIXME("(%p)->()\n", This);
157 static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
158 LPCOLESTR pstrName, DWORD dwFlags)
160 JScript *This = ACTSCRIPT_THIS(iface);
161 FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
165 static HRESULT WINAPI JScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
166 DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
168 JScript *This = ACTSCRIPT_THIS(iface);
169 FIXME("(%p)->()\n", This);
173 static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
176 JScript *This = ACTSCRIPT_THIS(iface);
177 FIXME("(%p)->()\n", This);
181 static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface,
182 SCRIPTTHREADID *pstridThread)
184 JScript *This = ACTSCRIPT_THIS(iface);
185 FIXME("(%p)->()\n", This);
189 static HRESULT WINAPI JScript_GetScriptThreadID(IActiveScript *iface,
190 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
192 JScript *This = ACTSCRIPT_THIS(iface);
193 FIXME("(%p)->()\n", This);
197 static HRESULT WINAPI JScript_GetScriptThreadState(IActiveScript *iface,
198 SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
200 JScript *This = ACTSCRIPT_THIS(iface);
201 FIXME("(%p)->()\n", This);
205 static HRESULT WINAPI JScript_InterruptScriptThread(IActiveScript *iface,
206 SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
208 JScript *This = ACTSCRIPT_THIS(iface);
209 FIXME("(%p)->()\n", This);
213 static HRESULT WINAPI JScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
215 JScript *This = ACTSCRIPT_THIS(iface);
216 FIXME("(%p)->()\n", This);
220 #undef ACTSCRIPT_THIS
222 static const IActiveScriptVtbl JScriptVtbl = {
223 JScript_QueryInterface,
226 JScript_SetScriptSite,
227 JScript_GetScriptSite,
228 JScript_SetScriptState,
229 JScript_GetScriptState,
231 JScript_AddNamedItem,
233 JScript_GetScriptDispatch,
234 JScript_GetCurrentScriptThreadID,
235 JScript_GetScriptThreadID,
236 JScript_GetScriptThreadState,
237 JScript_InterruptScriptThread,
241 #define ASPARSE_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
243 static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
245 JScript *This = ASPARSE_THIS(iface);
246 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
249 static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
251 JScript *This = ASPARSE_THIS(iface);
252 return IActiveScript_AddRef(ACTSCRIPT(This));
255 static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
257 JScript *This = ASPARSE_THIS(iface);
258 return IActiveScript_Release(ACTSCRIPT(This));
261 static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
263 JScript *This = ASPARSE_THIS(iface);
266 TRACE("(%p)\n", This);
271 ctx = heap_alloc_zero(sizeof(script_ctx_t));
273 return E_OUTOFMEMORY;
276 ctx->state = SCRIPTSTATE_UNINITIALIZED;
278 ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL);
287 static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
288 LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
289 LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
290 DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
291 BSTR *pbstrName, EXCEPINFO *pexcepinfo)
293 JScript *This = ASPARSE_THIS(iface);
294 FIXME("(%p)->(%s %s %s %s %s %s %x %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
295 debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
296 debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), dwSourceContextCookie,
297 ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
301 static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
302 LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
303 LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine,
304 DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
306 JScript *This = ASPARSE_THIS(iface);
307 FIXME("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode),
308 debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
309 dwSourceContextCookie, ulStartingLine, dwFlags, pvarResult, pexcepinfo);
315 static const IActiveScriptParseVtbl JScriptParseVtbl = {
316 JScriptParse_QueryInterface,
318 JScriptParse_Release,
319 JScriptParse_InitNew,
320 JScriptParse_AddScriptlet,
321 JScriptParse_ParseScriptText
324 #define ASPARSEPROC_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
326 static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
328 JScript *This = ASPARSEPROC_THIS(iface);
329 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
332 static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
334 JScript *This = ASPARSEPROC_THIS(iface);
335 return IActiveScript_AddRef(ACTSCRIPT(This));
338 static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
340 JScript *This = ASPARSEPROC_THIS(iface);
341 return IActiveScript_Release(ACTSCRIPT(This));
344 static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
345 LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
346 LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
347 DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
349 JScript *This = ASPARSEPROC_THIS(iface);
350 FIXME("(%p)->()\n", This);
354 #undef ASPARSEPROC_THIS
356 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl = {
357 JScriptParseProcedure_QueryInterface,
358 JScriptParseProcedure_AddRef,
359 JScriptParseProcedure_Release,
360 JScriptParseProcedure_ParseProcedureText,
363 #define ACTSCPPROP_THIS(iface) DEFINE_THIS(JScript, IActiveScriptProperty, iface)
365 static HRESULT WINAPI JScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
367 JScript *This = ACTSCPPROP_THIS(iface);
368 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
371 static ULONG WINAPI JScriptProperty_AddRef(IActiveScriptProperty *iface)
373 JScript *This = ACTSCPPROP_THIS(iface);
374 return IActiveScript_AddRef(ACTSCRIPT(This));
377 static ULONG WINAPI JScriptProperty_Release(IActiveScriptProperty *iface)
379 JScript *This = ACTSCPPROP_THIS(iface);
380 return IActiveScript_Release(ACTSCRIPT(This));
383 static HRESULT WINAPI JScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
384 VARIANT *pvarIndex, VARIANT *pvarValue)
386 JScript *This = ACTSCPPROP_THIS(iface);
387 FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
391 static HRESULT WINAPI JScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
392 VARIANT *pvarIndex, VARIANT *pvarValue)
394 JScript *This = ACTSCPPROP_THIS(iface);
395 FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
399 #undef ACTSCPPROP_THIS
401 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl = {
402 JScriptProperty_QueryInterface,
403 JScriptProperty_AddRef,
404 JScriptProperty_Release,
405 JScriptProperty_GetProperty,
406 JScriptProperty_SetProperty
409 #define OBJSAFETY_THIS(iface) DEFINE_THIS(JScript, IObjectSafety, iface)
411 static HRESULT WINAPI JScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
413 JScript *This = OBJSAFETY_THIS(iface);
414 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
417 static ULONG WINAPI JScriptSafety_AddRef(IObjectSafety *iface)
419 JScript *This = OBJSAFETY_THIS(iface);
420 return IActiveScript_AddRef(ACTSCRIPT(This));
423 static ULONG WINAPI JScriptSafety_Release(IObjectSafety *iface)
425 JScript *This = OBJSAFETY_THIS(iface);
426 return IActiveScript_Release(ACTSCRIPT(This));
429 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
431 static HRESULT WINAPI JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
432 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
434 JScript *This = OBJSAFETY_THIS(iface);
436 TRACE("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
438 if(!pdwSupportedOptions || !pdwEnabledOptions)
441 *pdwSupportedOptions = SUPPORTED_OPTIONS;
442 *pdwEnabledOptions = This->safeopt;
447 static HRESULT WINAPI JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
448 DWORD dwOptionSetMask, DWORD dwEnabledOptions)
450 JScript *This = OBJSAFETY_THIS(iface);
452 TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
454 if(dwOptionSetMask & ~SUPPORTED_OPTIONS)
457 This->safeopt = dwEnabledOptions & dwEnabledOptions;
461 #undef OBJSAFETY_THIS
463 static const IObjectSafetyVtbl JScriptSafetyVtbl = {
464 JScriptSafety_QueryInterface,
465 JScriptSafety_AddRef,
466 JScriptSafety_Release,
467 JScriptSafety_GetInterfaceSafetyOptions,
468 JScriptSafety_SetInterfaceSafetyOptions
471 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter,
472 REFIID riid, void **ppv)
477 TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
481 ret = heap_alloc_zero(sizeof(*ret));
483 ret->lpIActiveScriptVtbl = &JScriptVtbl;
484 ret->lpIActiveScriptParseVtbl = &JScriptParseVtbl;
485 ret->lpIActiveScriptParseProcedure2Vtbl = &JScriptParseProcedureVtbl;
486 ret->lpIActiveScriptPropertyVtbl = &JScriptPropertyVtbl;
487 ret->lpIObjectSafetyVtbl = &JScriptSafetyVtbl;
489 ret->safeopt = INTERFACE_USES_DISPEX;
491 hres = IActiveScript_QueryInterface(ACTSCRIPT(ret), riid, ppv);
492 IActiveScript_Release(ACTSCRIPT(ret));