TransService.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:16k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Id: TransService.cpp,v 1.23 2001/05/11 13:26:29 tng Exp $
  58.  */
  59. // ---------------------------------------------------------------------------
  60. //  Includes
  61. // ---------------------------------------------------------------------------
  62. #include <util/Janitor.hpp>
  63. #include <util/RefHashTableOf.hpp>
  64. #include <util/XML88591Transcoder.hpp>
  65. #include <util/XMLASCIITranscoder.hpp>
  66. #include <util/XMLChTranscoder.hpp>
  67. #include <util/XMLEBCDICTranscoder.hpp>
  68. #include <util/XMLIBM1140Transcoder.hpp>
  69. #include <util/XMLUCS4Transcoder.hpp>
  70. #include <util/XMLUTF8Transcoder.hpp>
  71. #include <util/XMLUTF16Transcoder.hpp>
  72. #include <util/XMLWin1252Transcoder.hpp>
  73. #include <util/XMLUniDefs.hpp>
  74. #include <util/XMLUni.hpp>
  75. #include <util/TransENameMap.hpp>
  76. // ---------------------------------------------------------------------------
  77. //  Local, static data
  78. //
  79. //  gMappings
  80. //      This is a hash table of ENameMap objects. It is created and filled
  81. //      in when the platform init calls our initTransService() method.
  82. //
  83. //  gDisallow1
  84. //  gDisallowX
  85. //      These area small set of encoding names that, for temporary reasons,
  86. //      we disallow at this time.
  87. //
  88. //  gDisallowList
  89. //  gDisallowListSize
  90. //      An array of the disallow strings, for easier searching below.
  91. //
  92. //  gDisallowPre
  93. //      All of the disallowed encodings start with 'IBM', so we have a prefix
  94. //      we can check for and quickly decide if we need to search the list.
  95. // ---------------------------------------------------------------------------
  96. static RefHashTableOf<ENameMap>*    gMappings = 0;
  97. static XMLCh                        gDisallow1[] =
  98. {
  99.         chLatin_I, chLatin_B, chLatin_M, chDash, chDigit_0, chDigit_3
  100.       , chDigit_7, chNull
  101. };
  102. static XMLCh                        gDisallow2[] =
  103. {
  104.         chLatin_I, chLatin_B, chLatin_M, chDash, chDigit_3, chDigit_7, chNull
  105. };
  106. static XMLCh                        gDisallow3[] =
  107. {
  108.         chLatin_I, chLatin_B, chLatin_M, chDash, chDigit_0, chDigit_3
  109.     ,   chDigit_7, chDash, chLatin_S, chDigit_3, chDigit_9, chDigit_0, chNull
  110. };
  111. static XMLCh                        gDisallow4[] =
  112. {
  113.         chLatin_I, chLatin_B, chLatin_M, chDash, chDigit_3, chDigit_7, chDash
  114.     ,   chLatin_S, chDigit_3, chDigit_9, chDigit_0, chNull
  115. };
  116. static XMLCh                        gDisallow5[] =
  117. {
  118.         chLatin_I, chLatin_B, chLatin_M, chDash, chDigit_1, chDigit_1
  119.       , chDigit_4, chDigit_0, chNull
  120. };
  121. static XMLCh                        gDisallow6[] =
  122. {
  123.         chLatin_I, chLatin_B, chLatin_M, chDash, chDigit_1, chDigit_1
  124.       , chDigit_4, chDigit_0, chDash, chLatin_S, chDigit_3
  125.       , chDigit_9, chDigit_0, chNull
  126. };
  127. static const unsigned int           gDisallowListSize = 6;
  128. static XMLCh*                       gDisallowList[gDisallowListSize] =
  129. {
  130.     gDisallow1, gDisallow2, gDisallow3, gDisallow4, gDisallow5, gDisallow6
  131. };
  132. static XMLCh                        gDisallowPre[] =
  133. {
  134.         chLatin_I, chLatin_B, chLatin_M, chNull
  135. };
  136. // ---------------------------------------------------------------------------
  137. //  XLMTransService: Constructors and destructor
  138. // ---------------------------------------------------------------------------
  139. XMLTransService::XMLTransService()
  140. {
  141. }
  142. XMLTransService::~XMLTransService()
  143. {
  144.     delete gMappings;    // The contents of the gMappings hash table are owned by
  145.     gMappings = 0;       //   the it, and so will be deleted by gMapping's destructor.
  146. }
  147. // ---------------------------------------------------------------------------
  148. // Allow user specific encodings to be added to the mappings table.
  149. // Should be called after platform init
  150. // ---------------------------------------------------------------------------
  151. void XMLTransService::addEncoding(const XMLCh* const encoding,
  152.   ENameMap* const ownMapping) {
  153. if (gMappings) {
  154. gMappings->put((void *) encoding, ownMapping);
  155. }
  156. }
  157. // ---------------------------------------------------------------------------
  158. //  XLMTranscoder: Non-virtual API
  159. // ---------------------------------------------------------------------------
  160. XMLTranscoder*
  161. XMLTransService::makeNewTranscoderFor(  const   char* const             encodingName
  162.                                         ,       XMLTransService::Codes& resValue
  163.                                         , const unsigned int            blockSize)
  164. {
  165.     XMLCh* tmpName = XMLString::transcode(encodingName);
  166.     ArrayJanitor<XMLCh> janName(tmpName);
  167.     return makeNewTranscoderFor(tmpName, resValue, blockSize);
  168. }
  169. XMLTranscoder*
  170. XMLTransService::makeNewTranscoderFor(  const   XMLCh* const            encodingName
  171.                                         ,       XMLTransService::Codes& resValue
  172.                                         , const unsigned int            blockSize)
  173. {
  174.     //
  175.     //  First try to find it in our list of mappings to intrinsically
  176.     //  supported encodings. We have to upper case the passed encoding
  177.     //  name because we use a hash table and we stored all our mappings
  178.     //  in all uppercase.
  179.     //
  180.     const unsigned int bufSize = 2048;
  181.     XMLCh upBuf[bufSize + 1];
  182.     if (!XMLString::copyNString(upBuf, encodingName, bufSize))
  183.         return 0;
  184.     XMLString::upperCase(upBuf);
  185.     ENameMap* ourMapping = gMappings->get(upBuf);
  186.     // If we found it, then call the factory method for it
  187.     if (ourMapping)
  188.         return ourMapping->makeNew(blockSize);
  189.     //
  190.     //  For now, we have a little list of encodings that we disallow
  191.     //  explicitly. So lets check for them up front. They all start with
  192.     //  IBM, so we can do a quick check to see if we should even do
  193.     //  anything at all.
  194.     //
  195.     if (XMLString::startsWith(upBuf, gDisallowPre))
  196.     {
  197.         for (unsigned int index = 0; index < gDisallowListSize; index++)
  198.         {
  199.             // If its one of our guys, then pretend we don't understand it
  200.             if (!XMLString::compareString(upBuf, gDisallowList[index]))
  201.                 return 0;
  202.         }
  203.     }
  204.     //
  205.     //  It wasn't an intrinsic and it wasn't disallowed, so pass it on
  206.     //  to the trans service to see if he can make anything of it.
  207.     //
  208.     return makeNewXMLTranscoder(encodingName, resValue, blockSize);
  209. }
  210. // ---------------------------------------------------------------------------
  211. //  XLMTranscoder: Public Destructor
  212. // ---------------------------------------------------------------------------
  213. XMLTranscoder::~XMLTranscoder()
  214. {
  215.     delete [] fEncodingName;
  216. }
  217. // ---------------------------------------------------------------------------
  218. //  XLMTranscoder: Hidden Constructors
  219. // ---------------------------------------------------------------------------
  220. XMLTranscoder::XMLTranscoder(const  XMLCh* const    encodingName
  221.                             , const unsigned int    blockSize) :
  222.     fEncodingName(0)
  223.     , fBlockSize(blockSize)
  224. {
  225.     fEncodingName = XMLString::replicate(encodingName);
  226. }
  227. // ---------------------------------------------------------------------------
  228. //  XLMTranscoder: Protected helpers
  229. // ---------------------------------------------------------------------------
  230. void XMLTranscoder::checkBlockSize(const unsigned int toCheck)
  231. {
  232. //    if (toCheck > fBlockSize)
  233. //        ThrowXML(TranscodingException, XMLExcepts::Trans_BadBlockSize);
  234. }
  235. // ---------------------------------------------------------------------------
  236. //  XLMLCPTranscoder: Public Destructor
  237. // ---------------------------------------------------------------------------
  238. XMLLCPTranscoder::XMLLCPTranscoder()
  239. {
  240. }
  241. // ---------------------------------------------------------------------------
  242. //  XLMTranscoder: Hidden Constructors
  243. // ---------------------------------------------------------------------------
  244. XMLLCPTranscoder::~XMLLCPTranscoder()
  245. {
  246. }
  247. // ---------------------------------------------------------------------------
  248. //  XLMTranscoder: Hidden Init Method
  249. //
  250. //  This is called by platform utils during startup.
  251. // ---------------------------------------------------------------------------
  252. void XMLTransService::initTransService()
  253. {
  254.     //
  255.     //  Create our hash table that we will fill with mappings. The default
  256.     //  is to adopt the elements, which is fine with us.
  257.     //
  258.     gMappings = new RefHashTableOf<ENameMap>(103);
  259.     //
  260.     //  Add in the magical mapping for the native XMLCh transcoder. This
  261.     //  is used for internal entities.
  262.     //
  263.     gMappings->put((void*)XMLUni::fgXMLChEncodingString, new ENameMapFor<XMLChTranscoder>(XMLUni::fgXMLChEncodingString));
  264.     //
  265.     //  Add in our mappings for ASCII.
  266.     //
  267.     gMappings->put((void*)XMLUni::fgUSASCIIEncodingString, new ENameMapFor<XMLASCIITranscoder>(XMLUni::fgUSASCIIEncodingString));
  268.     gMappings->put((void*)XMLUni::fgUSASCIIEncodingString2, new ENameMapFor<XMLASCIITranscoder>(XMLUni::fgUSASCIIEncodingString2));
  269.     gMappings->put((void*)XMLUni::fgUSASCIIEncodingString3, new ENameMapFor<XMLASCIITranscoder>(XMLUni::fgUSASCIIEncodingString3));
  270.     gMappings->put((void*)XMLUni::fgUSASCIIEncodingString4, new ENameMapFor<XMLASCIITranscoder>(XMLUni::fgUSASCIIEncodingString4));
  271.     //
  272.     //  Add in our mappings for UTF-8
  273.     //
  274.     gMappings->put((void*)XMLUni::fgUTF8EncodingString, new ENameMapFor<XMLUTF8Transcoder>(XMLUni::fgUTF8EncodingString));
  275.     gMappings->put((void*)XMLUni::fgUTF8EncodingString2, new ENameMapFor<XMLUTF8Transcoder>(XMLUni::fgUTF8EncodingString2));
  276.     //
  277.     //  Add in our mappings for Latin1
  278.     //
  279.     gMappings->put((void*)XMLUni::fgISO88591EncodingString, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString));
  280.     gMappings->put((void*)XMLUni::fgISO88591EncodingString2, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString2));
  281.     gMappings->put((void*)XMLUni::fgISO88591EncodingString3, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString3));
  282.     gMappings->put((void*)XMLUni::fgISO88591EncodingString4, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString4));
  283.     gMappings->put((void*)XMLUni::fgISO88591EncodingString5, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString5));
  284.     gMappings->put((void*)XMLUni::fgISO88591EncodingString6, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString6));
  285.     gMappings->put((void*)XMLUni::fgISO88591EncodingString7, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString7));
  286.     gMappings->put((void*)XMLUni::fgISO88591EncodingString8, new ENameMapFor<XML88591Transcoder>(XMLUni::fgISO88591EncodingString8));
  287.     //
  288.     //  Add in our mappings for UTF-16 and UCS-4, little endian
  289.     //
  290.     bool swapped = false;
  291.     #if defined(ENDIANMODE_BIG)
  292.     swapped = true;
  293.     #endif
  294.     gMappings->put
  295.     (
  296. (void*)XMLUni::fgUTF16LEncodingString,
  297.         new EEndianNameMapFor<XMLUTF16Transcoder>
  298.         (
  299.             XMLUni::fgUTF16LEncodingString
  300.             , swapped
  301.         )
  302.     );
  303.     gMappings->put
  304.     (
  305. (void*)XMLUni::fgUTF16LEncodingString2,
  306.         new EEndianNameMapFor<XMLUTF16Transcoder>
  307.         (
  308.             XMLUni::fgUTF16LEncodingString2
  309.             , swapped
  310.         )
  311.     );
  312.     gMappings->put
  313.     (
  314. (void*)XMLUni::fgUCS4LEncodingString,
  315.         new EEndianNameMapFor<XMLUCS4Transcoder>
  316.         (
  317.             XMLUni::fgUCS4LEncodingString
  318.             , swapped
  319.         )
  320.     );
  321.     gMappings->put
  322.     (
  323. (void*)XMLUni::fgUCS4LEncodingString2,
  324.         new EEndianNameMapFor<XMLUCS4Transcoder>
  325.         (
  326.             XMLUni::fgUCS4LEncodingString2
  327.             , swapped
  328.         )
  329.     );
  330.     //
  331.     //  Add in our mappings for UTF-16 and UCS-4, big endian
  332.     //
  333.     swapped = false;
  334.     #if defined(ENDIANMODE_LITTLE)
  335.     swapped = true;
  336.     #endif
  337.     gMappings->put
  338.     (
  339. (void*)XMLUni::fgUTF16BEncodingString,
  340.         new EEndianNameMapFor<XMLUTF16Transcoder>
  341.         (
  342.             XMLUni::fgUTF16BEncodingString
  343.             , swapped
  344.         )
  345.     );
  346.     gMappings->put
  347.     (
  348. (void*)XMLUni::fgUTF16BEncodingString2,
  349.         new EEndianNameMapFor<XMLUTF16Transcoder>
  350.         (
  351.             XMLUni::fgUTF16BEncodingString2
  352.             , swapped
  353.         )
  354.     );
  355.     gMappings->put
  356.     (
  357. (void*)XMLUni::fgUCS4BEncodingString,
  358.         new EEndianNameMapFor<XMLUCS4Transcoder>
  359.         (
  360.             XMLUni::fgUCS4BEncodingString
  361.             , swapped
  362.         )
  363.     );
  364.     gMappings->put
  365.     (
  366. (void*)XMLUni::fgUCS4BEncodingString2,
  367.         new EEndianNameMapFor<XMLUCS4Transcoder>
  368.         (
  369.             XMLUni::fgUCS4BEncodingString2
  370.             , swapped
  371.         )
  372.     );
  373.     //
  374.     //  Add in our mappings for IBM037, and the one alias we support for
  375.     //  it, which is EBCDIC-CP-US.
  376.     //
  377.     gMappings->put((void*)XMLUni::fgIBM037EncodingString, new ENameMapFor<XMLEBCDICTranscoder>(XMLUni::fgIBM037EncodingString));
  378.     gMappings->put((void*)XMLUni::fgIBM037EncodingString2, new ENameMapFor<XMLEBCDICTranscoder>(XMLUni::fgIBM037EncodingString2));
  379.     //
  380.     //  Add in our mappings for IBM037 with Euro update, i.e. IBM1140. It
  381.     //  has no aliases
  382.     //
  383.     gMappings->put((void*)XMLUni::fgIBM1140EncodingString, new ENameMapFor<XMLIBM1140Transcoder>(XMLUni::fgIBM1140EncodingString));
  384.     //
  385.     //  Add in our mappings for Windows-1252. We don't have any aliases for
  386.     //  this one, so there is just one mapping.
  387.     //
  388.     gMappings->put((void*)XMLUni::fgWin1252EncodingString, new ENameMapFor<XMLWin1252Transcoder>(XMLUni::fgWin1252EncodingString));
  389. }