Jacek Caban : vbscript: Added IActiveScript::InitNew implementation.
Alexandre Julliard
julliard at winehq.org
Wed Aug 31 13:19:21 CDT 2011
Module: wine
Branch: master
Commit: 7edaff43e4d70b22a7170d0fcf29b619ed3d4673
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7edaff43e4d70b22a7170d0fcf29b619ed3d4673
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Aug 31 11:22:05 2011 +0200
vbscript: Added IActiveScript::InitNew implementation.
---
dlls/vbscript/vbscript.c | 53 +++++++++++++++++++++++++++++++++++++++++++--
dlls/vbscript/vbscript.h | 5 ++++
2 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index b04fe0c..b5cc9bf 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -50,11 +50,41 @@ struct VBScript {
LONG ref;
+ SCRIPTSTATE state;
IActiveScriptSite *site;
+ script_ctx_t *ctx;
LONG thread_id;
LCID lcid;
};
+static void change_state(VBScript *This, SCRIPTSTATE state)
+{
+ if(This->state == state)
+ return;
+
+ This->state = state;
+ if(This->site)
+ IActiveScriptSite_OnStateChange(This->site, state);
+}
+
+static HRESULT set_ctx_site(VBScript *This)
+{
+ This->ctx->lcid = This->lcid;
+
+ IActiveScriptSite_AddRef(This->site);
+ This->ctx->site = This->site;
+
+ change_state(This, SCRIPTSTATE_INITIALIZED);
+ return S_OK;
+}
+
+static void destroy_script(script_ctx_t *ctx)
+{
+ if(ctx->site)
+ IActiveScriptSite_Release(ctx->site);
+ heap_free(ctx);
+}
+
static inline VBScript *impl_from_IActiveScript(IActiveScript *iface)
{
return CONTAINING_RECORD(iface, VBScript, IActiveScript_iface);
@@ -133,7 +163,7 @@ static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScript
if(hres == S_OK)
This->lcid = lcid;
- return S_OK;
+ return This->ctx ? set_ctx_site(This) : S_OK;
}
static HRESULT WINAPI VBScript_GetScriptSite(IActiveScript *iface, REFIID riid,
@@ -271,8 +301,24 @@ static ULONG WINAPI VBScriptParse_Release(IActiveScriptParse *iface)
static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface)
{
VBScript *This = impl_from_IActiveScriptParse(iface);
- FIXME("(%p)\n", This);
- return S_OK;
+ script_ctx_t *ctx;
+
+ TRACE("(%p)\n", This);
+
+ if(This->ctx)
+ return E_UNEXPECTED;
+
+ ctx = heap_alloc_zero(sizeof(script_ctx_t));
+ if(!ctx)
+ return E_OUTOFMEMORY;
+
+ ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL);
+ if(ctx) {
+ destroy_script(ctx);
+ return E_UNEXPECTED;
+ }
+
+ return This->site ? set_ctx_site(This) : S_OK;
}
static HRESULT WINAPI VBScriptParse_AddScriptlet(IActiveScriptParse *iface,
@@ -325,6 +371,7 @@ HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pU
ret->IActiveScriptParse_iface.lpVtbl = &VBScriptParseVtbl;
ret->ref = 1;
+ ret->state = SCRIPTSTATE_UNINITIALIZED;
hres = IActiveScript_QueryInterface(&ret->IActiveScript_iface, riid, ppv);
IActiveScript_Release(&ret->IActiveScript_iface);
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 30aaf1e..98a4486 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -19,6 +19,11 @@
#include "activscp.h"
#include "vbscript_classes.h"
+typedef struct {
+ IActiveScriptSite *site;
+ LCID lcid;
+} script_ctx_t;
+
HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);
static inline void *heap_alloc(size_t len)
More information about the wine-cvs
mailing list