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

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 __XMLChar_Converter_HPP__
  23. #define __XMLChar_Converter_HPP__
  24. #include "VXItypes.h"                 // for VXIchar
  25. #ifndef HAVE_XERCES
  26. #error Need Apache Xerces to build the VoiceXML interpreter
  27. #endif
  28. #include <util/XercesDefs.hpp>        // for XMLCh
  29. #include <util/XMLString.hpp>         // for XMLString
  30. using namespace xercesc;
  31. // Xerces specifies that XMLCh must be able to store UTF-16 characters.
  32. // VXIchar should be the general wide character representation (wchar_t) of the
  33. // platform.  As wchar_t may be other types, conversion functions are
  34. // necessary.
  35. // ------*---------*---------*---------*---------*---------*---------*---------
  36. // The native Solaris and Linux wide character encoding is UTF-32.  This
  37. // provides an imperfect conversion from UTF-16 to UTF-32, ignoring all
  38. // surrogate pairs.
  39. #if defined(__linux__) || 
  40.     defined(SOLARIS) || defined(__SVR4) || defined(UNIXWARE) || 
  41.     defined(_decunix_)
  42. #define UTF16TO32
  43. // ------*---------*---------*---------*---------*---------*---------*---------
  44. // Windows uses UTF-16 (or UCS-2 which is nearly equivalent), so no conversion
  45. // is necessary.
  46. #elif defined(XML_WIN32)
  47. #define NOCONVERSION
  48. // ------*---------*---------*---------*---------*---------*---------*---------
  49. #else
  50. #error Platform not supported.
  51. #endif
  52. // ------*---------*---------*---------*---------*---------*---------*---------
  53. #if defined(NOCONVERSION)
  54. #include <cstring>
  55. inline bool Compare(const XMLCh * x, const VXIchar * y)
  56. // Make sure we don't pass a NULL ptr to wcscmp
  57.   if (x == NULL && y == NULL) return true;
  58.   if (x == NULL && *y == '') return true;
  59.   if (y == NULL && *x == '') return true;
  60.   if (y == NULL || x == NULL) return false;
  61.   return wcscmp(x, y) == 0; 
  62. }
  63. struct VXIcharToXMLCh {
  64.   const XMLCh * c_str() const                 { return cstr; }
  65.   VXIcharToXMLCh(const VXIchar * x) : cstr(x) { if (cstr != NULL && cstr[0] == 0xFEFF) ++cstr; }
  66.   ~VXIcharToXMLCh()                           { }
  67. private:
  68.   const XMLCh * cstr;
  69.   VXIcharToXMLCh(const VXIcharToXMLCh &);
  70.   VXIcharToXMLCh& operator=(const VXIcharToXMLCh &);
  71. };
  72. struct XMLChToVXIchar {
  73.   const VXIchar * c_str() const             { return cstr; }
  74.   XMLChToVXIchar(const XMLCh * x) : cstr(x) { }
  75.   ~XMLChToVXIchar() { }
  76. private:
  77.   const VXIchar * cstr;
  78.   XMLChToVXIchar(const XMLChToVXIchar &);
  79.   XMLChToVXIchar& operator=(const XMLChToVXIchar &);
  80. };
  81. #endif /* NOCONVERSION */
  82. // ------*---------*---------*---------*---------*---------*---------*---------
  83. #if defined(UTF16TO32)
  84. #include <ostream>
  85. inline bool Compare(const XMLCh * x, const VXIchar * y)
  86. {
  87.   if (x == NULL && y == NULL) return true;
  88.   if (x == NULL && *y == '') return true;
  89.   if (y == NULL && *x == '') return true;
  90.   if (y == NULL || x == NULL) return false;
  91.   while (*x && *y && VXIchar(*x) == *y) ++x, ++y;
  92.   if (*x || *y) return false;
  93.   return true;
  94. }
  95. struct VXIcharToXMLCh {
  96.   const XMLCh * c_str() const { return cstr; }
  97.   VXIcharToXMLCh(const VXIchar * x) : cstr(NULL)
  98.   {
  99.     if (x == NULL) return;
  100.     unsigned int len = wcslen(x) + 1;
  101.     cstr = new XMLCh[len];
  102.     if (cstr == NULL) return;
  103.     for (unsigned int i = 0; i < len; ++i)
  104.       // We throw out any surrogate characters (0xD800 - 0xDFFF)
  105.       cstr[i] = ((x[i] ^ 0xD800) < 0x0100) ? XMLCh(0xBF) : XMLCh(x[i]);
  106.   }
  107.   ~VXIcharToXMLCh() { if (NULL != cstr) delete [] cstr; }
  108. private:
  109.   XMLCh * cstr;
  110.   VXIcharToXMLCh(const VXIcharToXMLCh &);
  111.   VXIcharToXMLCh& operator=(const VXIcharToXMLCh &);
  112. };
  113. struct XMLChToVXIchar {
  114.   const VXIchar * c_str() const { return cstr; }
  115.   XMLChToVXIchar(const XMLCh * x) : cstr(NULL)
  116.   {
  117.     if (x == NULL) return;
  118.     unsigned int len = XMLString::stringLen(x) + 1;
  119.     cstr = new VXIchar[len];
  120.     if (cstr == NULL) return;
  121.     
  122.     unsigned int i = 0;
  123.     if (x[0] == 0xFEFF) ++i;
  124.     for (unsigned j = 0; i < len; ++i, ++j)
  125.       // We throw out anything above 0xFFFF
  126.       cstr[j] = (x[i] != 0 && (x[i] & ~XMLCh(0xFFFF))) ? VXIchar(0xBE)
  127.                                                        : VXIchar(x[i]);
  128.   }
  129.   ~XMLChToVXIchar() { if (NULL != cstr) delete [] cstr; }
  130. private:
  131.   VXIchar * cstr;
  132.   XMLChToVXIchar(const XMLChToVXIchar &);
  133.   XMLChToVXIchar& operator=(const XMLChToVXIchar &);
  134. };
  135. #endif /* UTF16TO32 */
  136. // ------*---------*---------*---------*---------*---------*---------*---------
  137. inline std::basic_ostream<VXIchar>& operator<<(std::basic_ostream<VXIchar>& os,
  138.        const XMLChToVXIchar & val)
  139. { return os << val.c_str(); }
  140. class xmlcharstring {
  141. public:
  142.   // constructors
  143.   xmlcharstring(const XMLCh* s) : data(NULL), len(0) {
  144.   storeit(s);
  145.   }
  146.   xmlcharstring() : data(NULL), len(0) {}
  147.   xmlcharstring(const xmlcharstring &x) : data(NULL), len(0) {
  148.     if( !x.empty() ) storeit(x.c_str());
  149.   }
  150.   
  151.   // destructor
  152.   ~xmlcharstring() {
  153.     clear();
  154.   }
  155.   
  156.   // members
  157.   bool empty(void) const { return (len == 0); }
  158.   size_t length(void) const { return len; }
  159.   const XMLCh* c_str(void) const { return (data ? data : (const XMLCh*)""); }
  160.   void clear(void) {
  161.     if( data ) ::free(data);
  162.     data = NULL;
  163.     len = 0;
  164.   }   
  165.   const XMLCh operator[](unsigned int i) const { return data[i]; }    
  166.     
  167.   // copy assignment
  168.   xmlcharstring & operator=(const XMLCh* s) {
  169.     clear();
  170.     storeit(s);
  171.     return *this;     
  172.   }
  173.   xmlcharstring & operator=(const xmlcharstring &x) {
  174.     if( this != &x ) {
  175.       clear();
  176.       if( !x.empty() ) storeit(x.c_str());
  177.     }
  178.     return *this;
  179.   }
  180.   
  181.   // operators
  182.   xmlcharstring & operator+(const XMLCh* s) {
  183.     storeit(s, true); // store and preserve old content
  184.     return *this;     
  185.   }  
  186.   xmlcharstring & operator+=(const XMLCh* s) {
  187.     storeit(s, true);
  188.     return *this;
  189.   } 
  190.   xmlcharstring & operator+(const xmlcharstring & x) {
  191.     if( !x.empty() ) storeit(x.c_str(), true);
  192.     return *this;
  193.   } 
  194.   xmlcharstring & operator+=(const xmlcharstring & x) {
  195.     if( !x.empty() ) storeit(x.c_str(), true);
  196.     return *this;
  197.   } 
  198.   
  199.   // comparison
  200.   bool operator==(const XMLCh* s) {
  201.     return (XMLString::compareString(data, s) == 0);
  202.   }
  203.   bool operator==(const xmlcharstring & x) {
  204.     return operator==(x.c_str());
  205.   }
  206.   bool operator>(const XMLCh* s) {
  207.     return (XMLString::compareString(data, s) > 0);
  208.   }
  209.   bool operator>(const xmlcharstring & x) {
  210.     return operator>(x.c_str());
  211.   }
  212.   bool operator<(const XMLCh* s) {
  213.     return !operator>(s);
  214.   }
  215.   bool operator<(const xmlcharstring & x) {
  216.     return !operator>(x);
  217.   }
  218.   
  219. private:
  220.   void storeit(const XMLCh* s, bool preserve = false) {
  221.     if( s ) {
  222.       if( !preserve ) {
  223.         clear();
  224.         len = XMLString::stringLen(s);
  225.         data = (XMLCh*)::malloc(sizeof(XMLCh)*(len+1)); 
  226.         XMLString::copyString(data, s);        
  227.       }
  228.       else {
  229.         size_t plen = len;
  230.         len += XMLString::stringLen(s);
  231.         XMLCh* ptr = (XMLCh*)::realloc(data, sizeof(XMLCh)*(len+1)); 
  232.         data = ptr;
  233.         XMLString::copyString(&data[plen], s);        
  234.       }
  235.     }
  236.   }
  237.   
  238. private:
  239.   XMLCh* data;
  240.   size_t len;     
  241. };
  242. #endif