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

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.  * Implementation of the SBjsi functions defined in SBjsi.h and the
  26.  * OSBjsi functions defined in OSBjsi.h, see those headers for details.
  27.  * Those headers are functionally redundant, the OSB version and entry
  28.  * points are for the OpenVXI open source release, while the SB version
  29.  * and entry points are for the OpenSpeech Browser PIK product release.
  30.  *
  31.  *****************************************************************************
  32.  ****************************************************************************/
  33. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  34. #include "SBjsiInternal.h"
  35. #include <string.h>                     // For memset( )
  36. #define SBJSI_EXPORTS
  37. #include "SBjsi.h"                      // Header for this interface
  38. #include "SBjsiAPI.h"                   // Header for the API functions
  39. #include "SBjsiLog.h"                   // For logging
  40. #include "JsiRuntime.hpp"               // For JsiRuntime class
  41. #include "SBjsiInterface.h"             // For SBjsiInterface
  42. #include "jsapi.h"                      // For JS_ShutDown( )
  43. // Global variable to track whether this is initialized
  44. static bool gblInitialized = false;
  45. // Global runtime, used across the entire system
  46. static JsiRuntime *gblJsiRuntime = NULL;
  47. // Runtime and Context sizes in bytes for each new runtime/context
  48. static long gblRuntimeSize = 0;
  49. static long gblContextSize = 0;
  50. // Maximum number of JavaScript branches per script evaluation
  51. static long gblMaxBranches = 0;
  52. // Offset for diagnostic logging
  53. static VXIunsigned gblDiagTagBase = 0;
  54. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  55. /**
  56.  * Global platform initialization of JavaScript
  57.  *
  58.  * @param log           VXI Logging interface used for error/diagnostic 
  59.  *                      logging, only used for the duration of this 
  60.  *                      function call
  61.  * @param  diagLogBase  Base tag number for diagnostic logging purposes.
  62.  *                      All diagnostic tags for SBjsi will start at this
  63.  *                      ID and increase upwards.
  64.  * @param  runtimeSize  Size of the JavaScript runtime environment, 
  65.  *                      in bytes, see above for a recommended default
  66.  * @param  contextSize  Size of each JavaScript context, in bytes, see
  67.  *                      above for a recommended default
  68.  * @param  maxBranches  Maximum number of JavaScript branches for each
  69.  *                      JavaScript evaluation, used to interrupt infinite
  70.  *                      loops from (possibly malicious) scripts
  71.  *
  72.  * @result VXIjsiResult 0 on success
  73.  */
  74. SBJSI_API VXIjsiResult SBjsiInit (VXIlogInterface  *log,
  75.   VXIunsigned       diagTagBase,
  76.   VXIlong           runtimeSize,
  77.   VXIlong           contextSize,
  78.   VXIlong           maxBranches)
  79. {
  80.   static const wchar_t func[] = L"SBjsiInit";
  81.   if ( log )
  82.     log->Diagnostic (log, diagTagBase + SBJSI_LOG_API, func, 
  83.      L"entering: 0x%p, %u, %ld, %ld, %ld",
  84.      log, diagTagBase, runtimeSize, contextSize, maxBranches);
  85.   // Make sure this wasn't already called
  86.   VXIjsiResult rc = VXIjsi_RESULT_SUCCESS;
  87.   if ( gblInitialized == true ) {
  88.     SBjsiLogger::Error (log, MODULE_SBJSI, JSI_ERROR_INIT_FAILED, NULL);
  89.     rc = VXIjsi_RESULT_FATAL_ERROR;
  90.     if ( log )
  91.       log->Diagnostic (log, diagTagBase + SBJSI_LOG_API, func, 
  92.        L"exiting: returned %d", rc);
  93.     return rc;
  94.   }
  95.   // Check arguments
  96.   if (( ! log ) || ( runtimeSize <= 0 ) || ( contextSize <= 0 ) || 
  97.       ( maxBranches <= 0 )) {
  98.     SBjsiLogger::Error (log, MODULE_SBJSI, JSI_ERROR_INIT_FAILED, NULL);
  99.     rc = VXIjsi_RESULT_INVALID_ARGUMENT;
  100.     if ( log )
  101.       log->Diagnostic (log, diagTagBase + SBJSI_LOG_API, func, 
  102.        L"exiting: returned %d", rc);
  103.     return rc;
  104.   }
  105.   // Create the global runtime environment
  106.   gblJsiRuntime = new JsiRuntime( );
  107.   if ( gblJsiRuntime == NULL ){
  108.     SBjsiLogger::Error (log, MODULE_SBJSI, JSI_ERROR_OUT_OF_MEMORY, NULL);
  109.     rc = VXIjsi_RESULT_OUT_OF_MEMORY;
  110.   }
  111.   else
  112.     rc = gblJsiRuntime->Create (runtimeSize, log, diagTagBase);
  113.   // Finish creation
  114.   if ( rc == VXIjsi_RESULT_SUCCESS ) {
  115.     gblRuntimeSize = runtimeSize;
  116.     gblContextSize = contextSize;
  117.     gblMaxBranches = maxBranches;
  118.     gblDiagTagBase = diagTagBase;
  119.     gblInitialized = true;
  120.   } else if ( gblJsiRuntime ) {
  121.     delete gblJsiRuntime;
  122.   }
  123.   log->Diagnostic (log, diagTagBase + SBJSI_LOG_API, func, 
  124.    L"exiting: returned %d", rc);
  125.   return rc;
  126. }
  127. /**
  128.  * Global platform shutdown of Jsi
  129.  *
  130.  * @param log    VXI Logging interface used for error/diagnostic logging,
  131.  *               only used for the duration of this function call
  132.  *
  133.  * @result VXIjsiResult 0 on success
  134.  */
  135. SBJSI_API VXIjsiResult SBjsiShutDown (VXIlogInterface  *log)
  136. {
  137.   static const wchar_t func[] = L"SBjsiShutDown";
  138.   if ( log )
  139.     log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  140.      L"entering: 0x%p", log);
  141.   // Make sure we've been created successfully
  142.   VXIjsiResult rc = VXIjsi_RESULT_SUCCESS;
  143.   if ( gblInitialized == false ) {
  144.     SBjsiLogger::Error (log, MODULE_SBJSI, JSI_ERROR_NOT_INITIALIZED, NULL);
  145.     rc = VXIjsi_RESULT_FATAL_ERROR;
  146.     if ( log )
  147.       log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  148.        L"exiting: returned %d", rc);
  149.     return rc;
  150.   }
  151.   if ( ! log )
  152.     return VXIjsi_RESULT_INVALID_ARGUMENT;
  153.   // Destroy the runtime environment
  154.   if ( gblJsiRuntime )
  155.     delete gblJsiRuntime;
  156.   
  157.   // Shut down SpiderMonkey 
  158.   JS_ShutDown( );
  159.   
  160.   // Finish shutdown
  161.   gblRuntimeSize = 0;
  162.   gblContextSize = 0;
  163.   gblMaxBranches = 0;
  164.   gblInitialized = false;
  165.   log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  166.    L"exiting: returned %d", rc);
  167.   return rc;
  168. }
  169. /**
  170.  * Create a new jsi service handle
  171.  *
  172.  * @param log    VXI Logging interface used for error/diagnostic 
  173.  *               logging, must remain a valid pointer throughout the 
  174.  *               lifetime of the resource (until SBjsiDestroyResource( )
  175.  *               is called)
  176.  *
  177.  * @result VXIjsiResult 0 on success 
  178.  */
  179. SBJSI_API 
  180. VXIjsiResult SBjsiCreateResource(VXIlogInterface     *log,
  181.  VXIjsiInterface    **jsi)
  182. {
  183.   static const wchar_t func[] = L"SBjsiCreateResource";
  184.   if ( log )
  185.     log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  186.      L"entering: 0x%p, 0x%p", log, 
  187.      jsi);
  188.   // Make sure we've been created successfully
  189.   VXIjsiResult rc = VXIjsi_RESULT_SUCCESS;
  190.   if ( gblInitialized == false ) {
  191.     SBjsiLogger::Error (log, MODULE_SBJSI, JSI_ERROR_NOT_INITIALIZED, NULL);
  192.     rc = VXIjsi_RESULT_FATAL_ERROR;
  193.     if ( log )
  194.       log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  195.        L"exiting: returned %d", rc);
  196.     return rc;
  197.   }
  198.   if (( log == NULL ) || ( jsi == NULL )) {
  199.     SBjsiLogger::Error (log, MODULE_SBJSI, JSI_ERROR_INVALID_ARG, NULL);
  200.     rc = VXIjsi_RESULT_INVALID_ARGUMENT;
  201.     if ( log )
  202.       log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  203.        L"exiting: returned %d", rc);
  204.     return rc;
  205.   }
  206.   // Get a new interface instance
  207.   SBjsiInterface *newJsi = new SBjsiInterface;
  208.   if ( ! newJsi ) {
  209.     SBjsiLogger::Error (log, MODULE_SBJSI, JSI_ERROR_INTERFACE_ALLOC_FAILED,
  210.  NULL);
  211.     rc = VXIjsi_RESULT_OUT_OF_MEMORY;
  212.   } else {
  213.     memset (newJsi, 0, sizeof (SBjsiInterface));
  214.     
  215.     // Initialize the function pointers
  216.     newJsi->jsi.GetVersion = SBjsiGetVersion;
  217.     newJsi->jsi.GetImplementationName = SBjsiGetImplementationName;
  218.     newJsi->jsi.CreateContext = SBjsiCreateContext;
  219.     newJsi->jsi.DestroyContext = SBjsiDestroyContext;
  220.     newJsi->jsi.CreateVarExpr = SBjsiCreateVarExpr;
  221.     newJsi->jsi.CreateVarValue = SBjsiCreateVarValue;
  222. newJsi->jsi.CreateVarDOM = SBjsiCreateVarDOM;
  223.     newJsi->jsi.SetVarExpr = SBjsiSetVarExpr;
  224.     newJsi->jsi.SetVarValue = SBjsiSetVarValue;
  225.     newJsi->jsi.SetReadOnly = SBjsiSetReadOnly;
  226.     newJsi->jsi.GetVar = SBjsiGetVar;
  227.     newJsi->jsi.CheckVar = SBjsiCheckVar;
  228.     newJsi->jsi.Eval = SBjsiEval;
  229.     newJsi->jsi.PushScope = SBjsiPushScope;
  230.     newJsi->jsi.PopScope = SBjsiPopScope;
  231.     newJsi->jsi.ClearScopes = SBjsiClearScopes;
  232. newJsi->jsi.GetLastError = SBjsiGetLastError;
  233.     
  234.     // Initialize the data members
  235.     newJsi->contextSize = gblContextSize;
  236.     newJsi->maxBranches = gblMaxBranches;
  237.     newJsi->jsiRuntime = gblJsiRuntime;
  238.     newJsi->log = log;
  239.     newJsi->diagTagBase = gblDiagTagBase;
  240.   }
  241.   if ( rc != VXIjsi_RESULT_SUCCESS ) {
  242.     if ( newJsi )
  243.       delete newJsi;
  244.   } else {
  245.     // Return the object
  246.     *jsi = &(newJsi->jsi);
  247.   }
  248.   log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  249.    L"exiting: returned %d", rc);
  250.   return rc;
  251. }
  252. /**
  253.  * Destroy the interface and free internal resources. Once this is
  254.  *  called, the logging interface passed to SBjsiCreateResource( ) may
  255.  *  be released as well.
  256.  *
  257.  * @result VXIjsiResult 0 on success 
  258.  */
  259. SBJSI_API 
  260. VXIjsiResult SBjsiDestroyResource(VXIjsiInterface **jsi)
  261. {
  262.   static const wchar_t func[] = L"SBjsiDestroyResource";
  263.   // Can't log yet, don't have a log handle
  264.   // Make sure we've been created successfully
  265.   if ( gblInitialized == false )
  266.     return VXIjsi_RESULT_FATAL_ERROR;
  267.   if (( jsi == NULL ) || ( *jsi == NULL ))
  268.     return VXIjsi_RESULT_INVALID_ARGUMENT;
  269.   // Get the real underlying interface
  270.   VXIjsiResult rc = VXIjsi_RESULT_SUCCESS;
  271.   SBjsiInterface *sbJsi = (SBjsiInterface *) *jsi;
  272.   VXIlogInterface *log = sbJsi->log;
  273.   log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  274.    L"entering: 0x%p (0x%p)", jsi, *jsi);
  275.   // Delete the object
  276.   delete sbJsi;
  277.   *jsi = NULL;
  278.   log->Diagnostic (log, gblDiagTagBase + SBJSI_LOG_API, func, 
  279.    L"exiting: returned %d", rc);
  280.   return rc;
  281. }