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
23 #define CTXARG_T DWORDLONG
24 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
25 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
29 #define CTXARG_T DWORD
30 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
31 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
36 IActiveScript IActiveScript_iface
;
37 IActiveScriptParse IActiveScriptParse_iface
;
38 IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_iface
;
39 IActiveScriptProperty IActiveScriptProperty_iface
;
40 IObjectSafety IObjectSafety_iface
;
41 IVariantChangeType IVariantChangeType_iface
;
52 IActiveScriptSite
*site
;
54 bytecode_t
*queue_head
;
55 bytecode_t
*queue_tail
;
58 void script_release(script_ctx_t
*ctx
)
66 heap_pool_free(&ctx
->tmp_heap
);
68 jsstr_release(ctx
->last_match
);
70 ctx
->jscaller
->ctx
= NULL
;
71 IServiceProvider_Release(&ctx
->jscaller
->IServiceProvider_iface
);
76 static void change_state(JScript
*This
, SCRIPTSTATE state
)
78 if(This
->ctx
->state
== state
)
81 This
->ctx
->state
= state
;
83 IActiveScriptSite_OnStateChange(This
->site
, state
);
86 static inline BOOL
is_started(script_ctx_t
*ctx
)
88 return ctx
->state
== SCRIPTSTATE_STARTED
89 || ctx
->state
== SCRIPTSTATE_CONNECTED
90 || ctx
->state
== SCRIPTSTATE_DISCONNECTED
;
93 static HRESULT
exec_global_code(JScript
*This
, bytecode_t
*code
)
98 hres
= create_exec_ctx(This
->ctx
, NULL
, This
->ctx
->global
, NULL
, TRUE
, &exec_ctx
);
102 IActiveScriptSite_OnEnterScript(This
->site
);
105 hres
= exec_source(exec_ctx
, code
, &code
->global_code
, FALSE
, NULL
);
106 exec_release(exec_ctx
);
108 IActiveScriptSite_OnLeaveScript(This
->site
);
112 static void clear_script_queue(JScript
*This
)
114 bytecode_t
*iter
, *iter2
;
116 if(!This
->queue_head
)
119 iter
= This
->queue_head
;
123 release_bytecode(iter
);
127 This
->queue_head
= This
->queue_tail
= NULL
;
130 static void exec_queued_code(JScript
*This
)
134 for(iter
= This
->queue_head
; iter
; iter
= iter
->next
)
135 exec_global_code(This
, iter
);
137 clear_script_queue(This
);
140 static HRESULT
set_ctx_site(JScript
*This
)
144 This
->ctx
->lcid
= This
->lcid
;
146 hres
= init_global(This
->ctx
);
150 IActiveScriptSite_AddRef(This
->site
);
151 This
->ctx
->site
= This
->site
;
153 change_state(This
, SCRIPTSTATE_INITIALIZED
);
157 static void decrease_state(JScript
*This
, SCRIPTSTATE state
)
160 switch(This
->ctx
->state
) {
161 case SCRIPTSTATE_CONNECTED
:
162 change_state(This
, SCRIPTSTATE_DISCONNECTED
);
163 if(state
== SCRIPTSTATE_DISCONNECTED
)
166 case SCRIPTSTATE_STARTED
:
167 case SCRIPTSTATE_DISCONNECTED
:
168 clear_script_queue(This
);
170 if(This
->ctx
->state
== SCRIPTSTATE_DISCONNECTED
)
171 change_state(This
, SCRIPTSTATE_INITIALIZED
);
172 if(state
== SCRIPTSTATE_INITIALIZED
)
175 case SCRIPTSTATE_INITIALIZED
:
176 if(This
->ctx
->host_global
) {
177 IDispatch_Release(This
->ctx
->host_global
);
178 This
->ctx
->host_global
= NULL
;
181 if(This
->ctx
->named_items
) {
182 named_item_t
*iter
, *iter2
;
184 iter
= This
->ctx
->named_items
;
189 IDispatch_Release(iter
->disp
);
190 heap_free(iter
->name
);
195 This
->ctx
->named_items
= NULL
;
198 if(This
->ctx
->secmgr
) {
199 IInternetHostSecurityManager_Release(This
->ctx
->secmgr
);
200 This
->ctx
->secmgr
= NULL
;
203 if(This
->ctx
->site
) {
204 IActiveScriptSite_Release(This
->ctx
->site
);
205 This
->ctx
->site
= NULL
;
208 if(This
->ctx
->global
) {
209 jsdisp_release(This
->ctx
->global
);
210 This
->ctx
->global
= NULL
;
213 case SCRIPTSTATE_UNINITIALIZED
:
214 change_state(This
, state
);
220 change_state(This
, state
);
221 }else if(state
== SCRIPTSTATE_UNINITIALIZED
) {
223 IActiveScriptSite_OnStateChange(This
->site
, state
);
228 if(state
== SCRIPTSTATE_UNINITIALIZED
)
232 IActiveScriptSite_Release(This
->site
);
238 IServiceProvider IServiceProvider_iface
;
242 IServiceProvider
*sp
;
245 static inline AXSite
*impl_from_IServiceProvider(IServiceProvider
*iface
)
247 return CONTAINING_RECORD(iface
, AXSite
, IServiceProvider_iface
);
250 static HRESULT WINAPI
AXSite_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
252 AXSite
*This
= impl_from_IServiceProvider(iface
);
254 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
255 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
256 *ppv
= &This
->IServiceProvider_iface
;
257 }else if(IsEqualGUID(&IID_IServiceProvider
, riid
)) {
258 TRACE("(%p)->(IID_IServiceProvider %p)\n", This
, ppv
);
259 *ppv
= &This
->IServiceProvider_iface
;
261 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
263 return E_NOINTERFACE
;
266 IUnknown_AddRef((IUnknown
*)*ppv
);
270 static ULONG WINAPI
AXSite_AddRef(IServiceProvider
*iface
)
272 AXSite
*This
= impl_from_IServiceProvider(iface
);
273 LONG ref
= InterlockedIncrement(&This
->ref
);
275 TRACE("(%p) ref=%d\n", This
, ref
);
280 static ULONG WINAPI
AXSite_Release(IServiceProvider
*iface
)
282 AXSite
*This
= impl_from_IServiceProvider(iface
);
283 LONG ref
= InterlockedDecrement(&This
->ref
);
285 TRACE("(%p) ref=%d\n", This
, ref
);
290 IServiceProvider_Release(This
->sp
);
298 static HRESULT WINAPI
AXSite_QueryService(IServiceProvider
*iface
,
299 REFGUID guidService
, REFIID riid
, void **ppv
)
301 AXSite
*This
= impl_from_IServiceProvider(iface
);
303 TRACE("(%p)->(%s %s %p)\n", This
, debugstr_guid(guidService
), debugstr_guid(riid
), ppv
);
306 return E_NOINTERFACE
;
308 return IServiceProvider_QueryService(This
->sp
, guidService
, riid
, ppv
);
311 static IServiceProviderVtbl AXSiteVtbl
= {
312 AXSite_QueryInterface
,
318 IUnknown
*create_ax_site(script_ctx_t
*ctx
)
320 IServiceProvider
*sp
= NULL
;
324 hres
= IActiveScriptSite_QueryInterface(ctx
->site
, &IID_IServiceProvider
, (void**)&sp
);
326 TRACE("Could not get IServiceProvider iface: %08x\n", hres
);
329 ret
= heap_alloc(sizeof(AXSite
));
331 IServiceProvider_Release(sp
);
335 ret
->IServiceProvider_iface
.lpVtbl
= &AXSiteVtbl
;
339 return (IUnknown
*)&ret
->IServiceProvider_iface
;
342 static inline JScript
*impl_from_IActiveScript(IActiveScript
*iface
)
344 return CONTAINING_RECORD(iface
, JScript
, IActiveScript_iface
);
347 static HRESULT WINAPI
JScript_QueryInterface(IActiveScript
*iface
, REFIID riid
, void **ppv
)
349 JScript
*This
= impl_from_IActiveScript(iface
);
353 if(IsEqualGUID(riid
, &IID_IUnknown
)) {
354 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
355 *ppv
= &This
->IActiveScript_iface
;
356 }else if(IsEqualGUID(riid
, &IID_IActiveScript
)) {
357 TRACE("(%p)->(IID_IActiveScript %p)\n", This
, ppv
);
358 *ppv
= &This
->IActiveScript_iface
;
359 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParse
)) {
360 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This
, ppv
);
361 *ppv
= &This
->IActiveScriptParse_iface
;
362 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParseProcedure
)) {
363 TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This
, ppv
);
364 *ppv
= &This
->IActiveScriptParseProcedure2_iface
;
365 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParseProcedure2
)) {
366 TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This
, ppv
);
367 *ppv
= &This
->IActiveScriptParseProcedure2_iface
;
368 }else if(IsEqualGUID(riid
, &IID_IActiveScriptProperty
)) {
369 TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This
, ppv
);
370 *ppv
= &This
->IActiveScriptProperty_iface
;
371 }else if(IsEqualGUID(riid
, &IID_IObjectSafety
)) {
372 TRACE("(%p)->(IID_IObjectSafety %p)\n", This
, ppv
);
373 *ppv
= &This
->IObjectSafety_iface
;
374 }else if(IsEqualGUID(riid
, &IID_IVariantChangeType
)) {
375 TRACE("(%p)->(IID_IVariantChangeType %p)\n", This
, ppv
);
376 *ppv
= &This
->IVariantChangeType_iface
;
380 IUnknown_AddRef((IUnknown
*)*ppv
);
384 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
385 return E_NOINTERFACE
;
388 static ULONG WINAPI
JScript_AddRef(IActiveScript
*iface
)
390 JScript
*This
= impl_from_IActiveScript(iface
);
391 LONG ref
= InterlockedIncrement(&This
->ref
);
393 TRACE("(%p) ref=%d\n", This
, ref
);
398 static ULONG WINAPI
JScript_Release(IActiveScript
*iface
)
400 JScript
*This
= impl_from_IActiveScript(iface
);
401 LONG ref
= InterlockedDecrement(&This
->ref
);
403 TRACE("(%p) ref=%d\n", iface
, ref
);
406 if(This
->ctx
&& This
->ctx
->state
!= SCRIPTSTATE_CLOSED
)
407 IActiveScript_Close(&This
->IActiveScript_iface
);
409 This
->ctx
->active_script
= NULL
;
410 script_release(This
->ctx
);
419 static HRESULT WINAPI
JScript_SetScriptSite(IActiveScript
*iface
,
420 IActiveScriptSite
*pass
)
422 JScript
*This
= impl_from_IActiveScript(iface
);
426 TRACE("(%p)->(%p)\n", This
, pass
);
434 if(InterlockedCompareExchange(&This
->thread_id
, GetCurrentThreadId(), 0))
438 IActiveScriptSite_AddRef(This
->site
);
440 hres
= IActiveScriptSite_GetLCID(This
->site
, &lcid
);
444 return This
->ctx
? set_ctx_site(This
) : S_OK
;
447 static HRESULT WINAPI
JScript_GetScriptSite(IActiveScript
*iface
, REFIID riid
,
450 JScript
*This
= impl_from_IActiveScript(iface
);
451 FIXME("(%p)->()\n", This
);
455 static HRESULT WINAPI
JScript_SetScriptState(IActiveScript
*iface
, SCRIPTSTATE ss
)
457 JScript
*This
= impl_from_IActiveScript(iface
);
459 TRACE("(%p)->(%d)\n", This
, ss
);
461 if(This
->thread_id
&& GetCurrentThreadId() != This
->thread_id
)
464 if(ss
== SCRIPTSTATE_UNINITIALIZED
) {
465 if(This
->ctx
&& This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
468 decrease_state(This
, SCRIPTSTATE_UNINITIALIZED
);
476 case SCRIPTSTATE_STARTED
:
477 case SCRIPTSTATE_CONNECTED
: /* FIXME */
478 if(This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
481 exec_queued_code(This
);
483 case SCRIPTSTATE_INITIALIZED
:
484 FIXME("unimplemented SCRIPTSTATE_INITIALIZED\n");
487 FIXME("unimplemented state %d\n", ss
);
491 change_state(This
, ss
);
495 static HRESULT WINAPI
JScript_GetScriptState(IActiveScript
*iface
, SCRIPTSTATE
*pssState
)
497 JScript
*This
= impl_from_IActiveScript(iface
);
499 TRACE("(%p)->(%p)\n", This
, pssState
);
504 if(This
->thread_id
&& This
->thread_id
!= GetCurrentThreadId())
507 *pssState
= This
->ctx
? This
->ctx
->state
: SCRIPTSTATE_UNINITIALIZED
;
511 static HRESULT WINAPI
JScript_Close(IActiveScript
*iface
)
513 JScript
*This
= impl_from_IActiveScript(iface
);
515 TRACE("(%p)->()\n", This
);
517 if(This
->thread_id
&& This
->thread_id
!= GetCurrentThreadId())
520 decrease_state(This
, SCRIPTSTATE_CLOSED
);
524 static HRESULT WINAPI
JScript_AddNamedItem(IActiveScript
*iface
,
525 LPCOLESTR pstrName
, DWORD dwFlags
)
527 JScript
*This
= impl_from_IActiveScript(iface
);
529 IDispatch
*disp
= NULL
;
532 TRACE("(%p)->(%s %x)\n", This
, debugstr_w(pstrName
), dwFlags
);
534 if(This
->thread_id
!= GetCurrentThreadId() || !This
->ctx
|| This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
537 if(dwFlags
& SCRIPTITEM_GLOBALMEMBERS
) {
540 hres
= IActiveScriptSite_GetItemInfo(This
->site
, pstrName
, SCRIPTINFO_IUNKNOWN
, &unk
, NULL
);
542 WARN("GetItemInfo failed: %08x\n", hres
);
546 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatch
, (void**)&disp
);
547 IUnknown_Release(unk
);
549 WARN("object does not implement IDispatch\n");
553 if(This
->ctx
->host_global
)
554 IDispatch_Release(This
->ctx
->host_global
);
555 IDispatch_AddRef(disp
);
556 This
->ctx
->host_global
= disp
;
559 item
= heap_alloc(sizeof(*item
));
562 IDispatch_Release(disp
);
563 return E_OUTOFMEMORY
;
567 item
->flags
= dwFlags
;
568 item
->name
= heap_strdupW(pstrName
);
571 IDispatch_Release(disp
);
573 return E_OUTOFMEMORY
;
576 item
->next
= This
->ctx
->named_items
;
577 This
->ctx
->named_items
= item
;
582 static HRESULT WINAPI
JScript_AddTypeLib(IActiveScript
*iface
, REFGUID rguidTypeLib
,
583 DWORD dwMajor
, DWORD dwMinor
, DWORD dwFlags
)
585 JScript
*This
= impl_from_IActiveScript(iface
);
586 FIXME("(%p)->()\n", This
);
590 static HRESULT WINAPI
JScript_GetScriptDispatch(IActiveScript
*iface
, LPCOLESTR pstrItemName
,
593 JScript
*This
= impl_from_IActiveScript(iface
);
595 TRACE("(%p)->(%p)\n", This
, ppdisp
);
600 if(This
->thread_id
!= GetCurrentThreadId() || !This
->ctx
->global
) {
605 *ppdisp
= to_disp(This
->ctx
->global
);
606 IDispatch_AddRef(*ppdisp
);
610 static HRESULT WINAPI
JScript_GetCurrentScriptThreadID(IActiveScript
*iface
,
611 SCRIPTTHREADID
*pstridThread
)
613 JScript
*This
= impl_from_IActiveScript(iface
);
614 FIXME("(%p)->()\n", This
);
618 static HRESULT WINAPI
JScript_GetScriptThreadID(IActiveScript
*iface
,
619 DWORD dwWin32ThreadId
, SCRIPTTHREADID
*pstidThread
)
621 JScript
*This
= impl_from_IActiveScript(iface
);
622 FIXME("(%p)->()\n", This
);
626 static HRESULT WINAPI
JScript_GetScriptThreadState(IActiveScript
*iface
,
627 SCRIPTTHREADID stidThread
, SCRIPTTHREADSTATE
*pstsState
)
629 JScript
*This
= impl_from_IActiveScript(iface
);
630 FIXME("(%p)->()\n", This
);
634 static HRESULT WINAPI
JScript_InterruptScriptThread(IActiveScript
*iface
,
635 SCRIPTTHREADID stidThread
, const EXCEPINFO
*pexcepinfo
, DWORD dwFlags
)
637 JScript
*This
= impl_from_IActiveScript(iface
);
638 FIXME("(%p)->()\n", This
);
642 static HRESULT WINAPI
JScript_Clone(IActiveScript
*iface
, IActiveScript
**ppscript
)
644 JScript
*This
= impl_from_IActiveScript(iface
);
645 FIXME("(%p)->()\n", This
);
649 static const IActiveScriptVtbl JScriptVtbl
= {
650 JScript_QueryInterface
,
653 JScript_SetScriptSite
,
654 JScript_GetScriptSite
,
655 JScript_SetScriptState
,
656 JScript_GetScriptState
,
658 JScript_AddNamedItem
,
660 JScript_GetScriptDispatch
,
661 JScript_GetCurrentScriptThreadID
,
662 JScript_GetScriptThreadID
,
663 JScript_GetScriptThreadState
,
664 JScript_InterruptScriptThread
,
668 static inline JScript
*impl_from_IActiveScriptParse(IActiveScriptParse
*iface
)
670 return CONTAINING_RECORD(iface
, JScript
, IActiveScriptParse_iface
);
673 static HRESULT WINAPI
JScriptParse_QueryInterface(IActiveScriptParse
*iface
, REFIID riid
, void **ppv
)
675 JScript
*This
= impl_from_IActiveScriptParse(iface
);
676 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
679 static ULONG WINAPI
JScriptParse_AddRef(IActiveScriptParse
*iface
)
681 JScript
*This
= impl_from_IActiveScriptParse(iface
);
682 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
685 static ULONG WINAPI
JScriptParse_Release(IActiveScriptParse
*iface
)
687 JScript
*This
= impl_from_IActiveScriptParse(iface
);
688 return IActiveScript_Release(&This
->IActiveScript_iface
);
691 static HRESULT WINAPI
JScriptParse_InitNew(IActiveScriptParse
*iface
)
693 JScript
*This
= impl_from_IActiveScriptParse(iface
);
697 TRACE("(%p)\n", This
);
702 ctx
= heap_alloc_zero(sizeof(script_ctx_t
));
704 return E_OUTOFMEMORY
;
707 ctx
->state
= SCRIPTSTATE_UNINITIALIZED
;
708 ctx
->active_script
= &This
->IActiveScript_iface
;
709 ctx
->safeopt
= This
->safeopt
;
710 ctx
->version
= This
->version
;
711 ctx
->ei
.val
= jsval_undefined();
712 heap_pool_init(&ctx
->tmp_heap
);
714 hres
= create_jscaller(ctx
);
720 ctx
->last_match
= jsstr_empty();
722 ctx
= InterlockedCompareExchangePointer((void**)&This
->ctx
, ctx
, NULL
);
728 return This
->site
? set_ctx_site(This
) : S_OK
;
731 static HRESULT WINAPI
JScriptParse_AddScriptlet(IActiveScriptParse
*iface
,
732 LPCOLESTR pstrDefaultName
, LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
,
733 LPCOLESTR pstrSubItemName
, LPCOLESTR pstrEventName
, LPCOLESTR pstrDelimiter
,
734 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
,
735 BSTR
*pbstrName
, EXCEPINFO
*pexcepinfo
)
737 JScript
*This
= impl_from_IActiveScriptParse(iface
);
738 FIXME("(%p)->(%s %s %s %s %s %s %s %u %x %p %p)\n", This
, debugstr_w(pstrDefaultName
),
739 debugstr_w(pstrCode
), debugstr_w(pstrItemName
), debugstr_w(pstrSubItemName
),
740 debugstr_w(pstrEventName
), debugstr_w(pstrDelimiter
), wine_dbgstr_longlong(dwSourceContextCookie
),
741 ulStartingLineNumber
, dwFlags
, pbstrName
, pexcepinfo
);
745 static HRESULT WINAPI
JScriptParse_ParseScriptText(IActiveScriptParse
*iface
,
746 LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
, IUnknown
*punkContext
,
747 LPCOLESTR pstrDelimiter
, CTXARG_T dwSourceContextCookie
, ULONG ulStartingLine
,
748 DWORD dwFlags
, VARIANT
*pvarResult
, EXCEPINFO
*pexcepinfo
)
750 JScript
*This
= impl_from_IActiveScriptParse(iface
);
754 TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This
, debugstr_w(pstrCode
),
755 debugstr_w(pstrItemName
), punkContext
, debugstr_w(pstrDelimiter
),
756 wine_dbgstr_longlong(dwSourceContextCookie
), ulStartingLine
, dwFlags
, pvarResult
, pexcepinfo
);
758 if(This
->thread_id
!= GetCurrentThreadId() || This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
761 hres
= compile_script(This
->ctx
, pstrCode
, NULL
, pstrDelimiter
, (dwFlags
& SCRIPTTEXT_ISEXPRESSION
) != 0,
762 This
->is_encode
, &code
);
766 if(dwFlags
& SCRIPTTEXT_ISEXPRESSION
) {
767 exec_ctx_t
*exec_ctx
;
769 hres
= create_exec_ctx(This
->ctx
, NULL
, This
->ctx
->global
, NULL
, TRUE
, &exec_ctx
);
770 if(SUCCEEDED(hres
)) {
773 IActiveScriptSite_OnEnterScript(This
->site
);
776 hres
= exec_source(exec_ctx
, code
, &code
->global_code
, TRUE
, &r
);
777 if(SUCCEEDED(hres
)) {
778 hres
= jsval_to_variant(r
, pvarResult
);
781 exec_release(exec_ctx
);
783 IActiveScriptSite_OnLeaveScript(This
->site
);
789 if(!is_started(This
->ctx
)) {
791 This
->queue_tail
= This
->queue_tail
->next
= code
;
793 This
->queue_head
= This
->queue_tail
= code
;
797 hres
= exec_global_code(This
, code
);
799 release_bytecode(code
);
803 static const IActiveScriptParseVtbl JScriptParseVtbl
= {
804 JScriptParse_QueryInterface
,
806 JScriptParse_Release
,
807 JScriptParse_InitNew
,
808 JScriptParse_AddScriptlet
,
809 JScriptParse_ParseScriptText
812 static inline JScript
*impl_from_IActiveScriptParseProcedure2(IActiveScriptParseProcedure2
*iface
)
814 return CONTAINING_RECORD(iface
, JScript
, IActiveScriptParseProcedure2_iface
);
817 static HRESULT WINAPI
JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2
*iface
, REFIID riid
, void **ppv
)
819 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
820 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
823 static ULONG WINAPI
JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2
*iface
)
825 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
826 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
829 static ULONG WINAPI
JScriptParseProcedure_Release(IActiveScriptParseProcedure2
*iface
)
831 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
832 return IActiveScript_Release(&This
->IActiveScript_iface
);
835 static HRESULT WINAPI
JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2
*iface
,
836 LPCOLESTR pstrCode
, LPCOLESTR pstrFormalParams
, LPCOLESTR pstrProcedureName
,
837 LPCOLESTR pstrItemName
, IUnknown
*punkContext
, LPCOLESTR pstrDelimiter
,
838 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
, IDispatch
**ppdisp
)
840 JScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
845 TRACE("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This
, debugstr_w(pstrCode
), debugstr_w(pstrFormalParams
),
846 debugstr_w(pstrProcedureName
), debugstr_w(pstrItemName
), punkContext
, debugstr_w(pstrDelimiter
),
847 wine_dbgstr_longlong(dwSourceContextCookie
), ulStartingLineNumber
, dwFlags
, ppdisp
);
849 if(This
->thread_id
!= GetCurrentThreadId() || This
->ctx
->state
== SCRIPTSTATE_CLOSED
)
852 hres
= compile_script(This
->ctx
, pstrCode
, pstrFormalParams
, pstrDelimiter
, FALSE
, This
->is_encode
, &code
);
854 WARN("Parse failed %08x\n", hres
);
858 hres
= create_source_function(This
->ctx
, code
, &code
->global_code
, NULL
, &dispex
);
859 release_bytecode(code
);
863 *ppdisp
= to_disp(dispex
);
867 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl
= {
868 JScriptParseProcedure_QueryInterface
,
869 JScriptParseProcedure_AddRef
,
870 JScriptParseProcedure_Release
,
871 JScriptParseProcedure_ParseProcedureText
,
874 static inline JScript
*impl_from_IActiveScriptProperty(IActiveScriptProperty
*iface
)
876 return CONTAINING_RECORD(iface
, JScript
, IActiveScriptProperty_iface
);
879 static HRESULT WINAPI
JScriptProperty_QueryInterface(IActiveScriptProperty
*iface
, REFIID riid
, void **ppv
)
881 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
882 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
885 static ULONG WINAPI
JScriptProperty_AddRef(IActiveScriptProperty
*iface
)
887 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
888 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
891 static ULONG WINAPI
JScriptProperty_Release(IActiveScriptProperty
*iface
)
893 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
894 return IActiveScript_Release(&This
->IActiveScript_iface
);
897 static HRESULT WINAPI
JScriptProperty_GetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
898 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
900 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
901 FIXME("(%p)->(%x %p %p)\n", This
, dwProperty
, pvarIndex
, pvarValue
);
905 static HRESULT WINAPI
JScriptProperty_SetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
906 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
908 JScript
*This
= impl_from_IActiveScriptProperty(iface
);
910 TRACE("(%p)->(%x %s %s)\n", This
, dwProperty
, debugstr_variant(pvarIndex
), debugstr_variant(pvarValue
));
913 FIXME("unsupported pvarIndex\n");
916 case SCRIPTPROP_INVOKEVERSIONING
:
917 if(V_VT(pvarValue
) != VT_I4
|| V_I4(pvarValue
) < 0 || V_I4(pvarValue
) > 15) {
918 WARN("invalid value %s\n", debugstr_variant(pvarValue
));
922 This
->version
= V_I4(pvarValue
);
925 FIXME("Unimplemented property %x\n", dwProperty
);
932 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl
= {
933 JScriptProperty_QueryInterface
,
934 JScriptProperty_AddRef
,
935 JScriptProperty_Release
,
936 JScriptProperty_GetProperty
,
937 JScriptProperty_SetProperty
940 static inline JScript
*impl_from_IObjectSafety(IObjectSafety
*iface
)
942 return CONTAINING_RECORD(iface
, JScript
, IObjectSafety_iface
);
945 static HRESULT WINAPI
JScriptSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
947 JScript
*This
= impl_from_IObjectSafety(iface
);
948 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
951 static ULONG WINAPI
JScriptSafety_AddRef(IObjectSafety
*iface
)
953 JScript
*This
= impl_from_IObjectSafety(iface
);
954 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
957 static ULONG WINAPI
JScriptSafety_Release(IObjectSafety
*iface
)
959 JScript
*This
= impl_from_IObjectSafety(iface
);
960 return IActiveScript_Release(&This
->IActiveScript_iface
);
963 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
965 static HRESULT WINAPI
JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
966 DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
968 JScript
*This
= impl_from_IObjectSafety(iface
);
970 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_guid(riid
), pdwSupportedOptions
, pdwEnabledOptions
);
972 if(!pdwSupportedOptions
|| !pdwEnabledOptions
)
975 *pdwSupportedOptions
= SUPPORTED_OPTIONS
;
976 *pdwEnabledOptions
= This
->safeopt
;
981 static HRESULT WINAPI
JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
982 DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
984 JScript
*This
= impl_from_IObjectSafety(iface
);
986 TRACE("(%p)->(%s %x %x)\n", This
, debugstr_guid(riid
), dwOptionSetMask
, dwEnabledOptions
);
988 if(dwOptionSetMask
& ~SUPPORTED_OPTIONS
)
991 This
->safeopt
= (dwEnabledOptions
& dwOptionSetMask
) | (This
->safeopt
& ~dwOptionSetMask
) | INTERFACE_USES_DISPEX
;
995 static const IObjectSafetyVtbl JScriptSafetyVtbl
= {
996 JScriptSafety_QueryInterface
,
997 JScriptSafety_AddRef
,
998 JScriptSafety_Release
,
999 JScriptSafety_GetInterfaceSafetyOptions
,
1000 JScriptSafety_SetInterfaceSafetyOptions
1003 static inline JScript
*impl_from_IVariantChangeType(IVariantChangeType
*iface
)
1005 return CONTAINING_RECORD(iface
, JScript
, IVariantChangeType_iface
);
1008 static HRESULT WINAPI
VariantChangeType_QueryInterface(IVariantChangeType
*iface
, REFIID riid
, void **ppv
)
1010 JScript
*This
= impl_from_IVariantChangeType(iface
);
1011 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
1014 static ULONG WINAPI
VariantChangeType_AddRef(IVariantChangeType
*iface
)
1016 JScript
*This
= impl_from_IVariantChangeType(iface
);
1017 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
1020 static ULONG WINAPI
VariantChangeType_Release(IVariantChangeType
*iface
)
1022 JScript
*This
= impl_from_IVariantChangeType(iface
);
1023 return IActiveScript_Release(&This
->IActiveScript_iface
);
1026 static HRESULT WINAPI
VariantChangeType_ChangeType(IVariantChangeType
*iface
, VARIANT
*dst
, VARIANT
*src
, LCID lcid
, VARTYPE vt
)
1028 JScript
*This
= impl_from_IVariantChangeType(iface
);
1032 TRACE("(%p)->(%p %p%s %x %d)\n", This
, dst
, src
, debugstr_variant(src
), lcid
, vt
);
1035 FIXME("Object uninitialized\n");
1036 return E_UNEXPECTED
;
1039 hres
= variant_change_type(This
->ctx
, &res
, src
, vt
);
1043 hres
= VariantClear(dst
);
1053 static const IVariantChangeTypeVtbl VariantChangeTypeVtbl
= {
1054 VariantChangeType_QueryInterface
,
1055 VariantChangeType_AddRef
,
1056 VariantChangeType_Release
,
1057 VariantChangeType_ChangeType
1060 HRESULT
create_jscript_object(BOOL is_encode
, REFIID riid
, void **ppv
)
1065 ret
= heap_alloc_zero(sizeof(*ret
));
1067 return E_OUTOFMEMORY
;
1071 ret
->IActiveScript_iface
.lpVtbl
= &JScriptVtbl
;
1072 ret
->IActiveScriptParse_iface
.lpVtbl
= &JScriptParseVtbl
;
1073 ret
->IActiveScriptParseProcedure2_iface
.lpVtbl
= &JScriptParseProcedureVtbl
;
1074 ret
->IActiveScriptProperty_iface
.lpVtbl
= &JScriptPropertyVtbl
;
1075 ret
->IObjectSafety_iface
.lpVtbl
= &JScriptSafetyVtbl
;
1076 ret
->IVariantChangeType_iface
.lpVtbl
= &VariantChangeTypeVtbl
;
1078 ret
->safeopt
= INTERFACE_USES_DISPEX
;
1079 ret
->is_encode
= is_encode
;
1081 hres
= IActiveScript_QueryInterface(&ret
->IActiveScript_iface
, riid
, ppv
);
1082 IActiveScript_Release(&ret
->IActiveScript_iface
);