Jacek Caban : jscript: Added IActiveScript::SetScriptSite.

Alexandre Julliard julliard at winehq.org
Wed Sep 3 07:43:23 CDT 2008


Module: wine
Branch: master
Commit: 268a92bed244416b8b049ea41aee557d26539c82
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=268a92bed244416b8b049ea41aee557d26539c82

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep  1 01:17:14 2008 +0200

jscript: Added IActiveScript::SetScriptSite.

---

 dlls/jscript/jscript.c |   45 +++++++++++++++++++++++++++++++++++++++++++--
 dlls/jscript/jscript.h |    1 +
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 8e3f752..d70db46 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -34,6 +34,9 @@ typedef struct {
 
     DWORD safeopt;
     script_ctx_t *ctx;
+    LONG thread_id;
+
+    IActiveScriptSite *site;
 } JScript;
 
 #define ACTSCRIPT(x)    ((IActiveScript*)                 &(x)->lpIActiveScriptVtbl)
@@ -50,6 +53,15 @@ void script_release(script_ctx_t *ctx)
     heap_free(ctx);
 }
 
+static void change_state(JScript *This, SCRIPTSTATE state)
+{
+    if(This->ctx->state == state)
+        return;
+
+    This->ctx->state = state;
+    IActiveScriptSite_OnStateChange(This->site, state);
+}
+
 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
 
 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
@@ -110,6 +122,8 @@ static ULONG WINAPI JScript_Release(IActiveScript *iface)
     if(!ref) {
         if(This->ctx)
             script_release(This->ctx);
+        if(This->site)
+            IActiveScriptSite_Release(This->site);
         heap_free(This);
         unlock_module();
     }
@@ -121,8 +135,35 @@ static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
                                             IActiveScriptSite *pass)
 {
     JScript *This = ACTSCRIPT_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, pass);
-    return E_NOTIMPL;
+    LCID lcid;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p)\n", This, pass);
+
+    if(!pass)
+        return E_POINTER;
+
+    if(This->site)
+        return E_UNEXPECTED;
+
+    if(!This->ctx) {
+        hres = IActiveScriptParse_InitNew(ASPARSE(This));
+        if(FAILED(hres))
+            return hres;
+    }
+
+    if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
+        return E_UNEXPECTED;
+
+    This->site = pass;
+    IActiveScriptSite_AddRef(This->site);
+
+    hres = IActiveScriptSite_GetLCID(This->site, &lcid);
+    if(hres == S_OK)
+        This->ctx->lcid = lcid;
+
+    change_state(This, SCRIPTSTATE_INITIALIZED);
+    return S_OK;
 }
 
 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 98948bc..455dee8 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -33,6 +33,7 @@ struct _script_ctx_t {
     LONG ref;
 
     SCRIPTSTATE state;
+    LCID lcid;
 };
 
 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);




More information about the wine-cvs mailing list