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

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  * 
  4.  * Copyright (c) 1999-2000 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: XMLFormatter.hpp,v $
  58.  * Revision 1.7  2000/10/17 19:25:38  andyh
  59.  * XMLFormatTarget, removed version of writeChars with no length.  Can not be
  60.  * safely used, and obscured other errors.
  61.  *
  62.  * Revision 1.6  2000/10/10 23:54:58  andyh
  63.  * XMLFormatter patch, contributed by Bill Schindler.  Fix problems with
  64.  * output to multi-byte encodings.
  65.  *
  66.  * Revision 1.5  2000/04/07 01:01:56  roddey
  67.  * Fixed an error message so that it indicated the correct radix for the rep
  68.  * token. Get all of the basic output formatting functionality in place for
  69.  * at least ICU and Win32 transcoders.
  70.  *
  71.  * Revision 1.4  2000/04/06 23:50:38  roddey
  72.  * Now the low level formatter handles doing char refs for
  73.  * unrepresentable chars (in addition to the replacement char style
  74.  * already done.)
  75.  *
  76.  * Revision 1.3  2000/04/06 19:09:21  roddey
  77.  * Some more improvements to output formatting. Now it will correctly
  78.  * handle doing the 'replacement char' style of dealing with chars
  79.  * that are unrepresentable.
  80.  *
  81.  * Revision 1.2  2000/04/05 00:20:16  roddey
  82.  * More updates for the low level formatted output support
  83.  *
  84.  * Revision 1.1  2000/03/28 19:43:17  roddey
  85.  * Fixes for signed/unsigned warnings. New work for two way transcoding
  86.  * stuff.
  87.  *
  88.  */
  89. #if !defined(XMLFORMATTER_HPP)
  90. #define XMLFORMATTER_HPP
  91. #include <util/XercesDefs.hpp>
  92. class XMLFormatTarget;
  93. class XMLTranscoder;
  94. /**
  95.  *  This class provides the basic formatting capabilities that are required
  96.  *  to turn the Unicode based XML data from the parsers into a form that can
  97.  *  be used on non-Unicode based systems, i.e. into local or generic text
  98.  *  encodings.
  99.  *
  100.  *  A number of flags are provided to control whether various optional
  101.  *  formatting operations are performed.
  102.  */
  103. class XMLPARSER_EXPORT XMLFormatter
  104. {
  105. public:
  106.     // -----------------------------------------------------------------------
  107.     //  Class types
  108.     // -----------------------------------------------------------------------
  109.     enum EscapeFlags
  110.     {
  111.         NoEscapes
  112.         , StdEscapes
  113.         , AttrEscapes
  114.         , CharEscapes
  115.         // Special values, don't use directly
  116.         , EscapeFlags_Count
  117.         , DefaultEscape     = 999
  118.     };
  119.     enum UnRepFlags
  120.     {
  121.         UnRep_Fail
  122.         , UnRep_CharRef
  123.         , UnRep_Replace
  124.         , DefaultUnRep      = 999
  125.     };
  126.     // -----------------------------------------------------------------------
  127.     //  Constructors and Destructor
  128.     // -----------------------------------------------------------------------
  129.     XMLFormatter
  130.     (
  131.         const   XMLCh* const            outEncoding
  132.         ,       XMLFormatTarget* const  target
  133.         , const EscapeFlags             escapeFlags = NoEscapes
  134.         , const UnRepFlags              unrepFlags = UnRep_Fail
  135.     );
  136.     XMLFormatter
  137.     (
  138.         const   char* const             outEncoding
  139.         ,       XMLFormatTarget* const  target
  140.         , const EscapeFlags             escapeFlags = NoEscapes
  141.         , const UnRepFlags              unrepFlags = UnRep_Fail
  142.     );
  143.     ~XMLFormatter();
  144.     // -----------------------------------------------------------------------
  145.     //  Formatting methods
  146.     // -----------------------------------------------------------------------
  147.     void formatBuf
  148.     (
  149.         const   XMLCh* const    toFormat
  150.         , const unsigned int    count
  151.         , const EscapeFlags     escapeFlags = DefaultEscape
  152.         , const UnRepFlags      unrepFlags = DefaultUnRep
  153.     );
  154.     XMLFormatter& operator<<
  155.     (
  156.         const   XMLCh* const    toFormat
  157.     );
  158.     XMLFormatter& operator<<
  159.     (
  160.         const   XMLCh           toFormat
  161.     );
  162.     // -----------------------------------------------------------------------
  163.     //  Getter methods
  164.     // -----------------------------------------------------------------------
  165.     const XMLCh* getEncodingName() const;
  166.     // -----------------------------------------------------------------------
  167.     //  Setter methods
  168.     // -----------------------------------------------------------------------
  169.     void setEscapeFlags
  170.     (
  171.         const   EscapeFlags     newFlags
  172.     );
  173.     void setUnRepFlags
  174.     (
  175.         const   UnRepFlags      newFlags
  176.     );
  177.     XMLFormatter& operator<<
  178.     (
  179.         const   EscapeFlags     newFlags
  180.     );
  181.     XMLFormatter& operator<<
  182.     (
  183.         const   UnRepFlags      newFlags
  184.     );
  185. private :
  186.     // -----------------------------------------------------------------------
  187.     //  Unimplemented constructors and operators
  188.     // -----------------------------------------------------------------------
  189.     XMLFormatter();
  190.     XMLFormatter(const XMLFormatter&);
  191.     void operator=(const XMLFormatter&);
  192.     // -----------------------------------------------------------------------
  193.     //  Private class constants
  194.     // -----------------------------------------------------------------------
  195.     enum Constants
  196.     {
  197.         kTmpBufSize     = 16 * 1024
  198.     };
  199.     // -----------------------------------------------------------------------
  200.     //  Private helper methods
  201.     // -----------------------------------------------------------------------
  202.     const XMLByte* getAposRef(unsigned int & count);
  203.     const XMLByte* getAmpRef(unsigned int & count);
  204.     const XMLByte* getGTRef(unsigned int & count);
  205.     const XMLByte* getLTRef(unsigned int & count);
  206.     const XMLByte* getQuoteRef(unsigned int & count);
  207.     void specialFormat
  208.     (
  209.         const   XMLCh* const    toFormat
  210.         , const unsigned int    count
  211.         , const EscapeFlags     escapeFlags
  212.     );
  213.     // -----------------------------------------------------------------------
  214.     //  Private, non-virtual methods
  215.     //
  216.     //  fEscapeFlags
  217.     //      The escape flags we were told to use in formatting. These are
  218.     //      defaults set in the ctor, which can be overridden on a particular
  219.     //      call.
  220.     //
  221.     //  fOutEncoding
  222.     //      This the name of the output encoding. Saved mainly for meaningful
  223.     //      error messages.
  224.     //
  225.     //  fTarget
  226.     //      This is the target object for the formatting operation.
  227.     //
  228.     //  fUnRepFlags
  229.     //      The unrepresentable flags that indicate how to react when a
  230.     //      character cannot be represented in the target encoding.
  231.     //
  232.     //  fXCoder
  233.     //      This the transcoder that we will use. It is created using the
  234.     //      encoding name we were told to use.
  235.     //
  236.     //  fTmpBuf
  237.     //      An output buffer that we use to transcode chars into before we
  238.     //      send them off to be output.
  239.     //
  240.     //  fAposRef
  241.     //  fAmpRef
  242.     //  fGTRef
  243.     //  fLTRef
  244.     //  fQuoteRef
  245.     //      These are character refs for the standard char refs, in the
  246.     //      output encoding. They are faulted in as required, by transcoding
  247.     //      them from fixed Unicode versions.
  248.     // -----------------------------------------------------------------------
  249.     EscapeFlags                 fEscapeFlags;
  250.     XMLCh*                      fOutEncoding;
  251.     XMLFormatTarget*            fTarget;
  252.     UnRepFlags                  fUnRepFlags;
  253.     XMLTranscoder*              fXCoder;
  254.     XMLByte                     fTmpBuf[kTmpBufSize + 4];
  255.     XMLByte*                    fAposRef;
  256.     unsigned int                fAposLen;
  257.     XMLByte*                    fAmpRef;
  258.     unsigned int                fAmpLen;
  259.     XMLByte*                    fGTRef;
  260.     unsigned int                fGTLen;
  261.     XMLByte*                    fLTRef;
  262.     unsigned int                fLTLen;
  263.     XMLByte*                    fQuoteRef;
  264.     unsigned int                fQuoteLen;
  265. };
  266. class XMLPARSER_EXPORT XMLFormatTarget
  267. {
  268. public:
  269.     // -----------------------------------------------------------------------
  270.     //  Constructors and Destructor
  271.     // -----------------------------------------------------------------------
  272.     virtual ~XMLFormatTarget() {}
  273.     // -----------------------------------------------------------------------
  274.     //  Virtual interface
  275.     // -----------------------------------------------------------------------
  276.     virtual void writeChars
  277.     (
  278.         const   XMLByte* const      toWrite
  279.         , const unsigned int        count
  280.         ,       XMLFormatter* const formatter
  281.     ) = 0;
  282. protected :
  283.     // -----------------------------------------------------------------------
  284.     //  Hidden constructors and operators
  285.     // -----------------------------------------------------------------------
  286.     XMLFormatTarget() {}
  287.     XMLFormatTarget(const XMLFormatTarget&) {}
  288.     void operator=(const XMLFormatTarget&) {}
  289. };
  290. // ---------------------------------------------------------------------------
  291. //  XMLFormatter: Getter methods
  292. // ---------------------------------------------------------------------------
  293. inline const XMLCh* XMLFormatter::getEncodingName() const
  294. {
  295.     return fOutEncoding;
  296. }
  297. // ---------------------------------------------------------------------------
  298. //  XMLFormatter: Setter methods
  299. // ---------------------------------------------------------------------------
  300. inline void XMLFormatter::setEscapeFlags(const EscapeFlags newFlags)
  301. {
  302.     fEscapeFlags = newFlags;
  303. }
  304. inline void XMLFormatter::setUnRepFlags(const UnRepFlags newFlags)
  305. {
  306.     fUnRepFlags = newFlags;
  307. }
  308. inline XMLFormatter& XMLFormatter::operator<<(const EscapeFlags newFlags)
  309. {
  310.     fEscapeFlags = newFlags;
  311.     return *this;
  312. }
  313. inline XMLFormatter& XMLFormatter::operator<<(const UnRepFlags newFlags)
  314. {
  315.     fUnRepFlags = newFlags;
  316.     return *this;
  317. }
  318. #endif