VXI.hpp
上传用户: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. #ifndef _VXI_H
  23. #define _VXI_H
  24. #include "VXIvalue.h"
  25. #include "CommonExceptions.hpp"
  26. #include "VXMLDocument.hpp"
  27. #include "InternalMutex.hpp"
  28. #include "TokenList.hpp"
  29. #include "VXItel.h"
  30. #include "ExecutableContentHandler.hpp"
  31. class AnswerInformation;
  32. class DocumentParser;
  33. class ExecutionContext;
  34. class JumpDoc;
  35. class PromptManager;
  36. class PropertyList;
  37. class RecognitionAnswer;
  38. class SimpleLogger;
  39. extern "C" struct VXIcacheInterface;
  40. extern "C" struct VXIinetInterface;
  41. extern "C" struct VXIjsiInterface;
  42. extern "C" struct VXIpromptInterface;
  43. extern "C" struct VXIrecInterface;
  44. extern "C" struct VXItelInterface;
  45. extern "C" struct VXIobjectInterface;
  46. extern "C" struct VXIrecRecognitionResult;
  47. extern "C" struct VXIrecRecordResult;
  48. extern "C" struct VXIrecTransferResult;
  49. class VXI : public ExecutableContentHandler {
  50. public:
  51.   VXI();  // May throw VXIException::OutOfMemory
  52.   ~VXI();
  53.   // Returns: -2 Fatal error
  54.   //          -1 Out of memory
  55.   //           0 Success
  56.   //           1 Infinite loop suspected.
  57.   //           2 Javascript error
  58.   //           3 Invalid startup documents
  59.   //           4 Stopped
  60.   int Run(const VXIchar * initialDocument, const VXIchar * sessionScript,
  61.           SimpleLogger * log, VXIinetInterface * inet,
  62.           VXIcacheInterface * cache, VXIjsiInterface * jsi,
  63.           VXIrecInterface * rec, VXIpromptInterface * prompt,
  64.           VXItelInterface * tel, VXIobjectInterface * object,
  65.           VXIValue ** result);
  66.   // This sets a flag which may be used to abort Run.
  67.   void DeclareStopRequest(bool doStop);
  68.   bool DeclareExternalEvent(const VXIchar * event, const VXIchar * message);
  69.   bool ClearExternalEventQueue(void);
  70.   enum PropertyID {
  71.     BeepURI,             /// URI to beep audio
  72.     PlatDefaultsURI,     /// URI to platform defaults script
  73. DefaultAccessControl /// non-zero to allow access when ?access-control? is missing, otherwise 0 to deny
  74.   };
  75.   // Returns: true  - Property set
  76.   //          false - Invalid parameter value
  77.   bool SetRuntimeProperty(PropertyID, const VXIValue * value);
  78. private:
  79.   // these getters expect the proper ID/type.  i.e. Passing 
  80.   // an ID that returns a string to the int overload will 
  81.   // result in the returned value being untouched.
  82.   void GetRuntimeProperty(PropertyID, vxistring &) const;
  83.   void GetRuntimeProperty(PropertyID, int &) const;
  84.   ////////////////////////////////////////////////////////////////////////////
  85.   // Document level functions
  86.   ////////////////////////////////////////////////////////////////////////////
  87.   int RunDocumentLoop(const vxistring & initialDocument,
  88.                       const vxistring & sessionScript,
  89.                       VXIValue ** result);
  90.   void PerformTransition(const VXMLElement & doc, const vxistring & url,
  91.                          VXIMap * submitData = NULL, bool isSubdialog = false, 
  92.                          bool isSubmitElement = false);
  93.   // Finds the named dialog in the document.  If the name is empty, the first
  94.   // item is returned.
  95.   VXMLElement FindDialog(const VXMLElement & doc, const vxistring & name);
  96.   ////////////////////////////////////////////////////////////////////////////
  97.   // Document level support functions
  98.   ////////////////////////////////////////////////////////////////////////////
  99.   // This is responsible for adding a next execution context for the initial
  100.   // document and for <subdialog> elements.  It also initializes the session
  101.   // and language-neutral platform defaults.
  102.   //
  103.   // Returns: true - success
  104.   //          false - failure (stack depth exceeded?)
  105.   bool PushExecutionContext(const vxistring & sessionScript);
  106.   // This undoes PushExecutionContext()
  107.   void PopExecutionContext();
  108.   void InstallDocument(JumpDoc &);
  109.   void ProcessRootScripts(VXMLElement & doc);
  110.   void AttemptDocumentLoad(const vxistring & rawURL,
  111.    const VXIMapHolder & urlProperties,
  112.    VXMLDocument & doc,
  113.    VXIMapHolder & docProperties,
  114.    bool isDefaults = false,
  115.    bool isRootApp = false);
  116.   // Recursively walks the document tree and assigns internal names as needed.
  117.   void PrepareDocumentTree(VXMLElement & doc);
  118. private:
  119.   ////////////////////////////////////////////////////////////////////////////
  120.   // Dialog level functions
  121.   ////////////////////////////////////////////////////////////////////////////
  122.   void RunInnerLoop();
  123.   // Either throws an event containing the next form item to execute or
  124.   // simply returns if none is found.
  125.   void DoInnerJump(const VXMLElement & elem, const vxistring & item);
  126.   ////////////////////////////////////////////////////////////////////////////
  127.   // Dialog level support functions
  128.   ////////////////////////////////////////////////////////////////////////////
  129.   // Perform initialization associated with property tags and form level
  130.   // variables.  Reset the event and prompts counts.
  131.   void FormInit(const VXMLElement & form, VXIMapHolder & params);
  132.   // Returns true iff this element is a 'form item'.
  133.   bool IsFormItemNode(const VXMLElement& doc);
  134.   // Returns true iff this element is an 'input item'.
  135.   bool IsInputItemNode(const VXMLElement& doc);
  136.  
  137. private:
  138.   ////////////////////////////////////////////////////////////////////////////
  139.   // Collect Phase and element related.
  140.   ////////////////////////////////////////////////////////////////////////////
  141.   void CollectPhase(const VXMLElement& form, const VXMLElement& item);
  142.   void ProcessReturn(const VXMLElement& form, const VXMLElement& item,
  143.                      VXIMapHolder & result);
  144.   void DoEvent(const VXMLElement & item,
  145.                const VXIException::InterpreterEvent & event);
  146.   // Returns: true - event handled successfully.
  147.   //          false - no handler available.
  148.   bool do_event(const VXMLElement & item,
  149.                 const VXIException::InterpreterEvent & event);
  150.   void DoRecognition(const VXMLElement & item,
  151.                  const vxistring & documentID,
  152.                      const vxistring & dialogName,
  153.                      const vxistring & fieldName,
  154.                      const PropertyList & properties,
  155.                      int timeout,
  156.                      bool isModal);
  157.   void do_recognition(VXIMapHolder &properties, const PropertyList & propertyList);
  158.   void ProcessRecognitionResult(VXIrecRecognitionResult *recResult, const PropertyList & propertyList);
  159.   void ProcessRecognitionResult(VXIrecRecordResult *recResult, const PropertyList & propertyList);
  160.   void ProcessRecognitionResult(VXIrecTransferResult *recResult, const PropertyList & propertyList);
  161.   void ProcessRecognitionResult(VXIContent * result, VXIContent * utterance, VXIunsigned utteranceDuration, 
  162.       VXIString *markname, VXIunsigned marktime,
  163.       const PropertyList & propertyList);
  164.   void HandleRemoteMatch(const VXMLElement & dialog,
  165.                          const VXMLElement & element);
  166.   void SetMarkVars(VXIString *markname, VXIunsigned marktime);
  167.   void SetFieldRecordUtterance(const VXMLElement & answerElement);
  168.   void SetFieldRecordUtterance(vxistring & fieldName);
  169.   void SetFieldMark(const VXMLElement & answerElement);
  170.   void SetFieldMark(vxistring & fieldName);
  171.   void ProcessFilledElements(const vxistring & filled,
  172.                              const VXMLElement & element);
  173.   void ProcessFilledElements(TokenList & filled,
  174.                              const VXMLElement & element);
  175. private:
  176.   void execute_content(const VXMLElement & doc,
  177.                        const VXIMapHolder & vars = VXIMapHolder(NULL),
  178.                        const VXMLElement & activeDialog = 0);
  179.   void executable_prompt(const VXMLElement& child);
  180. // executable content handler
  181. private:
  182.   void executable_element(const VXMLElement& child, const VXMLElement & activeDialog = 0);
  183.   void assign_element(const VXMLElement& elem);
  184.   void clear_element(const VXMLElement& elem);
  185.   void data_element(const VXMLElement & elem);
  186.   void disconnect_element(const VXMLElement& elem);
  187.   void goto_element(const VXMLElement& elem);
  188.   void exit_element(const VXMLElement& elem);
  189.   void if_element(const VXMLElement& elem);
  190.   void log_element(const VXMLElement& elem);
  191.   void reprompt_element(const VXMLElement& doc, const VXMLElement & activeDialog = 0);
  192.   void return_element(const VXMLElement& elem);
  193.   void script_element(const VXMLElement& elem);
  194.   void submit_element(const VXMLElement& elem);
  195.   void throw_element(const VXMLElement& doc, const VXMLElement& activeDialog = 0);
  196.   void var_element(const VXMLElement & elem);
  197. private:
  198.   // form item handlers
  199.   void block_element(const VXMLElement& doc);
  200.   void field_element(const VXMLElement& form, const VXMLElement& field);
  201.   void menu_element(const VXMLElement& doc);
  202.   void object_element(const VXMLElement& doc);
  203.   void record_element(const VXMLElement& form, const VXMLElement& doc);
  204.   void subdialog_element(const VXMLElement& doc);
  205.   void transfer_element(const VXMLElement & form, const VXMLElement& doc);
  206.   // misc handlers
  207.   void meta_element(const VXMLElement & doc);
  208.   // helpers
  209.   VXIMap * CollectParams(const VXMLElement & doc, bool isObject);
  210.   void CheckLineStatus(void);
  211.   void ThrowTransferEvent(VXItelResult telResult, const vxistring &type);
  212. private: // All prompt related.
  213.   void queue_prompts(const VXMLElement& doc);
  214. private:
  215.   DocumentParser     * parser;  // owned
  216.   SimpleLogger       * log;
  217.   VXIcacheInterface  * cache;
  218.   VXIinetInterface   * inet;
  219.   VXIrecInterface    * rec;
  220.   VXIjsiInterface    * jsi;
  221.   VXItelInterface    * tel;
  222.   VXIobjectInterface * object;
  223.   PromptManager      * pm;      // owned
  224.   VXIMap             * sdParams;
  225.   VXIMap             * sdResult;
  226.   VXIException::InterpreterEvent * sdEvent;
  227.   bool updateDefaultDoc;
  228.   VXMLDocument domDefaultDoc;
  229.   // Used by Get/Set Property
  230.   InternalMutex mutex;
  231.   vxistring uriPlatDefaults;
  232.   vxistring uriBeep;
  233.   bool      defAccessControl;  // for <data> missing ?access-control?
  234.   // Keep track of current URI
  235.   vxistring uriCurrent;
  236.   int stackDepth;
  237.   ExecutionContext * exe;
  238.   // Event related
  239.   bool lineHungUp;              // Tel. status to track hang-up event
  240.   bool stopRequested;           // Should the interpreter stop ASAP?
  241.   bool haveExternalEvents;      // Are there unprocessed external events?
  242.   TokenList externalEvents;     // Unprocessed external events
  243.   TokenList externalMessages;   // Unprocessed external events (messages)
  244. };
  245. #endif