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