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
25 #include "wine/debug.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(vbscript
);
31 #define CTXARG_T DWORDLONG
32 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
33 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
37 #define CTXARG_T DWORD
38 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
39 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
44 IActiveScript IActiveScript_iface
;
45 IActiveScriptParse IActiveScriptParse_iface
;
46 IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_iface
;
47 IObjectSafety IObjectSafety_iface
;
53 IActiveScriptSite
*site
;
59 static void change_state(VBScript
*This
, SCRIPTSTATE state
)
61 if(This
->state
== state
)
66 IActiveScriptSite_OnStateChange(This
->site
, state
);
69 static inline BOOL
is_started(VBScript
*This
)
71 return This
->state
== SCRIPTSTATE_STARTED
72 || This
->state
== SCRIPTSTATE_CONNECTED
73 || This
->state
== SCRIPTSTATE_DISCONNECTED
;
76 static HRESULT
exec_global_code(script_ctx_t
*ctx
, vbscode_t
*code
)
80 code
->pending_exec
= FALSE
;
82 IActiveScriptSite_OnEnterScript(ctx
->site
);
83 hres
= exec_script(ctx
, &code
->main_code
, NULL
, NULL
, NULL
);
84 IActiveScriptSite_OnLeaveScript(ctx
->site
);
89 static void exec_queued_code(script_ctx_t
*ctx
)
93 LIST_FOR_EACH_ENTRY(iter
, &ctx
->code_list
, vbscode_t
, entry
) {
94 if(iter
->pending_exec
)
95 exec_global_code(ctx
, iter
);
99 IDispatch
*lookup_named_item(script_ctx_t
*ctx
, const WCHAR
*name
, unsigned flags
)
104 LIST_FOR_EACH_ENTRY(item
, &ctx
->named_items
, named_item_t
, entry
) {
105 if((item
->flags
& flags
) == flags
&& !strcmpiW(item
->name
, name
)) {
109 hres
= IActiveScriptSite_GetItemInfo(ctx
->site
, item
->name
,
110 SCRIPTINFO_IUNKNOWN
, &unk
, NULL
);
112 WARN("GetItemInfo failed: %08x\n", hres
);
116 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatch
, (void**)&item
->disp
);
117 IUnknown_Release(unk
);
119 WARN("object does not implement IDispatch\n");
131 static HRESULT
set_ctx_site(VBScript
*This
)
135 This
->ctx
->lcid
= This
->lcid
;
137 hres
= init_global(This
->ctx
);
141 IActiveScriptSite_AddRef(This
->site
);
142 This
->ctx
->site
= This
->site
;
144 change_state(This
, SCRIPTSTATE_INITIALIZED
);
148 static void release_script(script_ctx_t
*ctx
)
150 class_desc_t
*class_desc
;
152 collect_objects(ctx
);
154 release_dynamic_vars(ctx
->global_vars
);
155 ctx
->global_vars
= NULL
;
157 while(!list_empty(&ctx
->named_items
)) {
158 named_item_t
*iter
= LIST_ENTRY(list_head(&ctx
->named_items
), named_item_t
, entry
);
160 list_remove(&iter
->entry
);
162 IDispatch_Release(iter
->disp
);
163 heap_free(iter
->name
);
168 class_desc
= ctx
->procs
;
169 ctx
->procs
= class_desc
->next
;
171 heap_free(class_desc
);
174 if(ctx
->host_global
) {
175 IDispatch_Release(ctx
->host_global
);
176 ctx
->host_global
= NULL
;
180 IInternetHostSecurityManager_Release(ctx
->secmgr
);
185 IActiveScriptSite_Release(ctx
->site
);
190 IDispatchEx_Release(&ctx
->err_obj
->IDispatchEx_iface
);
194 if(ctx
->global_obj
) {
195 IDispatchEx_Release(&ctx
->global_obj
->IDispatchEx_iface
);
196 ctx
->global_obj
= NULL
;
199 if(ctx
->script_obj
) {
200 ScriptDisp
*script_obj
= ctx
->script_obj
;
202 ctx
->script_obj
= NULL
;
203 script_obj
->ctx
= NULL
;
204 IDispatchEx_Release(&script_obj
->IDispatchEx_iface
);
207 heap_pool_free(&ctx
->heap
);
208 heap_pool_init(&ctx
->heap
);
211 static void destroy_script(script_ctx_t
*ctx
)
213 while(!list_empty(&ctx
->code_list
))
214 release_vbscode(LIST_ENTRY(list_head(&ctx
->code_list
), vbscode_t
, entry
));
220 static void decrease_state(VBScript
*This
, SCRIPTSTATE state
)
222 switch(This
->state
) {
223 case SCRIPTSTATE_CONNECTED
:
224 change_state(This
, SCRIPTSTATE_DISCONNECTED
);
225 if(state
== SCRIPTSTATE_DISCONNECTED
)
228 case SCRIPTSTATE_STARTED
:
229 case SCRIPTSTATE_DISCONNECTED
:
230 if(This
->state
== SCRIPTSTATE_DISCONNECTED
)
231 change_state(This
, SCRIPTSTATE_INITIALIZED
);
232 if(state
== SCRIPTSTATE_INITIALIZED
)
235 case SCRIPTSTATE_INITIALIZED
:
236 case SCRIPTSTATE_UNINITIALIZED
:
237 change_state(This
, state
);
240 IActiveScriptSite_Release(This
->site
);
245 release_script(This
->ctx
);
249 case SCRIPTSTATE_CLOSED
:
255 static inline VBScript
*impl_from_IActiveScript(IActiveScript
*iface
)
257 return CONTAINING_RECORD(iface
, VBScript
, IActiveScript_iface
);
260 static HRESULT WINAPI
VBScript_QueryInterface(IActiveScript
*iface
, REFIID riid
, void **ppv
)
262 VBScript
*This
= impl_from_IActiveScript(iface
);
264 if(IsEqualGUID(riid
, &IID_IUnknown
)) {
265 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
266 *ppv
= &This
->IActiveScript_iface
;
267 }else if(IsEqualGUID(riid
, &IID_IActiveScript
)) {
268 TRACE("(%p)->(IID_IActiveScript %p)\n", This
, ppv
);
269 *ppv
= &This
->IActiveScript_iface
;
270 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParse
)) {
271 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This
, ppv
);
272 *ppv
= &This
->IActiveScriptParse_iface
;
273 }else if(IsEqualGUID(riid
, &IID_IActiveScriptParseProcedure2
)) {
274 TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This
, ppv
);
275 *ppv
= &This
->IActiveScriptParseProcedure2_iface
;
276 }else if(IsEqualGUID(riid
, &IID_IObjectSafety
)) {
277 TRACE("(%p)->(IID_IObjectSafety %p)\n", This
, ppv
);
278 *ppv
= &This
->IObjectSafety_iface
;
280 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
282 return E_NOINTERFACE
;
285 IUnknown_AddRef((IUnknown
*)*ppv
);
289 static ULONG WINAPI
VBScript_AddRef(IActiveScript
*iface
)
291 VBScript
*This
= impl_from_IActiveScript(iface
);
292 LONG ref
= InterlockedIncrement(&This
->ref
);
294 TRACE("(%p) ref=%d\n", This
, ref
);
299 static ULONG WINAPI
VBScript_Release(IActiveScript
*iface
)
301 VBScript
*This
= impl_from_IActiveScript(iface
);
302 LONG ref
= InterlockedDecrement(&This
->ref
);
304 TRACE("(%p) ref=%d\n", iface
, ref
);
308 decrease_state(This
, SCRIPTSTATE_CLOSED
);
309 destroy_script(This
->ctx
);
313 IActiveScriptSite_Release(This
->site
);
320 static HRESULT WINAPI
VBScript_SetScriptSite(IActiveScript
*iface
, IActiveScriptSite
*pass
)
322 VBScript
*This
= impl_from_IActiveScript(iface
);
326 TRACE("(%p)->(%p)\n", This
, pass
);
334 if(InterlockedCompareExchange(&This
->thread_id
, GetCurrentThreadId(), 0))
338 IActiveScriptSite_AddRef(This
->site
);
340 hres
= IActiveScriptSite_GetLCID(This
->site
, &lcid
);
344 return This
->ctx
? set_ctx_site(This
) : S_OK
;
347 static HRESULT WINAPI
VBScript_GetScriptSite(IActiveScript
*iface
, REFIID riid
,
350 VBScript
*This
= impl_from_IActiveScript(iface
);
351 FIXME("(%p)->()\n", This
);
355 static HRESULT WINAPI
VBScript_SetScriptState(IActiveScript
*iface
, SCRIPTSTATE ss
)
357 VBScript
*This
= impl_from_IActiveScript(iface
);
359 TRACE("(%p)->(%d)\n", This
, ss
);
361 if(This
->thread_id
&& GetCurrentThreadId() != This
->thread_id
)
364 if(ss
== SCRIPTSTATE_UNINITIALIZED
) {
365 if(This
->state
== SCRIPTSTATE_CLOSED
)
368 decrease_state(This
, SCRIPTSTATE_UNINITIALIZED
);
376 case SCRIPTSTATE_STARTED
:
377 case SCRIPTSTATE_CONNECTED
: /* FIXME */
378 if(This
->state
== SCRIPTSTATE_CLOSED
)
381 exec_queued_code(This
->ctx
);
383 case SCRIPTSTATE_INITIALIZED
:
384 FIXME("unimplemented SCRIPTSTATE_INITIALIZED\n");
386 case SCRIPTSTATE_DISCONNECTED
:
387 FIXME("unimplemented SCRIPTSTATE_DISCONNECTED\n");
390 FIXME("unimplemented state %d\n", ss
);
394 change_state(This
, ss
);
398 static HRESULT WINAPI
VBScript_GetScriptState(IActiveScript
*iface
, SCRIPTSTATE
*pssState
)
400 VBScript
*This
= impl_from_IActiveScript(iface
);
402 TRACE("(%p)->(%p)\n", This
, pssState
);
407 if(This
->thread_id
&& This
->thread_id
!= GetCurrentThreadId())
410 *pssState
= This
->state
;
414 static HRESULT WINAPI
VBScript_Close(IActiveScript
*iface
)
416 VBScript
*This
= impl_from_IActiveScript(iface
);
418 TRACE("(%p)->()\n", This
);
420 if(This
->thread_id
&& This
->thread_id
!= GetCurrentThreadId())
423 decrease_state(This
, SCRIPTSTATE_CLOSED
);
427 static HRESULT WINAPI
VBScript_AddNamedItem(IActiveScript
*iface
, LPCOLESTR pstrName
, DWORD dwFlags
)
429 VBScript
*This
= impl_from_IActiveScript(iface
);
431 IDispatch
*disp
= NULL
;
434 TRACE("(%p)->(%s %x)\n", This
, debugstr_w(pstrName
), dwFlags
);
436 if(This
->thread_id
!= GetCurrentThreadId() || !This
->ctx
|| This
->state
== SCRIPTSTATE_CLOSED
)
439 if(dwFlags
& SCRIPTITEM_GLOBALMEMBERS
) {
442 hres
= IActiveScriptSite_GetItemInfo(This
->site
, pstrName
, SCRIPTINFO_IUNKNOWN
, &unk
, NULL
);
444 WARN("GetItemInfo failed: %08x\n", hres
);
448 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatch
, (void**)&disp
);
449 IUnknown_Release(unk
);
451 WARN("object does not implement IDispatch\n");
455 if(This
->ctx
->host_global
)
456 IDispatch_Release(This
->ctx
->host_global
);
457 IDispatch_AddRef(disp
);
458 This
->ctx
->host_global
= disp
;
461 item
= heap_alloc(sizeof(*item
));
464 IDispatch_Release(disp
);
465 return E_OUTOFMEMORY
;
469 item
->flags
= dwFlags
;
470 item
->name
= heap_strdupW(pstrName
);
473 IDispatch_Release(disp
);
475 return E_OUTOFMEMORY
;
478 list_add_tail(&This
->ctx
->named_items
, &item
->entry
);
482 static HRESULT WINAPI
VBScript_AddTypeLib(IActiveScript
*iface
, REFGUID rguidTypeLib
,
483 DWORD dwMajor
, DWORD dwMinor
, DWORD dwFlags
)
485 VBScript
*This
= impl_from_IActiveScript(iface
);
486 FIXME("(%p)->()\n", This
);
490 static HRESULT WINAPI
VBScript_GetScriptDispatch(IActiveScript
*iface
, LPCOLESTR pstrItemName
, IDispatch
**ppdisp
)
492 VBScript
*This
= impl_from_IActiveScript(iface
);
494 TRACE("(%p)->(%p)\n", This
, ppdisp
);
499 if(This
->thread_id
!= GetCurrentThreadId() || !This
->ctx
|| !This
->ctx
->script_obj
) {
504 *ppdisp
= (IDispatch
*)&This
->ctx
->script_obj
->IDispatchEx_iface
;
505 IDispatch_AddRef(*ppdisp
);
509 static HRESULT WINAPI
VBScript_GetCurrentScriptThreadID(IActiveScript
*iface
,
510 SCRIPTTHREADID
*pstridThread
)
512 VBScript
*This
= impl_from_IActiveScript(iface
);
513 FIXME("(%p)->()\n", This
);
517 static HRESULT WINAPI
VBScript_GetScriptThreadID(IActiveScript
*iface
,
518 DWORD dwWin32ThreadId
, SCRIPTTHREADID
*pstidThread
)
520 VBScript
*This
= impl_from_IActiveScript(iface
);
521 FIXME("(%p)->()\n", This
);
525 static HRESULT WINAPI
VBScript_GetScriptThreadState(IActiveScript
*iface
,
526 SCRIPTTHREADID stidThread
, SCRIPTTHREADSTATE
*pstsState
)
528 VBScript
*This
= impl_from_IActiveScript(iface
);
529 FIXME("(%p)->()\n", This
);
533 static HRESULT WINAPI
VBScript_InterruptScriptThread(IActiveScript
*iface
,
534 SCRIPTTHREADID stidThread
, const EXCEPINFO
*pexcepinfo
, DWORD dwFlags
)
536 VBScript
*This
= impl_from_IActiveScript(iface
);
537 FIXME("(%p)->()\n", This
);
541 static HRESULT WINAPI
VBScript_Clone(IActiveScript
*iface
, IActiveScript
**ppscript
)
543 VBScript
*This
= impl_from_IActiveScript(iface
);
544 FIXME("(%p)->()\n", This
);
548 static const IActiveScriptVtbl VBScriptVtbl
= {
549 VBScript_QueryInterface
,
552 VBScript_SetScriptSite
,
553 VBScript_GetScriptSite
,
554 VBScript_SetScriptState
,
555 VBScript_GetScriptState
,
557 VBScript_AddNamedItem
,
559 VBScript_GetScriptDispatch
,
560 VBScript_GetCurrentScriptThreadID
,
561 VBScript_GetScriptThreadID
,
562 VBScript_GetScriptThreadState
,
563 VBScript_InterruptScriptThread
,
567 static inline VBScript
*impl_from_IActiveScriptParse(IActiveScriptParse
*iface
)
569 return CONTAINING_RECORD(iface
, VBScript
, IActiveScriptParse_iface
);
572 static HRESULT WINAPI
VBScriptParse_QueryInterface(IActiveScriptParse
*iface
, REFIID riid
, void **ppv
)
574 VBScript
*This
= impl_from_IActiveScriptParse(iface
);
575 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
578 static ULONG WINAPI
VBScriptParse_AddRef(IActiveScriptParse
*iface
)
580 VBScript
*This
= impl_from_IActiveScriptParse(iface
);
581 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
584 static ULONG WINAPI
VBScriptParse_Release(IActiveScriptParse
*iface
)
586 VBScript
*This
= impl_from_IActiveScriptParse(iface
);
587 return IActiveScript_Release(&This
->IActiveScript_iface
);
590 static HRESULT WINAPI
VBScriptParse_InitNew(IActiveScriptParse
*iface
)
592 VBScript
*This
= impl_from_IActiveScriptParse(iface
);
593 script_ctx_t
*ctx
, *old_ctx
;
595 TRACE("(%p)\n", This
);
600 ctx
= heap_alloc_zero(sizeof(script_ctx_t
));
602 return E_OUTOFMEMORY
;
604 ctx
->safeopt
= This
->safeopt
;
605 heap_pool_init(&ctx
->heap
);
606 list_init(&ctx
->objects
);
607 list_init(&ctx
->code_list
);
608 list_init(&ctx
->named_items
);
610 old_ctx
= InterlockedCompareExchangePointer((void**)&This
->ctx
, ctx
, NULL
);
616 return This
->site
? set_ctx_site(This
) : S_OK
;
619 static HRESULT WINAPI
VBScriptParse_AddScriptlet(IActiveScriptParse
*iface
,
620 LPCOLESTR pstrDefaultName
, LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
,
621 LPCOLESTR pstrSubItemName
, LPCOLESTR pstrEventName
, LPCOLESTR pstrDelimiter
,
622 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
,
623 BSTR
*pbstrName
, EXCEPINFO
*pexcepinfo
)
625 VBScript
*This
= impl_from_IActiveScriptParse(iface
);
626 FIXME("(%p)->(%s %s %s %s %s %s %s %u %x %p %p)\n", This
, debugstr_w(pstrDefaultName
),
627 debugstr_w(pstrCode
), debugstr_w(pstrItemName
), debugstr_w(pstrSubItemName
),
628 debugstr_w(pstrEventName
), debugstr_w(pstrDelimiter
), wine_dbgstr_longlong(dwSourceContextCookie
),
629 ulStartingLineNumber
, dwFlags
, pbstrName
, pexcepinfo
);
633 static HRESULT WINAPI
VBScriptParse_ParseScriptText(IActiveScriptParse
*iface
,
634 LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
, IUnknown
*punkContext
,
635 LPCOLESTR pstrDelimiter
, CTXARG_T dwSourceContextCookie
, ULONG ulStartingLine
,
636 DWORD dwFlags
, VARIANT
*pvarResult
, EXCEPINFO
*pexcepinfo
)
638 VBScript
*This
= impl_from_IActiveScriptParse(iface
);
639 IDispatch
*context
= NULL
;
643 TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This
, debugstr_w(pstrCode
),
644 debugstr_w(pstrItemName
), punkContext
, debugstr_w(pstrDelimiter
),
645 wine_dbgstr_longlong(dwSourceContextCookie
), ulStartingLine
, dwFlags
, pvarResult
, pexcepinfo
);
647 if(This
->thread_id
!= GetCurrentThreadId() || This
->state
== SCRIPTSTATE_CLOSED
)
651 context
= lookup_named_item(This
->ctx
, pstrItemName
, 0);
653 WARN("Inknown context %s\n", debugstr_w(pstrItemName
));
658 hres
= compile_script(This
->ctx
, pstrCode
, pstrDelimiter
, &code
);
663 IDispatch_AddRef(code
->context
= context
);
665 if(!is_started(This
)) {
666 code
->pending_exec
= TRUE
;
670 return exec_global_code(This
->ctx
, code
);
673 static const IActiveScriptParseVtbl VBScriptParseVtbl
= {
674 VBScriptParse_QueryInterface
,
675 VBScriptParse_AddRef
,
676 VBScriptParse_Release
,
677 VBScriptParse_InitNew
,
678 VBScriptParse_AddScriptlet
,
679 VBScriptParse_ParseScriptText
682 static inline VBScript
*impl_from_IActiveScriptParseProcedure2(IActiveScriptParseProcedure2
*iface
)
684 return CONTAINING_RECORD(iface
, VBScript
, IActiveScriptParseProcedure2_iface
);
687 static HRESULT WINAPI
VBScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2
*iface
, REFIID riid
, void **ppv
)
689 VBScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
690 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
693 static ULONG WINAPI
VBScriptParseProcedure_AddRef(IActiveScriptParseProcedure2
*iface
)
695 VBScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
696 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
699 static ULONG WINAPI
VBScriptParseProcedure_Release(IActiveScriptParseProcedure2
*iface
)
701 VBScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
702 return IActiveScript_Release(&This
->IActiveScript_iface
);
705 static HRESULT WINAPI
VBScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2
*iface
,
706 LPCOLESTR pstrCode
, LPCOLESTR pstrFormalParams
, LPCOLESTR pstrProcedureName
,
707 LPCOLESTR pstrItemName
, IUnknown
*punkContext
, LPCOLESTR pstrDelimiter
,
708 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
, IDispatch
**ppdisp
)
710 VBScript
*This
= impl_from_IActiveScriptParseProcedure2(iface
);
714 TRACE("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This
, debugstr_w(pstrCode
), debugstr_w(pstrFormalParams
),
715 debugstr_w(pstrProcedureName
), debugstr_w(pstrItemName
), punkContext
, debugstr_w(pstrDelimiter
),
716 wine_dbgstr_longlong(dwSourceContextCookie
), ulStartingLineNumber
, dwFlags
, ppdisp
);
718 if(This
->thread_id
!= GetCurrentThreadId() || This
->state
== SCRIPTSTATE_CLOSED
)
721 hres
= compile_script(This
->ctx
, pstrCode
, pstrDelimiter
, &code
);
725 return create_procedure_disp(This
->ctx
, code
, ppdisp
);
728 static const IActiveScriptParseProcedure2Vtbl VBScriptParseProcedureVtbl
= {
729 VBScriptParseProcedure_QueryInterface
,
730 VBScriptParseProcedure_AddRef
,
731 VBScriptParseProcedure_Release
,
732 VBScriptParseProcedure_ParseProcedureText
,
735 static inline VBScript
*impl_from_IObjectSafety(IObjectSafety
*iface
)
737 return CONTAINING_RECORD(iface
, VBScript
, IObjectSafety_iface
);
740 static HRESULT WINAPI
VBScriptSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
742 VBScript
*This
= impl_from_IObjectSafety(iface
);
743 return IActiveScript_QueryInterface(&This
->IActiveScript_iface
, riid
, ppv
);
746 static ULONG WINAPI
VBScriptSafety_AddRef(IObjectSafety
*iface
)
748 VBScript
*This
= impl_from_IObjectSafety(iface
);
749 return IActiveScript_AddRef(&This
->IActiveScript_iface
);
752 static ULONG WINAPI
VBScriptSafety_Release(IObjectSafety
*iface
)
754 VBScript
*This
= impl_from_IObjectSafety(iface
);
755 return IActiveScript_Release(&This
->IActiveScript_iface
);
758 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
760 static HRESULT WINAPI
VBScriptSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
761 DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
763 VBScript
*This
= impl_from_IObjectSafety(iface
);
765 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_guid(riid
), pdwSupportedOptions
, pdwEnabledOptions
);
767 if(!pdwSupportedOptions
|| !pdwEnabledOptions
)
770 *pdwSupportedOptions
= SUPPORTED_OPTIONS
;
771 *pdwEnabledOptions
= This
->safeopt
;
775 static HRESULT WINAPI
VBScriptSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
776 DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
778 VBScript
*This
= impl_from_IObjectSafety(iface
);
780 TRACE("(%p)->(%s %x %x)\n", This
, debugstr_guid(riid
), dwOptionSetMask
, dwEnabledOptions
);
782 if(dwOptionSetMask
& ~SUPPORTED_OPTIONS
)
785 This
->safeopt
= (dwEnabledOptions
& dwOptionSetMask
) | (This
->safeopt
& ~dwOptionSetMask
) | INTERFACE_USES_DISPEX
;
789 static const IObjectSafetyVtbl VBScriptSafetyVtbl
= {
790 VBScriptSafety_QueryInterface
,
791 VBScriptSafety_AddRef
,
792 VBScriptSafety_Release
,
793 VBScriptSafety_GetInterfaceSafetyOptions
,
794 VBScriptSafety_SetInterfaceSafetyOptions
797 HRESULT WINAPI
VBScriptFactory_CreateInstance(IClassFactory
*iface
, IUnknown
*pUnkOuter
, REFIID riid
, void **ppv
)
802 TRACE("(%p %s %p)\n", pUnkOuter
, debugstr_guid(riid
), ppv
);
804 ret
= heap_alloc_zero(sizeof(*ret
));
806 return E_OUTOFMEMORY
;
808 ret
->IActiveScript_iface
.lpVtbl
= &VBScriptVtbl
;
809 ret
->IActiveScriptParse_iface
.lpVtbl
= &VBScriptParseVtbl
;
810 ret
->IActiveScriptParseProcedure2_iface
.lpVtbl
= &VBScriptParseProcedureVtbl
;
811 ret
->IObjectSafety_iface
.lpVtbl
= &VBScriptSafetyVtbl
;
814 ret
->state
= SCRIPTSTATE_UNINITIALIZED
;
815 ret
->safeopt
= INTERFACE_USES_DISPEX
;
817 hres
= IActiveScript_QueryInterface(&ret
->IActiveScript_iface
, riid
, ppv
);
818 IActiveScript_Release(&ret
->IActiveScript_iface
);
823 IServiceProvider IServiceProvider_iface
;
827 IServiceProvider
*sp
;
830 static inline AXSite
*impl_from_IServiceProvider(IServiceProvider
*iface
)
832 return CONTAINING_RECORD(iface
, AXSite
, IServiceProvider_iface
);
835 static HRESULT WINAPI
AXSite_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
837 AXSite
*This
= impl_from_IServiceProvider(iface
);
839 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
840 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
841 *ppv
= &This
->IServiceProvider_iface
;
842 }else if(IsEqualGUID(&IID_IServiceProvider
, riid
)) {
843 TRACE("(%p)->(IID_IServiceProvider %p)\n", This
, ppv
);
844 *ppv
= &This
->IServiceProvider_iface
;
846 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
848 return E_NOINTERFACE
;
851 IUnknown_AddRef((IUnknown
*)*ppv
);
855 static ULONG WINAPI
AXSite_AddRef(IServiceProvider
*iface
)
857 AXSite
*This
= impl_from_IServiceProvider(iface
);
858 LONG ref
= InterlockedIncrement(&This
->ref
);
860 TRACE("(%p) ref=%d\n", This
, ref
);
865 static ULONG WINAPI
AXSite_Release(IServiceProvider
*iface
)
867 AXSite
*This
= impl_from_IServiceProvider(iface
);
868 LONG ref
= InterlockedDecrement(&This
->ref
);
870 TRACE("(%p) ref=%d\n", This
, ref
);
878 static HRESULT WINAPI
AXSite_QueryService(IServiceProvider
*iface
,
879 REFGUID guidService
, REFIID riid
, void **ppv
)
881 AXSite
*This
= impl_from_IServiceProvider(iface
);
883 TRACE("(%p)->(%s %s %p)\n", This
, debugstr_guid(guidService
), debugstr_guid(riid
), ppv
);
885 return IServiceProvider_QueryService(This
->sp
, guidService
, riid
, ppv
);
888 static IServiceProviderVtbl AXSiteVtbl
= {
889 AXSite_QueryInterface
,
895 IUnknown
*create_ax_site(script_ctx_t
*ctx
)
897 IServiceProvider
*sp
;
901 hres
= IActiveScriptSite_QueryInterface(ctx
->site
, &IID_IServiceProvider
, (void**)&sp
);
903 ERR("Could not get IServiceProvider iface: %08x\n", hres
);
907 ret
= heap_alloc(sizeof(*ret
));
909 IServiceProvider_Release(sp
);
913 ret
->IServiceProvider_iface
.lpVtbl
= &AXSiteVtbl
;
917 return (IUnknown
*)&ret
->IServiceProvider_iface
;