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

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. // Xerces related
  23. #ifndef HAVE_XERCES
  24. #error Need Apache Xerces to build the VoiceXML interpreter
  25. #endif
  26. #include <sax2/ContentHandler.hpp>
  27. #include <sax2/LexicalHandler.hpp>
  28. using namespace xercesc;
  29. #include "VXML.h"
  30. #include "DocumentModel.hpp"
  31. #include <string>
  32. #include <list>
  33. typedef std::basic_string<VXIchar> vxistring;
  34. class VXMLDocumentRep;
  35. class VXMLDocument;
  36. class DocumentConverter : public ContentHandler, public LexicalHandler {
  37. public:
  38.   static bool Initialize();
  39.   // One time initialization.
  40.   //
  41.   // Returns: True - initialization succeeded.
  42.   //          False - initialization failed.
  43.   static void Deinitialize();
  44.   // One time cleanup of DocumentParser interface.
  45. public:
  46.   DocumentConverter();
  47.   virtual ~DocumentConverter();
  48.   virtual void startDocument();
  49.   virtual void endDocument();
  50.   virtual void setDocumentLocator(const Locator* const locator);
  51.   virtual void startElement(const XMLCh* const uri,
  52.                             const XMLCh* const localname,
  53.                             const XMLCh* const qname,
  54.                             const Attributes&  attrs);
  55.   virtual void endElement(const XMLCh* const uri,
  56.                           const XMLCh* const localname,
  57.                           const XMLCh* const qname);
  58.   virtual void characters(const XMLCh* const chars,
  59.                           const unsigned int length);
  60.   virtual void ignorableWhitespace(const XMLCh* const chars,
  61.                                    const unsigned int length);
  62.   virtual void processingInstruction(const XMLCh* const target,
  63.                                      const XMLCh* const data);
  64.   virtual void startPrefixMapping(const XMLCh* const prefix,
  65.                                   const XMLCh* const uri)
  66.   { }
  67.   virtual void endPrefixMapping(const XMLCh* const prefix)
  68.   { }
  69.   virtual void skippedEntity(const XMLCh* const name)
  70.   { }
  71. public:
  72.     virtual void comment(
  73.         const   XMLCh* const    chars
  74.         , const unsigned int    length
  75.     );
  76.     virtual void endCDATA ();
  77.     virtual void endDTD ();
  78.     virtual void endEntity (const XMLCh* const name);
  79.     virtual void startCDATA ();
  80.     virtual void startDTD
  81.     (
  82.         const   XMLCh* const    name
  83.         , const   XMLCh* const    publicId
  84.         , const   XMLCh* const    systemId
  85.     );
  86.     virtual void startEntity (const XMLCh* const name);
  87. public:
  88.   VXMLDocumentRep * GetDocument();
  89.   // This function releases the document representation to the caller.
  90.   
  91.   float GetXMLVersion(void) { return version; }
  92.   
  93.   void ResetDocument();
  94.   // Get/Set Base URL
  95.   void SetBaseUri(const VXIchar* const base);  
  96.   const vxistring & GetBaseUri(void) { return baseUri; }
  97.   void RestoreBaseURLFromCache(const VXMLDocument & doc);
  98.   
  99.   // Restore default language id if read from cache
  100.   void RestoreDefaultLangFromCache(const VXMLDocument & doc);
  101.   void GetDefaultLang(vxistring & dlang)
  102.   { dlang = defaultLang; }
  103.   
  104.   // Get/Set Grammar type
  105.   void SetGrammarType(const VXIchar* const grammartype)
  106.   { if( grammartype != NULL ) grammarType = grammartype; else grammarType=L""; } 
  107.   const vxistring & GetGrammarType(void) { return grammarType; }
  108.   void SetDocumentLevel(DocumentLevel dlevel)
  109.   { documentLevel = dlevel; }
  110. private:
  111.   void ParseException(const VXIchar * message) const;
  112.   void ProcessNodeAttribute(VXMLElementType elemType, int attrType,
  113.                             const VXIchar* const value);
  114.   void ProcessNodeFinal(VXMLElementType elemType);
  115.   bool IsIgnorable(int elemType);
  116.   void CopyElementStart(const XMLCh* const localname, const Attributes &attrs);
  117.   void CopyElementClose(const XMLCh* const localname);
  118.   void StartImplicitPrompt();
  119.   void EndImplicitPrompt();
  120.   const Locator * locator;
  121.   VXMLDocumentRep * doc;
  122.   float version;
  123.   vxistring baseUri;
  124.   vxistring grammarType;
  125.   vxistring defaultLang;
  126.   vxistring documentLang;
  127.   
  128.   // Document scope
  129.   DocumentLevel documentLevel;
  130.     
  131.   // Ignoring for <metadata>
  132.   int ignoreDepth;
  133.   // Used to detect attribute vs. content conflicts.
  134.   bool contentForbidden;    // Is content forbidden within this element?
  135.   bool hasContent;          // Did content appear.
  136.   // Menu <choice> numbering
  137.   int choiceNumber;         // This is used to number choices in a menu.
  138.   // For prompt handling, only one of implicitPrompt or explicitPrompt are
  139.   // 'true'.  In the case of a <foreach> that triggers an implicitPrompt,
  140.   // or is otherwise within an implicitPromt, the foreachImplicit will be
  141.   // 'true'.
  142.   bool implicitPrompt;      // Is this an implicit prompt (see hasValidPCDATA)?
  143.   int  explicitPrompt;      // Are we inside a <prompt>?
  144.   bool foreachImplicit;  
  145.   bool inGrammar;           // Are we inside a <grammar>?
  146.   int copyDepth;            // How deeply are we copying elements?
  147.   bool pcdataImpliesPrompt; // False indicates PCDATA is valid and not SSML
  148.   bool inCDATA;             // true if currently within a CDATA section
  149.   std::list<vxistring> namedControlItems;
  150.   std::list<vxistring> filledNameList;
  151. };