JsiContext.hpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:9k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program 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
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. /*****************************************************************************
  23.  *****************************************************************************
  24.  *
  25.  *
  26.  * JsiContext, class for managing JavaScript contexts
  27.  *
  28.  * The JsiContext class represents a JavaScript context, a script
  29.  * execution state. All JavaScript variables are maintained in a
  30.  * context, and all scripts are executed in reference to a context
  31.  * (for accessing variables and maintaining script side-effects). Each
  32.  * context may have one or more scopes that are used to layer the
  33.  * state information so that it is possible for clients to control the
  34.  * lifetime of state information within the context.
  35.  *
  36.  *****************************************************************************
  37.  ****************************************************************************/
  38. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  39. #ifndef _JSI_CONTEXT_H__
  40. #define _JSI_CONTEXT_H__
  41. #include "VXIjsi.h"              // For VXIjsiResult codes
  42. #include "SBjsiString.hpp"      // For SBinetString class
  43. #include "SBjsiLogger.hpp"      // For SBjsiLogger base class
  44. #ifndef HAVE_SPIDERMONKEY
  45. #error Need Mozilla SpiderMonkey to build this ECMAScript integration
  46. #endif
  47. #include <jsapi.h>               // SpiderMonkey API, for typedefs
  48. #include <xercesc/dom/DOMDocument.hpp>
  49. #ifndef JS_DLL_CALLBACK
  50. #define JS_DLL_CALLBACK CRT_CALL // For SpiderMonkey 1.5 RC 3 and earlier
  51. #endif
  52. class JsiRuntime;
  53. class JsiProtectedJsval;
  54. class JsiScopeChainNode;
  55. extern "C" struct VXIlogInterface;
  56. class JsiContext : public SBjsiLogger {
  57. public:
  58.   // Constructor and destructor
  59.   JsiContext();
  60.   virtual ~JsiContext();
  61.   // Creation method
  62.   VXIjsiResult Create(
  63.       JsiRuntime        *runtime, 
  64.       long               contextSize, 
  65.       long               maxBranches,
  66.       VXIlogInterface   *log,
  67.       VXIunsigned        diagTagBase);
  68.   // Create a script variable relative to the current scope
  69.   VXIjsiResult CreateVar(const VXIchar *name, const VXIchar  *expr);
  70.   VXIjsiResult CreateVar(const VXIchar *name, const VXIValue *value);
  71.   VXIjsiResult CreateVar(const VXIchar *name, xercesc::DOMDocument *doc);
  72.   
  73.   // Set a script variable relative to the current scope
  74.   VXIjsiResult SetVar(const VXIchar *name, const VXIchar *expr);
  75.   VXIjsiResult SetVar(const VXIchar *name, const VXIValue *value);
  76.   
  77.   // Get the value of a variable
  78.   VXIjsiResult GetVar(const VXIchar *name, VXIValue **value) const;
  79.   
  80.   // Check whether a variable is defined (not void, could be NULL)
  81.   VXIjsiResult CheckVar(const VXIchar *name) const;
  82.   // Set the given variable to read-only attribute
  83.   VXIjsiResult SetReadOnly(const VXIchar *name) const;
  84.   
  85.   // Execute a script, optionally returning any execution result
  86.   VXIjsiResult Eval(const VXIchar *expr, VXIValue **result);
  87.   
  88.   // Push a new context onto the scope chain (add a nested scope);
  89.   VXIjsiResult PushScope(const VXIchar *name, const VXIjsiScopeAttr attr);
  90.   // Pop a context from the scope chain (remove a nested scope);
  91.   VXIjsiResult PopScope();
  92.   
  93.   // Reset the scope chain to the global scope (pop all nested scopes);
  94.   VXIjsiResult ClearScopes();
  95.   // Returns the last exception.  The returned map is only valid if
  96.   // a previous call resulted in an error.
  97.   // keys:
  98.   //    lineNumber
  99.   //    message
  100.   //    stack
  101.   const VXIMap *GetLastException() { return reinterpret_cast<const VXIMap*>(exception); }
  102.    
  103. private:
  104.   // NOTE: Internal methods, these do not do mutex locking
  105.   // Flag that we are starting and stopping execution of a script,
  106.   // used to ensure thread safety. For simplicity, return true on
  107.   // success, false on failure (mutex error). For the threadsafe
  108.   // build, this is really disabling/enabling garbage collection.  For
  109.   // the non-threadsafe build this is doing mutex locks.
  110.   bool AccessBegin( ) const { 
  111. #ifdef JS_THREADSAFE
  112.     JS_ResumeRequest (context, contextRefs);
  113.     return true;
  114. #else
  115.     return runtime->AccessBegin( );
  116. #endif
  117.   }
  118.   bool AccessEnd( ) const {
  119. #ifdef JS_THREADSAFE
  120.     JsiContext *pThis = (JsiContext *) this;
  121.     pThis->contextRefs = JS_SuspendRequest (context);
  122. #endif
  123. #ifdef JSI_MEMORY_TEST
  124.     // Do garbage collection to invalidate memory, use this during unit
  125.     // test/Purify runs to make sure we're extremely clean
  126.     if ( context ) JS_GC (context);
  127. #endif
  128. #ifdef JS_THREADSAFE
  129.     return true;
  130. #else
  131.     return runtime->AccessEnd( );
  132. #endif
  133.   }
  134.   
  135.   // Script evaluation
  136.   VXIjsiResult EvaluateScript (const VXIchar *script, 
  137.       JsiProtectedJsval *retval = NULL,
  138.       bool loggingEnabled = true) const;
  139.   // Convert JS values to VXIValue types and vice versa
  140.   static VXIjsiResult JsvalToVXIValue (JSContext *context,
  141.       const jsval val,
  142.       VXIValue **value);
  143.   VXIjsiResult VXIValueToJsval (JSContext *context,
  144.       const VXIValue *value,
  145.       JsiProtectedJsval *val);
  146.   // Reset for the next evaluation
  147.   void EvaluatePrepare (bool enableLog = true) const { 
  148.     JsiContext *pThis = const_cast<JsiContext *>(this);
  149.     pThis->logEnabled = enableLog;
  150.     pThis->numBranches = 0L;
  151.     if ( pThis->exception ) { 
  152.       VXIValueDestroy (&pThis->exception); pThis->exception = NULL; }
  153.   }
  154.   // Check if the variable name is valid at declaration
  155.   bool IsValidVarName(JSContext *context, JSObject *obj, const VXIchar* vname);
  156.   // Check if the scope is writeable
  157.   VXIjsiResult CheckWriteable(JSContext *context, JSObject *obj, const VXIchar* varname);
  158.   // Disable the copy constructor and assignment operator
  159.   JsiContext (const JsiContext &src);
  160.   JsiContext & operator= (const JsiContext &src);
  161. public:
  162.   // NOTE: Internal static methods, these do not do mutex locking
  163.   // Static callback for finalizing scopes
  164.   static void JS_DLL_CALLBACK ScopeFinalize (JSContext *cx, JSObject *obj);
  165.   // Static callback for finalizing content objects
  166.   static void JS_DLL_CALLBACK ContentFinalize (JSContext *cx, JSObject *obj);
  167.   // Static callback for enforcing maxBranches
  168.   static JSBool JS_DLL_CALLBACK BranchCallback (JSContext *context, JSScript *script);
  169.   // Static callback for reporting JavaScript errors
  170.   static void JS_DLL_CALLBACK ErrorReporter (JSContext *context, 
  171.       const char *message,
  172.       JSErrorReport *report);
  173.   static JSBool JS_DLL_CALLBACK SCOPE_CLASS_SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
  174. private:
  175.   VXIjsiResult AssignVar(const VXIchar *name, JsiProtectedJsval &val);
  176.   void ClearException();
  177. private:
  178.   JSVersion           version;           // JavaScript version
  179.   JsiRuntime         *runtime;           // JavaScript runtime environment
  180.   JSContext          *context;           // Underlying SpiderMonkey context
  181.   jsrefcount          contextRefs;       // Reference count for the context
  182.   JsiScopeChainNode  *scopeChain;        // Scope chain
  183.   JsiScopeChainNode  *currentScope;      // Current (leaf) scope
  184.   // Evaluation state information
  185.   bool      logEnabled;      /* Whether to log JavaScript errors */
  186.   long      maxBranches;     /* Maximum number of branches for each 
  187.                                 evaluation */
  188.   long      numBranches;     /* Number of branches for the current evaluation,
  189.                                 used to enforce maxBranches */
  190.   VXIValue *exception;       /* Exception data, NULL if no exception */
  191. };
  192. #endif  // _JSI_CONTEXT_H__