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

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.  * Top level API implementation and VXI class methods
  25.  *
  26.  ***********************************************************************/
  27. #define VXI_EXPORTS
  28. #include "VXI.hpp"
  29. #include "VXIinterpreter.h"
  30. #include "SimpleLogger.hpp"
  31. #include "DocumentParser.hpp"
  32. #include "VXIjsi.h"
  33. #include "VXIcache.h"                 // for version check on interface
  34. /******************************************************************
  35.  * Init / ShutDown
  36.  ******************************************************************/
  37. static unsigned int DEFAULT_DOCUMENT_CACHE_SIZE = 1024; // 1024 kB = 1 MB
  38. // VXIinterp_RESULT_SUCCESS
  39. // VXIinterp_RESULT_FAILURE
  40. VXI_INTERPRETER 
  41. VXIinterpreterResult VXIinterpreterInit(VXIlogInterface * log,
  42. VXIunsigned       diagLogBase,
  43.                                         const VXIMap    * props)
  44. {
  45.   SimpleLogger::SetMessageBase(diagLogBase);
  46.   unsigned int cacheSize = DEFAULT_DOCUMENT_CACHE_SIZE;
  47.   if (props != NULL) {
  48.     const VXIValue * v = VXIMapGetProperty(props, VXI_DOC_MEMORY_CACHE);
  49.     if (v != NULL && VXIValueGetType(v) == VALUE_INTEGER)
  50.       cacheSize = VXIIntegerValue(reinterpret_cast<const VXIInteger *>(v));
  51.   }
  52.   if (!DocumentParser::Initialize(cacheSize))
  53.     return VXIinterp_RESULT_FAILURE;
  54.   return VXIinterp_RESULT_SUCCESS;
  55. }
  56. VXI_INTERPRETER void VXIinterpreterShutDown(VXIlogInterface  *log)
  57. {
  58.   DocumentParser::Deinitialize();
  59. }
  60. /******************************************************************
  61.  * Interface definition
  62.  ******************************************************************/
  63. // This is an interesting and legal hack.  The alignment of a structure in C
  64. // must follow that of the first member.  The result is that the Interpreter
  65. // structure has the same alignment as VXIinterpreterInterface.  The
  66. // implementation may be safely appended onto the end.
  67. extern "C" {
  68. typedef struct Interpreter {
  69.   VXIinterpreterInterface interface;
  70.   SimpleLogger * logger;
  71.   VXIcacheInterface  * cache;
  72.   VXIinetInterface * inet;
  73.   VXIjsiInterface * jsi;
  74.   VXIobjectInterface * object;
  75.   VXIpromptInterface * prompt;
  76.   VXIrecInterface * rec;
  77.   VXItelInterface * tel;
  78.   VXI * implementation;
  79. } Interpreter;
  80. }
  81. extern "C" VXIint32 VXIinterpreterGetVersion(void)
  82. {
  83.   return VXI_CURRENT_VERSION;
  84. }
  85. extern "C" const VXIchar* VXIinterpreterGetImplementationName(void)
  86. {
  87. #ifndef COMPANY_DOMAIN
  88. #define COMPANY_DOMAIN L"com.yourcompany"
  89. #endif
  90.   static const VXIchar IMPLEMENTATION_NAME[] = 
  91.     COMPANY_DOMAIN L".VXI";
  92.   return IMPLEMENTATION_NAME;
  93. }
  94. extern "C" VXIinterpreterResult VXIinterpreterRun(VXIinterpreterInterface *x,
  95.   const VXIchar *name,
  96.   const VXIchar *sessionArgs,
  97.   VXIValue **result)
  98. {
  99.   if (x == NULL) return VXIinterp_RESULT_INVALID_ARGUMENT;
  100.   Interpreter * interpreter = reinterpret_cast<Interpreter*>(x);
  101.   switch(interpreter->implementation->Run(name, sessionArgs,
  102.                                           interpreter->logger,
  103.                                           interpreter->inet,
  104.                                           interpreter->cache,
  105.                                           interpreter->jsi,
  106.                                           interpreter->rec,
  107.                                           interpreter->prompt,
  108.                                           interpreter->tel,
  109.                                           interpreter->object,
  110.                                           result))
  111.   {
  112.   case -2: // Fatal error
  113.     return VXIinterp_RESULT_FATAL_ERROR;
  114.   case -1: // Out of memory
  115.     return VXIinterp_RESULT_OUT_OF_MEMORY;
  116.   case  0: // Success
  117.     return VXIinterp_RESULT_SUCCESS;
  118.   case  1: // Infinite loop suspected.
  119.   case  2: // ECMAScript error
  120.     return VXIinterp_RESULT_FAILURE;
  121.   case  3: // Invalid startup documents
  122.     return VXIinterp_RESULT_INVALID_DOCUMENT;
  123.   case  4:  // Stopped
  124.     return VXIinterp_RESULT_STOPPED;
  125.   default:
  126.     return VXIinterp_RESULT_FATAL_ERROR;
  127.   }
  128. }
  129. extern "C" VXIinterpreterResult VXIinterpreterSetProperties(
  130.                                                  VXIinterpreterInterface * x,
  131.                                                  const VXIMap * props)
  132. {
  133.   if (x == NULL) return VXIinterp_RESULT_INVALID_ARGUMENT;
  134.   Interpreter * interpreter = reinterpret_cast<Interpreter*>(x);
  135.   // Handle the degenerate case.
  136.   if (VXIMapNumProperties(props) == 0) return VXIinterp_RESULT_SUCCESS;
  137.   // Walk through each property in the map.
  138.   VXI * vxi = interpreter->implementation;
  139.   bool badValue = false;
  140.   bool badName = false;
  141.   const VXIchar  * key;
  142.   const VXIValue * value;
  143.   VXIMapIterator * i = VXIMapGetFirstProperty(props, &key, &value);
  144.   do {
  145.     if (key == NULL) badName = true;
  146.     else if (value == NULL) badValue = true;
  147. else {
  148.       vxistring keyString(key);
  149.       if (keyString == VXI_BEEP_AUDIO)
  150.     badValue |= !(vxi->SetRuntimeProperty(VXI::BeepURI, value));
  151.       else if (keyString == VXI_PLATFORM_DEFAULTS)
  152.         badValue |= !(vxi->SetRuntimeProperty(VXI::PlatDefaultsURI, value));
  153.       else if (keyString == VXI_DEFAULT_ACCESS_CONTROL)
  154.         badValue |= !(vxi->SetRuntimeProperty(VXI::DefaultAccessControl, value));
  155.       else
  156.         badName = true;
  157. }
  158.   } while (!badName && !badValue && (VXIMapGetNextProperty(i, &key, &value) == VXIvalue_RESULT_SUCCESS));
  159.   VXIMapIteratorDestroy(&i);
  160.   if (badName) 
  161.     return VXIinterp_RESULT_INVALID_PROP_NAME;
  162.   if (badValue)
  163.     return VXIinterp_RESULT_INVALID_PROP_VALUE;
  164.   return VXIinterp_RESULT_SUCCESS;
  165. }
  166. extern "C" VXIinterpreterResult VXIinterpreterValidate(
  167.                                                  VXIinterpreterInterface *x,
  168.                                                  const VXIchar *name)
  169. {
  170.   if (x == NULL) return VXIinterp_RESULT_INVALID_ARGUMENT;
  171.   if (name == NULL) return VXIinterp_RESULT_FETCH_ERROR;
  172.   Interpreter * interpreter = reinterpret_cast<Interpreter*>(x);
  173.   DocumentParser parser;
  174.   VXIMapHolder properties;
  175.   VXMLDocument document;
  176.   VXIMapHolder docProperties;
  177.   switch (parser.FetchDocument(name, properties, interpreter->inet,
  178.                                interpreter->cache, *interpreter->logger,
  179.                                document, docProperties))
  180.   {
  181.   case -1: // Out of memory?
  182.     return VXIinterp_RESULT_OUT_OF_MEMORY;
  183.   case  0: // Success
  184.     return VXIinterp_RESULT_SUCCESS;
  185.   case  2: // Unable to open URI
  186.   case  3: // Unable to read from URI
  187.     return VXIinterp_RESULT_FETCH_ERROR;
  188.   case  4: // Unable to parse contents of URI
  189.     return VXIinterp_RESULT_FAILURE;
  190.   case  1: // Invalid parameter
  191.   default:
  192.     break;
  193.   }
  194.   return VXIinterp_RESULT_FATAL_ERROR;
  195. }
  196. extern "C" VXIinterpreterResult
  197. VXIinterpreterRequestStop(VXIinterpreterInterface *x, VXIbool doStop)
  198. {
  199.   if (x == NULL) return VXIinterp_RESULT_INVALID_ARGUMENT;
  200.   Interpreter * interpreter = reinterpret_cast<Interpreter*>(x);
  201.   interpreter->implementation->DeclareStopRequest(doStop == TRUE);
  202.   return VXIinterp_RESULT_SUCCESS;
  203. }
  204. extern "C" VXIinterpreterResult VXIinterpreterInsertEvent(
  205.                                                     VXIinterpreterInterface *x,
  206.                                                     const VXIchar * event,
  207.                                                     const VXIchar * message)
  208. {
  209.   if (x == NULL) return VXIinterp_RESULT_INVALID_ARGUMENT;
  210.   if (event == NULL) return VXIinterp_RESULT_INVALID_ARGUMENT;
  211.   Interpreter * interpreter = reinterpret_cast<Interpreter*>(x);
  212.   bool res = interpreter->implementation->DeclareExternalEvent(event, message);
  213.   return res ? VXIinterp_RESULT_SUCCESS : VXIinterp_RESULT_INVALID_ARGUMENT;
  214. }
  215. extern "C" VXIinterpreterResult VXIinterpreterClearEventQueue(
  216.                                                     VXIinterpreterInterface *x)
  217. {
  218.   if (x == NULL) return VXIinterp_RESULT_INVALID_ARGUMENT;
  219.   Interpreter * interpreter = reinterpret_cast<Interpreter*>(x);
  220.   bool res = interpreter->implementation->ClearExternalEventQueue();
  221.   return res ? VXIinterp_RESULT_SUCCESS : VXIinterp_RESULT_FATAL_ERROR;
  222. }
  223. /******************************************************************
  224.  * Resource creation & destruction
  225.  ******************************************************************/
  226. // VXIinterp_RESULT_OUT_OF_MEMORY
  227. // VXIinterp_RESULT_SUCCESS
  228. VXI_INTERPRETER
  229. VXIinterpreterResult VXIinterpreterCreateResource(VXIresources *resources,
  230.                                                   VXIinterpreterInterface ** v)
  231. {
  232.   if (resources == NULL || resources->inet == NULL || 
  233.       resources->log == NULL || v == NULL)
  234.     return VXIinterp_RESULT_INVALID_ARGUMENT;
  235.   Interpreter * interpreter = new Interpreter;
  236.   if (interpreter == NULL)
  237.     return VXIinterp_RESULT_OUT_OF_MEMORY;
  238.   interpreter->implementation = new VXI();
  239.   if (interpreter->implementation == NULL) {
  240.     delete interpreter;
  241.     return VXIinterp_RESULT_OUT_OF_MEMORY;
  242.   }
  243.   interpreter->logger = SimpleLogger::CreateResource(resources->log);
  244.   if (interpreter->logger == NULL) {
  245.     delete interpreter->implementation;
  246.     delete interpreter;
  247.     return VXIinterp_RESULT_OUT_OF_MEMORY;
  248.   }
  249.   interpreter->interface.GetVersion = VXIinterpreterGetVersion;
  250.   interpreter->interface.GetImplementationName = 
  251.     VXIinterpreterGetImplementationName;
  252.   interpreter->interface.Run = VXIinterpreterRun;
  253.   interpreter->interface.Validate = VXIinterpreterValidate;
  254.   interpreter->interface.SetProperties = VXIinterpreterSetProperties;
  255.   interpreter->interface.RequestStop = VXIinterpreterRequestStop;
  256.   interpreter->interface.InsertEvent = VXIinterpreterInsertEvent;
  257.   interpreter->interface.ClearEventQueue = VXIinterpreterClearEventQueue;
  258.   // The VXI requires a 1.1 cache interface version.
  259.   if (resources->cache != NULL && resources->cache->GetVersion() >= 0x00010001)
  260.     interpreter->cache = resources->cache;
  261.   else
  262.     interpreter->cache = NULL;
  263.   interpreter->inet   = resources->inet;
  264.   interpreter->jsi    = resources->jsi;
  265.   interpreter->object = resources->object;
  266.   interpreter->prompt = resources->prompt;
  267.   interpreter->rec    = resources->rec;
  268.   interpreter->tel    = resources->tel;
  269.   *v = reinterpret_cast<VXIinterpreterInterface*>(interpreter);
  270.   return VXIinterp_RESULT_SUCCESS;
  271. }
  272. VXI_INTERPRETER
  273. void VXIinterpreterDestroyResource(VXIinterpreterInterface ** v)
  274. {
  275.   if (v == NULL || *v == NULL) return;
  276.   Interpreter * interpreter = reinterpret_cast<Interpreter*>(*v);
  277.   delete interpreter->implementation;
  278.   SimpleLogger::DestroyResource(interpreter->logger);
  279.   delete interpreter;
  280.   *v = NULL;
  281. }