ddraw: Fix some code unprotected by ddraw lock.
[wine.git] / dlls / jscript / jscript.c
blobf058e265d40f411808fc77d5f08df7cd68e43c7e
1 /*
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
19 #include "jscript.h"
20 #include "activscp.h"
21 #include "objsafe.h"
23 #include "wine/debug.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
27 typedef struct {
28 const IActiveScriptVtbl *lpIActiveScriptVtbl;
29 const IActiveScriptParseVtbl *lpIActiveScriptParseVtbl;
30 const IActiveScriptParseProcedure2Vtbl *lpIActiveScriptParseProcedure2Vtbl;
31 const IActiveScriptPropertyVtbl *lpIActiveScriptPropertyVtbl;
32 const IObjectSafetyVtbl *lpIObjectSafetyVtbl;
34 LONG ref;
36 DWORD safeopt;
37 } JScript;
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 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
47 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
49 JScript *This = ACTSCRIPT_THIS(iface);
51 *ppv = NULL;
53 if(IsEqualGUID(riid, &IID_IUnknown)) {
54 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
55 *ppv = ACTSCRIPT(This);
56 }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
57 TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
58 *ppv = ACTSCRIPT(This);
59 }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
60 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
61 *ppv = ASPARSE(This);
62 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure)) {
63 TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This, ppv);
64 *ppv = ASPARSEPROC(This);
65 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure2)) {
66 TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This, ppv);
67 *ppv = ASPARSEPROC(This);
68 }else if(IsEqualGUID(riid, &IID_IActiveScriptProperty)) {
69 TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This, ppv);
70 *ppv = ACTSCPPROP(This);
71 }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
72 TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
73 *ppv = OBJSAFETY(This);
76 if(*ppv) {
77 IUnknown_AddRef((IUnknown*)*ppv);
78 return S_OK;
81 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
82 return E_NOINTERFACE;
85 static ULONG WINAPI JScript_AddRef(IActiveScript *iface)
87 JScript *This = ACTSCRIPT_THIS(iface);
88 LONG ref = InterlockedIncrement(&This->ref);
90 TRACE("(%p) ref=%d\n", This, ref);
92 return ref;
95 static ULONG WINAPI JScript_Release(IActiveScript *iface)
97 JScript *This = ACTSCRIPT_THIS(iface);
98 LONG ref = InterlockedDecrement(&This->ref);
100 TRACE("(%p) ref=%d\n", iface, ref);
102 if(!ref) {
103 heap_free(This);
104 unlock_module();
107 return ref;
110 static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
111 IActiveScriptSite *pass)
113 JScript *This = ACTSCRIPT_THIS(iface);
114 FIXME("(%p)->(%p)\n", This, pass);
115 return E_NOTIMPL;
118 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
119 void **ppvObject)
121 JScript *This = ACTSCRIPT_THIS(iface);
122 FIXME("(%p)->()\n", This);
123 return E_NOTIMPL;
126 static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
128 JScript *This = ACTSCRIPT_THIS(iface);
129 FIXME("(%p)->(%d)\n", This, ss);
130 return E_NOTIMPL;
133 static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
135 JScript *This = ACTSCRIPT_THIS(iface);
136 FIXME("(%p)->(%p)\n", This, pssState);
137 return E_NOTIMPL;
140 static HRESULT WINAPI JScript_Close(IActiveScript *iface)
142 JScript *This = ACTSCRIPT_THIS(iface);
143 FIXME("(%p)->()\n", This);
144 return E_NOTIMPL;
147 static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
148 LPCOLESTR pstrName, DWORD dwFlags)
150 JScript *This = ACTSCRIPT_THIS(iface);
151 FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
152 return E_NOTIMPL;
155 static HRESULT WINAPI JScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
156 DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
158 JScript *This = ACTSCRIPT_THIS(iface);
159 FIXME("(%p)->()\n", This);
160 return E_NOTIMPL;
163 static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
164 IDispatch **ppdisp)
166 JScript *This = ACTSCRIPT_THIS(iface);
167 FIXME("(%p)->()\n", This);
168 return E_NOTIMPL;
171 static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface,
172 SCRIPTTHREADID *pstridThread)
174 JScript *This = ACTSCRIPT_THIS(iface);
175 FIXME("(%p)->()\n", This);
176 return E_NOTIMPL;
179 static HRESULT WINAPI JScript_GetScriptThreadID(IActiveScript *iface,
180 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
182 JScript *This = ACTSCRIPT_THIS(iface);
183 FIXME("(%p)->()\n", This);
184 return E_NOTIMPL;
187 static HRESULT WINAPI JScript_GetScriptThreadState(IActiveScript *iface,
188 SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
190 JScript *This = ACTSCRIPT_THIS(iface);
191 FIXME("(%p)->()\n", This);
192 return E_NOTIMPL;
195 static HRESULT WINAPI JScript_InterruptScriptThread(IActiveScript *iface,
196 SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
198 JScript *This = ACTSCRIPT_THIS(iface);
199 FIXME("(%p)->()\n", This);
200 return E_NOTIMPL;
203 static HRESULT WINAPI JScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
205 JScript *This = ACTSCRIPT_THIS(iface);
206 FIXME("(%p)->()\n", This);
207 return E_NOTIMPL;
210 #undef ACTSCRIPT_THIS
212 static const IActiveScriptVtbl JScriptVtbl = {
213 JScript_QueryInterface,
214 JScript_AddRef,
215 JScript_Release,
216 JScript_SetScriptSite,
217 JScript_GetScriptSite,
218 JScript_SetScriptState,
219 JScript_GetScriptState,
220 JScript_Close,
221 JScript_AddNamedItem,
222 JScript_AddTypeLib,
223 JScript_GetScriptDispatch,
224 JScript_GetCurrentScriptThreadID,
225 JScript_GetScriptThreadID,
226 JScript_GetScriptThreadState,
227 JScript_InterruptScriptThread,
228 JScript_Clone
231 #define ASPARSE_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
233 static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
235 JScript *This = ASPARSE_THIS(iface);
236 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
239 static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
241 JScript *This = ASPARSE_THIS(iface);
242 return IActiveScript_AddRef(ACTSCRIPT(This));
245 static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
247 JScript *This = ASPARSE_THIS(iface);
248 return IActiveScript_Release(ACTSCRIPT(This));
251 static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
253 JScript *This = ASPARSE_THIS(iface);
254 FIXME("(%p)\n", This);
255 return E_NOTIMPL;
258 static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
259 LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
260 LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
261 DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
262 BSTR *pbstrName, EXCEPINFO *pexcepinfo)
264 JScript *This = ASPARSE_THIS(iface);
265 FIXME("(%p)->(%s %s %s %s %s %s %x %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
266 debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
267 debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), dwSourceContextCookie,
268 ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
269 return E_NOTIMPL;
272 static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
273 LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
274 LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine,
275 DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
277 JScript *This = ASPARSE_THIS(iface);
278 FIXME("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode),
279 debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
280 dwSourceContextCookie, ulStartingLine, dwFlags, pvarResult, pexcepinfo);
281 return E_NOTIMPL;
284 #undef ASPARSE_THIS
286 static const IActiveScriptParseVtbl JScriptParseVtbl = {
287 JScriptParse_QueryInterface,
288 JScriptParse_AddRef,
289 JScriptParse_Release,
290 JScriptParse_InitNew,
291 JScriptParse_AddScriptlet,
292 JScriptParse_ParseScriptText
295 #define ASPARSEPROC_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
297 static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
299 JScript *This = ASPARSEPROC_THIS(iface);
300 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
303 static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
305 JScript *This = ASPARSEPROC_THIS(iface);
306 return IActiveScript_AddRef(ACTSCRIPT(This));
309 static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
311 JScript *This = ASPARSEPROC_THIS(iface);
312 return IActiveScript_Release(ACTSCRIPT(This));
315 static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
316 LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
317 LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
318 DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
320 JScript *This = ASPARSEPROC_THIS(iface);
321 FIXME("(%p)->()\n", This);
322 return E_NOTIMPL;
325 #undef ASPARSEPROC_THIS
327 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl = {
328 JScriptParseProcedure_QueryInterface,
329 JScriptParseProcedure_AddRef,
330 JScriptParseProcedure_Release,
331 JScriptParseProcedure_ParseProcedureText,
334 #define ACTSCPPROP_THIS(iface) DEFINE_THIS(JScript, IActiveScriptProperty, iface)
336 static HRESULT WINAPI JScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
338 JScript *This = ACTSCPPROP_THIS(iface);
339 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
342 static ULONG WINAPI JScriptProperty_AddRef(IActiveScriptProperty *iface)
344 JScript *This = ACTSCPPROP_THIS(iface);
345 return IActiveScript_AddRef(ACTSCRIPT(This));
348 static ULONG WINAPI JScriptProperty_Release(IActiveScriptProperty *iface)
350 JScript *This = ACTSCPPROP_THIS(iface);
351 return IActiveScript_Release(ACTSCRIPT(This));
354 static HRESULT WINAPI JScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
355 VARIANT *pvarIndex, VARIANT *pvarValue)
357 JScript *This = ACTSCPPROP_THIS(iface);
358 FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
359 return E_NOTIMPL;
362 static HRESULT WINAPI JScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
363 VARIANT *pvarIndex, VARIANT *pvarValue)
365 JScript *This = ACTSCPPROP_THIS(iface);
366 FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
367 return E_NOTIMPL;
370 #undef ACTSCPPROP_THIS
372 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl = {
373 JScriptProperty_QueryInterface,
374 JScriptProperty_AddRef,
375 JScriptProperty_Release,
376 JScriptProperty_GetProperty,
377 JScriptProperty_SetProperty
380 #define OBJSAFETY_THIS(iface) DEFINE_THIS(JScript, IObjectSafety, iface)
382 static HRESULT WINAPI JScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
384 JScript *This = OBJSAFETY_THIS(iface);
385 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
388 static ULONG WINAPI JScriptSafety_AddRef(IObjectSafety *iface)
390 JScript *This = OBJSAFETY_THIS(iface);
391 return IActiveScript_AddRef(ACTSCRIPT(This));
394 static ULONG WINAPI JScriptSafety_Release(IObjectSafety *iface)
396 JScript *This = OBJSAFETY_THIS(iface);
397 return IActiveScript_Release(ACTSCRIPT(This));
400 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
402 static HRESULT WINAPI JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
403 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
405 JScript *This = OBJSAFETY_THIS(iface);
407 TRACE("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
409 if(!pdwSupportedOptions || !pdwEnabledOptions)
410 return E_POINTER;
412 *pdwSupportedOptions = SUPPORTED_OPTIONS;
413 *pdwEnabledOptions = This->safeopt;
415 return S_OK;
418 static HRESULT WINAPI JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
419 DWORD dwOptionSetMask, DWORD dwEnabledOptions)
421 JScript *This = OBJSAFETY_THIS(iface);
423 TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
425 if(dwOptionSetMask & ~SUPPORTED_OPTIONS)
426 return E_FAIL;
428 This->safeopt = dwEnabledOptions & dwEnabledOptions;
429 return S_OK;
432 #undef OBJSAFETY_THIS
434 static const IObjectSafetyVtbl JScriptSafetyVtbl = {
435 JScriptSafety_QueryInterface,
436 JScriptSafety_AddRef,
437 JScriptSafety_Release,
438 JScriptSafety_GetInterfaceSafetyOptions,
439 JScriptSafety_SetInterfaceSafetyOptions
442 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter,
443 REFIID riid, void **ppv)
445 JScript *ret;
446 HRESULT hres;
448 TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
450 lock_module();
452 ret = heap_alloc(sizeof(*ret));
454 ret->lpIActiveScriptVtbl = &JScriptVtbl;
455 ret->lpIActiveScriptParseVtbl = &JScriptParseVtbl;
456 ret->lpIActiveScriptParseProcedure2Vtbl = &JScriptParseProcedureVtbl;
457 ret->lpIActiveScriptPropertyVtbl = &JScriptPropertyVtbl;
458 ret->lpIObjectSafetyVtbl = &JScriptSafetyVtbl;
459 ret->ref = 1;
460 ret->safeopt = INTERFACE_USES_DISPEX;
462 hres = IActiveScript_QueryInterface(ACTSCRIPT(ret), riid, ppv);
463 IActiveScript_Release(ACTSCRIPT(ret));
464 return hres;