TransService.hpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:21k
源码类别:

词法分析

开发平台:

Visual 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.  * $Log: TransService.hpp,v $
  58.  * Revision 1.8  2003/05/15 19:07:45  knoaman
  59.  * Partial implementation of the configurable memory manager.
  60.  *
  61.  * Revision 1.7  2003/03/07 18:11:55  tng
  62.  * Return a reference instead of void for operator=
  63.  *
  64.  * Revision 1.6  2003/02/04 22:11:52  peiyongz
  65.  * bug#16784: Obsolete documentation on XMLTranscoder -- reported by
  66.  * Colin Paul Adams, Preston Lancashire
  67.  *
  68.  * Revision 1.5  2002/11/25 21:27:52  tng
  69.  * Performance: use XMLRecognizer::Encodings enum to make new transcode, faster than comparing the encoding string every time.
  70.  *
  71.  * Revision 1.4  2002/11/04 15:22:04  tng
  72.  * C++ Namespace Support.
  73.  *
  74.  * Revision 1.3  2002/07/18 20:05:31  knoaman
  75.  * Add a new feature to control strict IANA encoding name.
  76.  *
  77.  * Revision 1.2  2002/04/09 15:44:00  knoaman
  78.  * Add lower case string support.
  79.  *
  80.  * Revision 1.1.1.1  2002/02/01 22:22:13  peiyongz
  81.  * sane_include
  82.  *
  83.  * Revision 1.14  2001/11/01 23:37:07  jasons
  84.  * 2001-11-01  Jason E. Stewart  <jason@openinformatics.com>
  85.  *
  86.  *  * src/util/TransService.hpp (Repository):
  87.  *  Updated Doxygen documentation for XMLTranscoder class
  88.  *
  89.  * Revision 1.13  2001/05/11 13:26:30  tng
  90.  * Copyright update.
  91.  *
  92.  * Revision 1.12  2001/01/25 19:19:32  tng
  93.  * Let user add their encoding to the intrinsic mapping table.  Added by Khaled Noaman.
  94.  *
  95.  * Revision 1.11  2000/04/12 22:57:45  roddey
  96.  * A couple of fixes to comments and parameter names to make them
  97.  * more correct.
  98.  *
  99.  * Revision 1.10  2000/03/28 19:43:19  roddey
  100.  * Fixes for signed/unsigned warnings. New work for two way transcoding
  101.  * stuff.
  102.  *
  103.  * Revision 1.9  2000/03/17 23:59:54  roddey
  104.  * Initial updates for two way transcoding support
  105.  *
  106.  * Revision 1.8  2000/03/02 19:54:46  roddey
  107.  * This checkin includes many changes done while waiting for the
  108.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  109.  * available elsewhere.
  110.  *
  111.  * Revision 1.7  2000/02/24 20:05:25  abagchi
  112.  * Swat for removing Log from API docs
  113.  *
  114.  * Revision 1.6  2000/02/06 07:48:04  rahulj
  115.  * Year 2K copyright swat.
  116.  *
  117.  * Revision 1.5  2000/01/25 22:49:55  roddey
  118.  * Moved the supportsSrcOfs() method from the individual transcoder to the
  119.  * transcoding service, where it should have been to begin with.
  120.  *
  121.  * Revision 1.4  2000/01/25 19:19:07  roddey
  122.  * Simple addition of a getId() method to the xcode and netacess abstractions to
  123.  * allow each impl to give back an id string.
  124.  *
  125.  * Revision 1.3  1999/12/18 00:18:10  roddey
  126.  * More changes to support the new, completely orthagonal support for
  127.  * intrinsic encodings.
  128.  *
  129.  * Revision 1.2  1999/12/15 19:41:28  roddey
  130.  * Support for the new transcoder system, where even intrinsic encodings are
  131.  * done via the same transcoder abstraction as external ones.
  132.  *
  133.  * Revision 1.1.1.1  1999/11/09 01:05:16  twl
  134.  * Initial checkin
  135.  *
  136.  * Revision 1.2  1999/11/08 20:45:16  rahul
  137.  * Swat for adding in Product name and CVS comment log variable.
  138.  *
  139.  */
  140. #ifndef TRANSSERVICE_HPP
  141. #define TRANSSERVICE_HPP
  142. #include <xercesc/util/XMemory.hpp>
  143. #include <xercesc/util/PlatformUtils.hpp>
  144. #include <xercesc/framework/XMLRecognizer.hpp>
  145. XERCES_CPP_NAMESPACE_BEGIN
  146. // Forward references
  147. //class XMLPlatformUtils;
  148. class XMLLCPTranscoder;
  149. class XMLTranscoder;
  150. class ENameMap;
  151. //
  152. //  This class is an abstract base class which are used to abstract the
  153. //  transcoding services that Xerces uses. The parser's actual transcoding
  154. //  needs are small so it is desirable to allow different implementations
  155. //  to be provided.
  156. //
  157. //  The transcoding service has to provide a couple of required string
  158. //  and character operations, but its most important service is the creation
  159. //  of transcoder objects. There are two types of transcoders, which are
  160. //  discussed below in the XMLTranscoder class' description.
  161. //
  162. class XMLUTIL_EXPORT XMLTransService : public XMemory
  163. {
  164. public :
  165.     // -----------------------------------------------------------------------
  166.     //  Class specific types
  167.     // -----------------------------------------------------------------------
  168.     enum Codes
  169.     {
  170.         Ok
  171.         , UnsupportedEncoding
  172.         , InternalFailure
  173.         , SupportFilesNotFound
  174.     };
  175.     struct TransRec
  176.     {
  177.         XMLCh       intCh;
  178.         XMLByte     extCh;
  179.     };
  180.     // -----------------------------------------------------------------------
  181.     //  Public constructors and destructor
  182.     // -----------------------------------------------------------------------
  183.     virtual ~XMLTransService();
  184.     // -----------------------------------------------------------------------
  185.     //  Non-virtual API
  186.     // -----------------------------------------------------------------------
  187.     XMLTranscoder* makeNewTranscoderFor
  188.     (
  189.         const   XMLCh* const            encodingName
  190.         ,       XMLTransService::Codes& resValue
  191.         , const unsigned int            blockSize
  192.         , MemoryManager* const          manager
  193.     );
  194.     XMLTranscoder* makeNewTranscoderFor
  195.     (
  196.         const   char* const             encodingName
  197.         ,       XMLTransService::Codes& resValue
  198.         , const unsigned int            blockSize
  199.         , MemoryManager* const          manager
  200.     );
  201.     XMLTranscoder* makeNewTranscoderFor
  202.     (
  203.         XMLRecognizer::Encodings        encodingEnum
  204.         ,       XMLTransService::Codes& resValue
  205.         , const unsigned int            blockSize
  206.         , MemoryManager* const          manager
  207.     );
  208.     // -----------------------------------------------------------------------
  209.     //  The virtual transcoding service API
  210.     // -----------------------------------------------------------------------
  211.     virtual int compareIString
  212.     (
  213.         const   XMLCh* const    comp1
  214.         , const XMLCh* const    comp2
  215.     ) = 0;
  216.     virtual int compareNIString
  217.     (
  218.         const   XMLCh* const    comp1
  219.         , const XMLCh* const    comp2
  220.         , const unsigned int    maxChars
  221.     ) = 0;
  222.     virtual const XMLCh* getId() const = 0;
  223.     virtual bool isSpace(const XMLCh toCheck) const = 0;
  224.     virtual XMLLCPTranscoder* makeNewLCPTranscoder() = 0;
  225.     virtual bool supportsSrcOfs() const = 0;
  226.     virtual void upperCase(XMLCh* const toUpperCase) const = 0;
  227.     virtual void lowerCase(XMLCh* const toLowerCase) const = 0;
  228. // -----------------------------------------------------------------------
  229.     // Allow users to add their own encodings to the intrinsinc mapping
  230. // table
  231. // Usage:
  232. // XMLTransService::addEncoding (
  233. // gMyEncodingNameString
  234.     // , new ENameMapFor<MyTransClassType>(gMyEncodingNameString)
  235. // );
  236.     // -----------------------------------------------------------------------
  237. static void addEncoding(const XMLCh* const encoding, ENameMap* const ownMapping);
  238. protected :
  239.     // -----------------------------------------------------------------------
  240.     //  Hidden constructors
  241.     // -----------------------------------------------------------------------
  242.     XMLTransService();
  243.     // -----------------------------------------------------------------------
  244.     //  Protected virtual methods.
  245.     // -----------------------------------------------------------------------
  246.     virtual XMLTranscoder* makeNewXMLTranscoder
  247.     (
  248.         const   XMLCh* const            encodingName
  249.         ,       XMLTransService::Codes& resValue
  250.         , const unsigned int            blockSize
  251.         , MemoryManager* const          manager
  252.     ) = 0;
  253. private :
  254.     // -----------------------------------------------------------------------
  255.     //  Unimplemented constructors and operators
  256.     // -----------------------------------------------------------------------
  257.     XMLTransService(const XMLTransService&);
  258.     XMLTransService& operator=(const XMLTransService&);
  259.     // -----------------------------------------------------------------------
  260.     //  Hidden method to enable/disable strict IANA encoding check
  261.     //  Caller: XMLPlatformUtils
  262.     // -----------------------------------------------------------------------
  263.     void strictIANAEncoding(const bool newState);
  264.     bool isStrictIANAEncoding();
  265.     // -----------------------------------------------------------------------
  266.     //  Hidden init method for platform utils to call
  267.     // -----------------------------------------------------------------------
  268.     friend class XMLPlatformUtils;
  269.     void initTransService();
  270. };
  271. /**
  272.   * <code>DOMString</code> is the generic string class that stores all strings
  273.   * used in the DOM C++ API.
  274.   *
  275.   * Though this class supports most of the common string operations to manipulate
  276.   * strings, it is not meant to be a comphrehensive string class.
  277.   */
  278. /**
  279.   *   <code>XMLTranscoder</code> is for transcoding non-local code
  280.   *   page encodings, i.e.  named encodings. These are used internally
  281.   *   by the scanner to internalize raw XML into the internal Unicode
  282.   *   format, and by writer classes to convert that internal Unicode
  283.   *   format (which comes out of the parser) back out to a format that
  284.   *   the receiving client code wants to use.
  285.   */
  286. class XMLUTIL_EXPORT XMLTranscoder : public XMemory
  287. {
  288. public :
  289. /**
  290.  * This enum is used by the <code>transcodeTo()</code> method
  291.  * to indicate how to react to unrepresentable characters. The
  292.  * <code>transcodeFrom()</code> method always works the
  293.  * same. It will consider any invalid data to be an error and
  294.  * throw.
  295.  */
  296.     enum UnRepOpts
  297.     {
  298.         UnRep_Throw /**< Throw an exception */
  299.         , UnRep_RepChar /**< Use the replacement char */
  300.     };
  301. /** @name Destructor. */
  302. //@{
  303.  /**
  304.   * Destructor for XMLTranscoder
  305.   *
  306.   */
  307.     virtual ~XMLTranscoder();
  308. //@}
  309.     /** @name The virtual transcoding interface */
  310.     //@{
  311.     /** Converts from the encoding of the service to the internal XMLCh* encoding
  312.       *
  313.       * @param srcData the source buffer to be transcoded
  314.       * @param srcCount number of characters in the source buffer
  315.       * @param toFill the destination buffer
  316.       * @param maxChars the max number of characters in the destination buffer
  317.       * @param bytesEaten after transcoding, this will hold the number of bytes
  318.       *    that were processed from the source buffer
  319.       * @param charSizes an array which must be at least as big as maxChars
  320.       *    into which will be inserted values that indicate how many
  321.       *    bytes from the input went into each XMLCh that was created
  322.       *    into toFill. Since many encodings use variable numbers of
  323.       *    byte per character, this provides a means to find out what
  324.       *    bytes in the input went into making a particular output
  325.       *    UTF-16 character.
  326.       * @return Returns the number of chars put into the target buffer
  327.       */
  328.     virtual unsigned int transcodeFrom
  329.     (
  330.         const   XMLByte* const          srcData
  331.         , const unsigned int            srcCount
  332.         ,       XMLCh* const            toFill
  333.         , const unsigned int            maxChars
  334.         ,       unsigned int&           bytesEaten
  335.         ,       unsigned char* const    charSizes
  336.     ) = 0;
  337.     /** Converts from the internal XMLCh* encoding to the encoding of the service
  338.       *
  339.       * @param srcData    the source buffer to be transcoded
  340.       * @param srcCount   number of characters in the source buffer
  341.       * @param toFill     the destination buffer
  342.       * @param maxBytes   the max number of bytes in the destination buffer
  343.       * @param charsEaten after transcoding, this will hold the number of chars
  344.       *    that were processed from the source buffer
  345.       * @param options    options to pass to the transcoder that explain how to
  346.       *    respond to an unrepresentable character
  347.       * @return Returns the number of chars put into the target buffer
  348.       */
  349.     virtual unsigned int transcodeTo
  350.     (
  351.         const   XMLCh* const    srcData
  352.         , const unsigned int    srcCount
  353.         ,       XMLByte* const  toFill
  354.         , const unsigned int    maxBytes
  355.         ,       unsigned int&   charsEaten
  356.         , const UnRepOpts       options
  357.     ) = 0;
  358.     /** Query whether the transcoder can handle a given character
  359.       *
  360.       * @param toCheck   the character code point to check
  361.       */
  362.     virtual bool canTranscodeTo
  363.     (
  364.         const   unsigned int    toCheck
  365.     )   const = 0;
  366.     //@}
  367.     /** @name Getter methods */
  368.     //@{
  369.     /** Get the internal block size
  370.      *
  371.        * @return The block size indicated in the constructor.
  372.        */
  373.     unsigned int getBlockSize() const;
  374.     /** Get the encoding name
  375.       *
  376.       * @return the name of the encoding that this
  377.       *    <code>XMLTranscoder</code> object is for
  378.       */
  379.     const XMLCh* getEncodingName() const;
  380. //@}
  381.     /** @name Getter methods*/
  382.     //@{
  383.     /** Get the plugged-in memory manager
  384.       *
  385.       * This method returns the plugged-in memory manager user for dynamic
  386.       * memory allocation/deallocation.
  387.       *
  388.       * @return the plugged-in memory manager
  389.       */
  390.     MemoryManager* getMemoryManager() const;
  391. //@}
  392. protected :
  393.     // -----------------------------------------------------------------------
  394.     //  Hidden constructors
  395.     // -----------------------------------------------------------------------
  396.     XMLTranscoder
  397.     (
  398.         const   XMLCh* const    encodingName
  399.         , const unsigned int    blockSize
  400.         , MemoryManager* const  manager = XMLPlatformUtils::fgMemoryManager
  401.     );
  402.     // -----------------------------------------------------------------------
  403.     //  Protected helper methods
  404.     // -----------------------------------------------------------------------
  405.     void checkBlockSize(const unsigned int toCheck);
  406. private :
  407.     // -----------------------------------------------------------------------
  408.     //  Unimplemented constructors and operators
  409.     // -----------------------------------------------------------------------
  410.     XMLTranscoder(const XMLTranscoder&);
  411.     XMLTranscoder& operator=(const XMLTranscoder&);
  412.     // -----------------------------------------------------------------------
  413.     //  Private data members
  414.     //
  415.     //  fBlockSize
  416.     //      This is the block size indicated in the constructor.
  417.     //
  418.     //  fEncodingName
  419.     //      This is the name of the encoding this encoder is for. All basic
  420.     //      XML transcoder's are for named encodings.
  421.     // -----------------------------------------------------------------------
  422.     unsigned int    fBlockSize;
  423.     XMLCh*          fEncodingName;
  424.     MemoryManager*  fMemoryManager;
  425. };
  426. //
  427. //  This class is a specialized transcoder that only transcodes between
  428. //  the internal XMLCh format and the local code page. It is specialized
  429. //  for the very common job of translating data from the client app's
  430. //  native code page to the internal format and vice versa.
  431. //
  432. class XMLUTIL_EXPORT XMLLCPTranscoder : public XMemory
  433. {
  434. public :
  435.     // -----------------------------------------------------------------------
  436.     //  Public constructors and destructor
  437.     // -----------------------------------------------------------------------
  438.     virtual ~XMLLCPTranscoder();
  439.     // -----------------------------------------------------------------------
  440.     //  The virtual transcoder API
  441.     //
  442.     //  NOTE:   All these APIs don't include null terminator characters in
  443.     //          their parameters. So calcRequiredSize() returns the number
  444.     //          of actual chars, not including the null. maxBytes and maxChars
  445.     //          parameters refer to actual chars, not including the null so
  446.     //          its assumed that the buffer is physically one char or byte
  447.     //          larger.
  448.     // -----------------------------------------------------------------------
  449.     virtual unsigned int calcRequiredSize(const char* const srcText) = 0;
  450.     virtual unsigned int calcRequiredSize(const XMLCh* const srcText) = 0;
  451.     virtual char* transcode(const XMLCh* const toTranscode) = 0;
  452.     virtual char* transcode(const XMLCh* const toTranscode,
  453.                             MemoryManager* const manager) = 0;
  454.     virtual XMLCh* transcode(const char* const toTranscode) = 0;
  455.     virtual XMLCh* transcode(const char* const toTranscode,
  456.                              MemoryManager* const manager) = 0;
  457.     virtual bool transcode
  458.     (
  459.         const   char* const     toTranscode
  460.         ,       XMLCh* const    toFill
  461.         , const unsigned int    maxChars
  462.     ) = 0;
  463.     virtual bool transcode
  464.     (
  465.         const   XMLCh* const    toTranscode
  466.         ,       char* const     toFill
  467.         , const unsigned int    maxBytes
  468.     ) = 0;
  469. protected :
  470.     // -----------------------------------------------------------------------
  471.     //  Hidden constructors
  472.     // -----------------------------------------------------------------------
  473.     XMLLCPTranscoder();
  474. private :
  475.     // -----------------------------------------------------------------------
  476.     //  Unimplemented constructors and operators
  477.     // -----------------------------------------------------------------------
  478.     XMLLCPTranscoder(const XMLLCPTranscoder&);
  479.     XMLLCPTranscoder& operator=(const XMLLCPTranscoder&);
  480. };
  481. // ---------------------------------------------------------------------------
  482. //  XMLTranscoder: Getter methods
  483. // ---------------------------------------------------------------------------
  484. inline MemoryManager* XMLTranscoder::getMemoryManager() const
  485. {
  486.     return fMemoryManager;
  487. }
  488. // ---------------------------------------------------------------------------
  489. //  XMLTranscoder: Protected helper methods
  490. // ---------------------------------------------------------------------------
  491. inline unsigned int XMLTranscoder::getBlockSize() const
  492. {
  493.     return fBlockSize;
  494. }
  495. inline const XMLCh* XMLTranscoder::getEncodingName() const
  496. {
  497.     return fEncodingName;
  498. }
  499. XERCES_CPP_NAMESPACE_END
  500. #endif