Jacek Caban : jscript: Added SetScriptState(SCRIPTSTATE_UNINITIALIZED) implementation.

Alexandre Julliard julliard at winehq.org
Tue Feb 22 10:36:10 CST 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Feb 21 17:49:15 2011 +0100

jscript: Added SetScriptState(SCRIPTSTATE_UNINITIALIZED) implementation.

---

 dlls/jscript/jscript.c |  163 +++++++++++++++++++++++++++++-------------------
 1 files changed, 99 insertions(+), 64 deletions(-)

diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index e5123b4..a69b293 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -16,6 +16,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include <assert.h>
+
 #include "jscript.h"
 #include "engine.h"
 #include "objsafe.h"
@@ -77,7 +79,8 @@ static void change_state(JScript *This, SCRIPTSTATE state)
         return;
 
     This->ctx->state = state;
-    IActiveScriptSite_OnStateChange(This->site, state);
+    if(This->site)
+        IActiveScriptSite_OnStateChange(This->site, state);
 }
 
 static inline BOOL is_started(script_ctx_t *ctx)
@@ -153,6 +156,86 @@ static HRESULT set_ctx_site(JScript *This)
     return S_OK;
 }
 
+static void decrease_state(JScript *This, SCRIPTSTATE state)
+{
+    if(This->ctx) {
+        switch(This->ctx->state) {
+        case SCRIPTSTATE_CONNECTED:
+            change_state(This, SCRIPTSTATE_DISCONNECTED);
+            if(state == SCRIPTSTATE_DISCONNECTED)
+                return;
+
+        case SCRIPTSTATE_STARTED:
+        case SCRIPTSTATE_DISCONNECTED:
+            clear_script_queue(This);
+
+            if(This->ctx->state == SCRIPTSTATE_DISCONNECTED)
+                change_state(This, SCRIPTSTATE_INITIALIZED);
+            if(state == SCRIPTSTATE_INITIALIZED)
+                return;
+
+        case SCRIPTSTATE_INITIALIZED:
+            if(This->ctx->host_global) {
+                IDispatch_Release(This->ctx->host_global);
+                This->ctx->host_global = NULL;
+            }
+
+            if(This->ctx->named_items) {
+                named_item_t *iter, *iter2;
+
+                iter = This->ctx->named_items;
+                while(iter) {
+                    iter2 = iter->next;
+
+                    if(iter->disp)
+                        IDispatch_Release(iter->disp);
+                    heap_free(iter->name);
+                    heap_free(iter);
+                    iter = iter2;
+                }
+
+                This->ctx->named_items = NULL;
+            }
+
+            if(This->ctx->secmgr) {
+                IInternetHostSecurityManager_Release(This->ctx->secmgr);
+                This->ctx->secmgr = NULL;
+            }
+
+            if(This->ctx->site) {
+                IActiveScriptSite_Release(This->ctx->site);
+                This->ctx->site = NULL;
+            }
+
+            if(This->ctx->global) {
+                jsdisp_release(This->ctx->global);
+                This->ctx->global = NULL;
+            }
+
+        case SCRIPTSTATE_UNINITIALIZED:
+            change_state(This, state);
+            break;
+        default:
+            assert(0);
+        }
+
+        change_state(This, state);
+    }else if(state == SCRIPTSTATE_UNINITIALIZED) {
+        if(This->site)
+            IActiveScriptSite_OnStateChange(This->site, state);
+    }else {
+        FIXME("NULL ctx\n");
+    }
+
+    if(state == SCRIPTSTATE_UNINITIALIZED)
+        This->thread_id = 0;
+
+    if(This->site) {
+        IActiveScriptSite_Release(This->site);
+        This->site = NULL;
+    }
+}
+
 typedef struct {
     IServiceProvider IServiceProvider_iface;
 
@@ -365,7 +448,18 @@ static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE s
 
     TRACE("(%p)->(%d)\n", This, ss);
 
-    if(!This->ctx || GetCurrentThreadId() != This->thread_id)
+    if(This->thread_id && GetCurrentThreadId() != This->thread_id)
+        return E_UNEXPECTED;
+
+    if(ss == SCRIPTSTATE_UNINITIALIZED) {
+        if(This->ctx && This->ctx->state == SCRIPTSTATE_CLOSED)
+            return E_UNEXPECTED;
+
+        decrease_state(This, SCRIPTSTATE_UNINITIALIZED);
+        return S_OK;
+    }
+
+    if(!This->ctx)
         return E_UNEXPECTED;
 
     switch(ss) {
@@ -397,12 +491,7 @@ static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *
     if(!pssState)
         return E_POINTER;
 
-    if(!This->thread_id) {
-        *pssState = SCRIPTSTATE_UNINITIALIZED;
-        return S_OK;
-    }
-
-    if(This->thread_id != GetCurrentThreadId())
+    if(This->thread_id && This->thread_id != GetCurrentThreadId())
         return E_UNEXPECTED;
 
     *pssState = This->ctx ? This->ctx->state : SCRIPTSTATE_UNINITIALIZED;
@@ -415,64 +504,10 @@ static HRESULT WINAPI JScript_Close(IActiveScript *iface)
 
     TRACE("(%p)->()\n", This);
 
-    if(This->thread_id != GetCurrentThreadId())
+    if(This->thread_id && This->thread_id != GetCurrentThreadId())
         return E_UNEXPECTED;
 
-    if(This->ctx) {
-        if(This->ctx->state == SCRIPTSTATE_CONNECTED)
-            change_state(This, SCRIPTSTATE_DISCONNECTED);
-
-        clear_script_queue(This);
-
-        if(This->ctx->state == SCRIPTSTATE_DISCONNECTED)
-            change_state(This, SCRIPTSTATE_INITIALIZED);
-
-        if(This->ctx->host_global) {
-            IDispatch_Release(This->ctx->host_global);
-            This->ctx->host_global = NULL;
-        }
-
-        if(This->ctx->named_items) {
-            named_item_t *iter, *iter2;
-
-            iter = This->ctx->named_items;
-            while(iter) {
-                iter2 = iter->next;
-
-                if(iter->disp)
-                    IDispatch_Release(iter->disp);
-                heap_free(iter->name);
-                heap_free(iter);
-                iter = iter2;
-            }
-
-            This->ctx->named_items = NULL;
-        }
-
-        if(This->ctx->secmgr) {
-            IInternetHostSecurityManager_Release(This->ctx->secmgr);
-            This->ctx->secmgr = NULL;
-        }
-
-        if(This->ctx->site) {
-            IActiveScriptSite_Release(This->ctx->site);
-            This->ctx->site = NULL;
-        }
-
-        if (This->site)
-            change_state(This, SCRIPTSTATE_CLOSED);
-
-        if(This->ctx->global) {
-            jsdisp_release(This->ctx->global);
-            This->ctx->global = NULL;
-        }
-    }
-
-    if(This->site) {
-        IActiveScriptSite_Release(This->site);
-        This->site = NULL;
-    }
-
+    decrease_state(This, SCRIPTSTATE_CLOSED);
     return S_OK;
 }
 




More information about the wine-cvs mailing list