1 /*
2 * Copyright 2008 Jacek Caban for CodeWeavers
3 *
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.
8 *
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.
13 *
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
17 */
18
19 #include "jscript.h"
20 #include "engine.h"
21 #include "objsafe.h"
22
23 #include "wine/debug.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
26
27 typedef struct {
28 const IActiveScriptVtbl *lpIActiveScriptVtbl;
29 const IActiveScriptParseVtbl *lpIActiveScriptParseVtbl;
30 const IActiveScriptParseProcedure2Vtbl *lpIActiveScriptParseProcedure2Vtbl;
31 const IActiveScriptPropertyVtbl *lpIActiveScriptPropertyVtbl;
32 const IObjectSafetyVtbl *lpIObjectSafetyVtbl;
33
34 LONG ref;
35
36 DWORD safeopt;
37 script_ctx_t *ctx;
38 LONG thread_id;
39
40 IActiveScriptSite *site;
41
42 parser_ctx_t *queue_head;
43 parser_ctx_t *queue_tail;
44 } JScript;
45
46 #define ACTSCRIPT(x) ((IActiveScript*) &(x)->lpIActiveScriptVtbl)
47 #define ASPARSE(x) ((IActiveScriptParse*) &(x)->lpIActiveScriptParseVtbl)
48 #define ASPARSEPROC(x) ((IActiveScriptParseProcedure2*) &(x)->lpIActiveScriptParseProcedure2Vtbl)
49 #define ACTSCPPROP(x) ((IActiveScriptProperty*) &(x)->lpIActiveScriptPropertyVtbl)
50 #define OBJSAFETY(x) ((IObjectSafety*) &(x)->lpIObjectSafetyVtbl)
51
52 void script_release(script_ctx_t *ctx)
53 {
54 if(--ctx->ref)
55 return;
56
57 heap_free(ctx);
58 }
59
60 static void change_state(JScript *This, SCRIPTSTATE state)
61 {
62 if(This->ctx->state == state)
63 return;
64
65 This->ctx->state = state;
66 IActiveScriptSite_OnStateChange(This->site, state);
67 }
68
69 static inline BOOL is_started(script_ctx_t *ctx)
70 {
71 return ctx->state == SCRIPTSTATE_STARTED
72 || ctx->state == SCRIPTSTATE_CONNECTED
73 || ctx->state == SCRIPTSTATE_DISCONNECTED;
74 }
75
76 static HRESULT exec_global_code(JScript *This, parser_ctx_t *parser_ctx)
77 {
78 exec_ctx_t *exec_ctx;
79 jsexcept_t jsexcept;
80 VARIANT var;
81 HRESULT hres;
82
83 hres = create_exec_ctx(&exec_ctx);
84 if(FAILED(hres))
85 return hres;
86
87 IActiveScriptSite_OnEnterScript(This->site);
88
89 memset(&jsexcept, 0, sizeof(jsexcept));
90 hres = exec_source(exec_ctx, parser_ctx, parser_ctx->source, &jsexcept, &var);
91 VariantClear(&jsexcept.var);
92 exec_release(exec_ctx);
93 if(SUCCEEDED(hres))
94 VariantClear(&var);
95
96 IActiveScriptSite_OnLeaveScript(This->site);
97
98 return hres;
99 }
100
101 static void clear_script_queue(JScript *This)
102 {
103 parser_ctx_t *iter, *iter2;
104
105 if(!This->queue_head)
106 return;
107
108 iter = This->queue_head;
109 while(iter) {
110 iter2 = iter->next;
111 iter->next = NULL;
112 parser_release(iter);
113 iter = iter2;
114 }
115
116 This->queue_head = This->queue_tail = NULL;
117 }
118
119 static void exec_queued_code(JScript *This)
120 {
121 parser_ctx_t *iter;
122
123 for(iter = This->queue_head; iter; iter = iter->next)
124 exec_global_code(This, iter);
125
126 clear_script_queue(This);
127 }
128
129 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
130
131 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
132 {
133 JScript *This = ACTSCRIPT_THIS(iface);
134
135 *ppv = NULL;
136
137 if(IsEqualGUID(riid, &IID_IUnknown)) {
138 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
139 *ppv = ACTSCRIPT(This);
140 }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
141 TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
142 *ppv = ACTSCRIPT(This);
143 }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
144 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
145 *ppv = ASPARSE(This);
146 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure)) {
147 TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This, ppv);
148 *ppv = ASPARSEPROC(This);
149 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure2)) {
150 TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This, ppv);
151 *ppv = ASPARSEPROC(This);
152 }else if(IsEqualGUID(riid, &IID_IActiveScriptProperty)) {
153 TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This, ppv);
154 *ppv = ACTSCPPROP(This);
155 }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
156 TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
157 *ppv = OBJSAFETY(This);
158 }
159
160 if(*ppv) {
161 IUnknown_AddRef((IUnknown*)*ppv);
162 return S_OK;
163 }
164
165 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
166 return E_NOINTERFACE;
167 }
168
169 static ULONG WINAPI JScript_AddRef(IActiveScript *iface)
170 {
171 JScript *This = ACTSCRIPT_THIS(iface);
172 LONG ref = InterlockedIncrement(&This->ref);
173
174 TRACE("(%p) ref=%d\n", This, ref);
175
176 return ref;
177 }
178
179 static ULONG WINAPI JScript_Release(IActiveScript *iface)
180 {
181 JScript *This = ACTSCRIPT_THIS(iface);
182 LONG ref = InterlockedDecrement(&This->ref);
183
184 TRACE("(%p) ref=%d\n", iface, ref);
185
186 if(!ref) {
187 if(This->ctx && This->ctx->state != SCRIPTSTATE_CLOSED)
188 IActiveScript_Close(ACTSCRIPT(This));
189 if(This->ctx)
190 script_release(This->ctx);
191 heap_free(This);
192 unlock_module();
193 }
194
195 return ref;
196 }
197
198 static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
199 IActiveScriptSite *pass)
200 {
201 JScript *This = ACTSCRIPT_THIS(iface);
202 LCID lcid;
203 HRESULT hres;
204
205 TRACE("(%p)->(%p)\n", This, pass);
206
207 if(!pass)
208 return E_POINTER;
209
210 if(This->site)
211 return E_UNEXPECTED;
212
213 if(!This->ctx) {
214 hres = IActiveScriptParse_InitNew(ASPARSE(This));
215 if(FAILED(hres))
216 return hres;
217 }
218
219 hres = create_dispex(This->ctx, &This->ctx->script_disp);
220 if(FAILED(hres))
221 return hres;
222
223 if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
224 return E_UNEXPECTED;
225
226 This->site = pass;
227 IActiveScriptSite_AddRef(This->site);
228
229 hres = IActiveScriptSite_GetLCID(This->site, &lcid);
230 if(hres == S_OK)
231 This->ctx->lcid = lcid;
232
233 change_state(This, SCRIPTSTATE_INITIALIZED);
234 return S_OK;
235 }
236
237 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
238 void **ppvObject)
239 {
240 JScript *This = ACTSCRIPT_THIS(iface);
241 FIXME("(%p)->()\n", This);
242 return E_NOTIMPL;
243 }
244
245 static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
246 {
247 JScript *This = ACTSCRIPT_THIS(iface);
248
249 TRACE("(%p)->(%d)\n", This, ss);
250
251 if(!This->ctx || GetCurrentThreadId() != This->thread_id)
252 return E_UNEXPECTED;
253
254 switch(ss) {
255 case SCRIPTSTATE_STARTED:
256 if(This->ctx->state == SCRIPTSTATE_CLOSED)
257 return E_UNEXPECTED;
258
259 exec_queued_code(This);
260 break;
261 default:
262 FIXME("unimplemented state %d\n", ss);
263 return E_NOTIMPL;
264 }
265
266 change_state(This, ss);
267 return S_OK;
268 }
269
270 static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
271 {
272 JScript *This = ACTSCRIPT_THIS(iface);
273
274 TRACE("(%p)->(%p)\n", This, pssState);
275
276 if(!pssState)
277 return E_POINTER;
278
279 if(!This->thread_id) {
280 *pssState = SCRIPTSTATE_UNINITIALIZED;
281 return S_OK;
282 }
283
284 if(This->thread_id != GetCurrentThreadId())
285 return E_UNEXPECTED;
286
287 *pssState = This->ctx ? This->ctx->state : SCRIPTSTATE_UNINITIALIZED;
288 return S_OK;
289 }
290
291 static HRESULT WINAPI JScript_Close(IActiveScript *iface)
292 {
293 JScript *This = ACTSCRIPT_THIS(iface);
294
295 TRACE("(%p)->()\n", This);
296
297 if(This->thread_id != GetCurrentThreadId())
298 return E_UNEXPECTED;
299
300 clear_script_queue(This);
301
302 if(This->ctx) {
303 change_state(This, SCRIPTSTATE_CLOSED);
304
305 if(This->ctx->script_disp) {
306 IDispatchEx_Release(_IDispatchEx_(This->ctx->script_disp));
307 This->ctx->script_disp = NULL;
308 }
309 }
310
311 if(This->site) {
312 IActiveScriptSite_Release(This->site);
313 This->site = NULL;
314 }
315
316 return S_OK;
317 }
318
319 static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
320 LPCOLESTR pstrName, DWORD dwFlags)
321 {
322 JScript *This = ACTSCRIPT_THIS(iface);
323 FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
324 return E_NOTIMPL;
325 }
326
327 static HRESULT WINAPI JScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
328 DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
329 {
330 JScript *This = ACTSCRIPT_THIS(iface);
331 FIXME("(%p)->()\n", This);
332 return E_NOTIMPL;
333 }
334
335 static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
336 IDispatch **ppdisp)
337 {
338 JScript *This = ACTSCRIPT_THIS(iface);
339
340 TRACE("(%p)->(%p)\n", This, ppdisp);
341
342 if(!ppdisp)
343 return E_POINTER;
344
345 if(This->thread_id != GetCurrentThreadId() || !This->ctx->script_disp) {
346 *ppdisp = NULL;
347 return E_UNEXPECTED;
348 }
349
350 *ppdisp = (IDispatch*)_IDispatchEx_(This->ctx->script_disp);
351 IDispatch_AddRef(*ppdisp);
352 return S_OK;
353 }
354
355 static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface,
356 SCRIPTTHREADID *pstridThread)
357 {
358 JScript *This = ACTSCRIPT_THIS(iface);
359 FIXME("(%p)->()\n", This);
360 return E_NOTIMPL;
361 }
362
363 static HRESULT WINAPI JScript_GetScriptThreadID(IActiveScript *iface,
364 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
365 {
366 JScript *This = ACTSCRIPT_THIS(iface);
367 FIXME("(%p)->()\n", This);
368 return E_NOTIMPL;
369 }
370
371 static HRESULT WINAPI JScript_GetScriptThreadState(IActiveScript *iface,
372 SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
373 {
374 JScript *This = ACTSCRIPT_THIS(iface);
375 FIXME("(%p)->()\n", This);
376 return E_NOTIMPL;
377 }
378
379 static HRESULT WINAPI JScript_InterruptScriptThread(IActiveScript *iface,
380 SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
381 {
382 JScript *This = ACTSCRIPT_THIS(iface);
383 FIXME("(%p)->()\n", This);
384 return E_NOTIMPL;
385 }
386
387 static HRESULT WINAPI JScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
388 {
389 JScript *This = ACTSCRIPT_THIS(iface);
390 FIXME("(%p)->()\n", This);
391 return E_NOTIMPL;
392 }
393
394 #undef ACTSCRIPT_THIS
395
396 static const IActiveScriptVtbl JScriptVtbl = {
397 JScript_QueryInterface,
398 JScript_AddRef,
399 JScript_Release,
400 JScript_SetScriptSite,
401 JScript_GetScriptSite,
402 JScript_SetScriptState,
403 JScript_GetScriptState,
404 JScript_Close,
405 JScript_AddNamedItem,
406 JScript_AddTypeLib,
407 JScript_GetScriptDispatch,
408 JScript_GetCurrentScriptThreadID,
409 JScript_GetScriptThreadID,
410 JScript_GetScriptThreadState,
411 JScript_InterruptScriptThread,
412 JScript_Clone
413 };
414
415 #define ASPARSE_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
416
417 static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
418 {
419 JScript *This = ASPARSE_THIS(iface);
420 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
421 }
422
423 static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
424 {
425 JScript *This = ASPARSE_THIS(iface);
426 return IActiveScript_AddRef(ACTSCRIPT(This));
427 }
428
429 static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
430 {
431 JScript *This = ASPARSE_THIS(iface);
432 return IActiveScript_Release(ACTSCRIPT(This));
433 }
434
435 static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
436 {
437 JScript *This = ASPARSE_THIS(iface);
438 script_ctx_t *ctx;
439
440 TRACE("(%p)\n", This);
441
442 if(This->ctx)
443 return E_UNEXPECTED;
444
445 ctx = heap_alloc_zero(sizeof(script_ctx_t));
446 if(!ctx)
447 return E_OUTOFMEMORY;
448
449 ctx->ref = 1;
450 ctx->state = SCRIPTSTATE_UNINITIALIZED;
451
452 ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL);
453 if(ctx) {
454 script_release(ctx);
455 return E_UNEXPECTED;
456 }
457
458 return S_OK;
459 }
460
461 static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
462 LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
463 LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
464 DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
465 BSTR *pbstrName, EXCEPINFO *pexcepinfo)
466 {
467 JScript *This = ASPARSE_THIS(iface);
468 FIXME("(%p)->(%s %s %s %s %s %s %x %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
469 debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
470 debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), dwSourceContextCookie,
471 ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
472 return E_NOTIMPL;
473 }
474
475 static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
476 LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
477 LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine,
478 DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
479 {
480 JScript *This = ASPARSE_THIS(iface);
481 parser_ctx_t *parser_ctx;
482 HRESULT hres;
483
484 TRACE("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode),
485 debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
486 dwSourceContextCookie, ulStartingLine, dwFlags, pvarResult, pexcepinfo);
487
488 if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
489 return E_UNEXPECTED;
490
491 hres = script_parse(This->ctx, pstrCode, &parser_ctx);
492 if(FAILED(hres))
493 return hres;
494
495 if(!is_started(This->ctx)) {
496 if(This->queue_tail)
497 This->queue_tail = This->queue_tail->next = parser_ctx;
498 else
499 This->queue_head = This->queue_tail = parser_ctx;
500 return S_OK;
501 }
502
503 hres = exec_global_code(This, parser_ctx);
504 parser_release(parser_ctx);
505
506 return hres;
507 }
508
509 #undef ASPARSE_THIS
510
511 static const IActiveScriptParseVtbl JScriptParseVtbl = {
512 JScriptParse_QueryInterface,
513 JScriptParse_AddRef,
514 JScriptParse_Release,
515 JScriptParse_InitNew,
516 JScriptParse_AddScriptlet,
517 JScriptParse_ParseScriptText
518 };
519
520 #define ASPARSEPROC_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
521
522 static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
523 {
524 JScript *This = ASPARSEPROC_THIS(iface);
525 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
526 }
527
528 static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
529 {
530 JScript *This = ASPARSEPROC_THIS(iface);
531 return IActiveScript_AddRef(ACTSCRIPT(This));
532 }
533
534 static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
535 {
536 JScript *This = ASPARSEPROC_THIS(iface);
537 return IActiveScript_Release(ACTSCRIPT(This));
538 }
539
540 static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
541 LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
542 LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
543 DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
544 {
545 JScript *This = ASPARSEPROC_THIS(iface);
546 FIXME("(%p)->()\n", This);
547 return E_NOTIMPL;
548 }
549
550 #undef ASPARSEPROC_THIS
551
552 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl = {
553 JScriptParseProcedure_QueryInterface,
554 JScriptParseProcedure_AddRef,
555 JScriptParseProcedure_Release,
556 JScriptParseProcedure_ParseProcedureText,
557 };
558
559 #define ACTSCPPROP_THIS(iface) DEFINE_THIS(JScript, IActiveScriptProperty, iface)
560
561 static HRESULT WINAPI JScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
562 {
563 JScript *This = ACTSCPPROP_THIS(iface);
564 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
565 }
566
567 static ULONG WINAPI JScriptProperty_AddRef(IActiveScriptProperty *iface)
568 {
569 JScript *This = ACTSCPPROP_THIS(iface);
570 return IActiveScript_AddRef(ACTSCRIPT(This));
571 }
572
573 static ULONG WINAPI JScriptProperty_Release(IActiveScriptProperty *iface)
574 {
575 JScript *This = ACTSCPPROP_THIS(iface);
576 return IActiveScript_Release(ACTSCRIPT(This));
577 }
578
579 static HRESULT WINAPI JScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
580 VARIANT *pvarIndex, VARIANT *pvarValue)
581 {
582 JScript *This = ACTSCPPROP_THIS(iface);
583 FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
584 return E_NOTIMPL;
585 }
586
587 static HRESULT WINAPI JScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
588 VARIANT *pvarIndex, VARIANT *pvarValue)
589 {
590 JScript *This = ACTSCPPROP_THIS(iface);
591 FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
592 return E_NOTIMPL;
593 }
594
595 #undef ACTSCPPROP_THIS
596
597 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl = {
598 JScriptProperty_QueryInterface,
599 JScriptProperty_AddRef,
600 JScriptProperty_Release,
601 JScriptProperty_GetProperty,
602 JScriptProperty_SetProperty
603 };
604
605 #define OBJSAFETY_THIS(iface) DEFINE_THIS(JScript, IObjectSafety, iface)
606
607 static HRESULT WINAPI JScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
608 {
609 JScript *This = OBJSAFETY_THIS(iface);
610 return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
611 }
612
613 static ULONG WINAPI JScriptSafety_AddRef(IObjectSafety *iface)
614 {
615 JScript *This = OBJSAFETY_THIS(iface);
616 return IActiveScript_AddRef(ACTSCRIPT(This));
617 }
618
619 static ULONG WINAPI JScriptSafety_Release(IObjectSafety *iface)
620 {
621 JScript *This = OBJSAFETY_THIS(iface);
622 return IActiveScript_Release(ACTSCRIPT(This));
623 }
624
625 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
626
627 static HRESULT WINAPI JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
628 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
629 {
630 JScript *This = OBJSAFETY_THIS(iface);
631
632 TRACE("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
633
634 if(!pdwSupportedOptions || !pdwEnabledOptions)
635 return E_POINTER;
636
637 *pdwSupportedOptions = SUPPORTED_OPTIONS;
638 *pdwEnabledOptions = This->safeopt;
639
640 return S_OK;
641 }
642
643 static HRESULT WINAPI JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
644 DWORD dwOptionSetMask, DWORD dwEnabledOptions)
645 {
646 JScript *This = OBJSAFETY_THIS(iface);
647
648 TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
649
650 if(dwOptionSetMask & ~SUPPORTED_OPTIONS)
651 return E_FAIL;
652
653 This->safeopt = dwEnabledOptions & dwEnabledOptions;
654 return S_OK;
655 }
656
657 #undef OBJSAFETY_THIS
658
659 static const IObjectSafetyVtbl JScriptSafetyVtbl = {
660 JScriptSafety_QueryInterface,
661 JScriptSafety_AddRef,
662 JScriptSafety_Release,
663 JScriptSafety_GetInterfaceSafetyOptions,
664 JScriptSafety_SetInterfaceSafetyOptions
665 };
666
667 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter,
668 REFIID riid, void **ppv)
669 {
670 JScript *ret;
671 HRESULT hres;
672
673 TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
674
675 lock_module();
676
677 ret = heap_alloc_zero(sizeof(*ret));
678
679 ret->lpIActiveScriptVtbl = &JScriptVtbl;
680 ret->lpIActiveScriptParseVtbl = &JScriptParseVtbl;
681 ret->lpIActiveScriptParseProcedure2Vtbl = &JScriptParseProcedureVtbl;
682 ret->lpIActiveScriptPropertyVtbl = &JScriptPropertyVtbl;
683 ret->lpIObjectSafetyVtbl = &JScriptSafetyVtbl;
684 ret->ref = 1;
685 ret->safeopt = INTERFACE_USES_DISPEX;
686
687 hres = IActiveScript_QueryInterface(ACTSCRIPT(ret), riid, ppv);
688 IActiveScript_Release(ACTSCRIPT(ret));
689 return hres;
690 }
691
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.