# XMLFormatter.hpp

Go to the documentation of this file.

    00001 /*
    00002  * Licensed to the Apache Software Foundation (ASF) under one or more
    00003  * contributor license agreements.  See the NOTICE file distributed with
    00004  * this work for additional information regarding copyright ownership.
    00005  * The ASF licenses this file to You under the Apache License, Version 2.0
    00006  * (the "License"); you may not use this file except in compliance with
    00007  * the License.  You may obtain a copy of the License at
    00008  *
    00009  *      http://www.apache.org/licenses/LICENSE-2.0
    00010  *
    00011  * Unless required by applicable law or agreed to in writing, software
    00012  * distributed under the License is distributed on an "AS IS" BASIS,
    00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    00014  * See the License for the specific language governing permissions and
    00015  * limitations under the License.
    00016  */
    00017
    00018 /*
    00019  * $Id: XMLFormatter.hpp 698579 2008-09-24 14:13:08Z borisk $
    00020  */
    00021
    00022 #if !defined(XERCESC_INCLUDE_GUARD_XMLFORMATTER_HPP)
    00023 #define XERCESC_INCLUDE_GUARD_XMLFORMATTER_HPP
    00024
    00025 #include <xercesc/util/PlatformUtils.hpp>
    00026
    00027 XERCES_CPP_NAMESPACE_BEGIN
    00028
    00029 class XMLFormatTarget;
    00030 class XMLTranscoder;
    00031
    00041 class XMLPARSER_EXPORT XMLFormatter : public XMemory
    00042 {
    00043 public:
    00044     // -----------------------------------------------------------------------
    00045     //  Class types
    00046     // -----------------------------------------------------------------------
    00124     enum EscapeFlags
    00125     {
    00126         NoEscapes
    00127         , StdEscapes
    00128         , AttrEscapes
    00129         , CharEscapes
    00130
    00131         // Special values, don't use directly
    00132         , EscapeFlags_Count
    00133         , DefaultEscape     = 999
    00134     };
    00135
    00152     enum UnRepFlags
    00153     {
    00154         UnRep_Fail
    00155         , UnRep_CharRef
    00156         , UnRep_Replace
    00157
    00158         , DefaultUnRep      = 999
    00159     };
    00161
    00162
    00163     // -----------------------------------------------------------------------
    00164     //  Constructors and Destructor
    00165     // -----------------------------------------------------------------------
    00177     XMLFormatter
    00178     (
    00179         const   XMLCh* const            outEncoding
    00180         , const XMLCh* const            docVersion
    00181         ,       XMLFormatTarget* const  target
    00182         , const EscapeFlags             escapeFlags = NoEscapes
    00183         , const UnRepFlags              unrepFlags = UnRep_Fail
    00184         ,       MemoryManager* const    manager = XMLPlatformUtils::fgMemoryManager
    00185     );
    00186
    00187     XMLFormatter
    00188     (
    00189         const   char* const             outEncoding
    00190         , const char* const             docVersion
    00191         ,       XMLFormatTarget* const  target
    00192         , const EscapeFlags             escapeFlags = NoEscapes
    00193         , const UnRepFlags              unrepFlags = UnRep_Fail
    00194         ,       MemoryManager* const    manager = XMLPlatformUtils::fgMemoryManager
    00195     );
    00196
    00197     XMLFormatter
    00198     (
    00199         const   XMLCh* const            outEncoding
    00200         ,       XMLFormatTarget* const  target
    00201         , const EscapeFlags             escapeFlags = NoEscapes
    00202         , const UnRepFlags              unrepFlags = UnRep_Fail
    00203         ,       MemoryManager* const    manager = XMLPlatformUtils::fgMemoryManager
    00204     );
    00205
    00206     XMLFormatter
    00207     (
    00208         const   char* const             outEncoding
    00209         ,       XMLFormatTarget* const  target
    00210         , const EscapeFlags             escapeFlags = NoEscapes
    00211         , const UnRepFlags              unrepFlags = UnRep_Fail
    00212         ,       MemoryManager* const    manager = XMLPlatformUtils::fgMemoryManager
    00213     );
    00214
    00215     ~XMLFormatter();
    00217
    00218
    00219     // -----------------------------------------------------------------------
    00220     //  Formatting methods
    00221     // -----------------------------------------------------------------------
    00231     void formatBuf
    00232     (
    00233         const   XMLCh* const    toFormat
    00234         , const XMLSize_t       count
    00235         , const EscapeFlags     escapeFlags = DefaultEscape
    00236         , const UnRepFlags      unrepFlags = DefaultUnRep
    00237     );
    00238
    00242     XMLFormatter& operator<<
    00243     (
    00244         const   XMLCh* const    toFormat
    00245     );
    00246
    00247     XMLFormatter& operator<<
    00248     (
    00249         const   XMLCh           toFormat
    00250     );
    00251
    00252     void writeBOM(const XMLByte* const toFormat
    00253                 , const XMLSize_t      count);
    00254
    00256
    00257     // -----------------------------------------------------------------------
    00258     //  Getter methods
    00259     // -----------------------------------------------------------------------
    00266     const XMLCh* getEncodingName() const;
    00267
    00271     inline const XMLTranscoder*   getTranscoder() const;
    00272
    00276     inline XMLTranscoder*   getTranscoder();
    00277
    00279
    00280     // -----------------------------------------------------------------------
    00281     //  Setter methods
    00282     // -----------------------------------------------------------------------
    00288     void setEscapeFlags
    00289     (
    00290         const   EscapeFlags     newFlags
    00291     );
    00292
    00296     void setUnRepFlags
    00297     (
    00298         const   UnRepFlags      newFlags
    00299     );
    00300
    00305     XMLFormatter& operator<<
    00306     (
    00307         const   EscapeFlags     newFlags
    00308     );
    00309
    00314     XMLFormatter& operator<<
    00315     (
    00316         const   UnRepFlags      newFlags
    00317     );
    00319
    00320     // -----------------------------------------------------------------------
    00321     //  Getter methods
    00322     // -----------------------------------------------------------------------
    00328     EscapeFlags getEscapeFlags() const;
    00329
    00333     UnRepFlags getUnRepFlags() const;
    00335
    00336 private :
    00337     // -----------------------------------------------------------------------
    00338     //  Unimplemented constructors and operators
    00339     // -----------------------------------------------------------------------
    00340     XMLFormatter();
    00341     XMLFormatter(const XMLFormatter&);
    00342     XMLFormatter& operator=(const XMLFormatter&);
    00343
    00344
    00345     // -----------------------------------------------------------------------
    00346     //  Private class constants
    00347     // -----------------------------------------------------------------------
    00348     enum Constants
    00349     {
    00350         kTmpBufSize     = 16 * 1024
    00351     };
    00352
    00353
    00354     // -----------------------------------------------------------------------
    00355     //  Private helper methods
    00356     // -----------------------------------------------------------------------
    00357     const XMLByte* getCharRef(XMLSize_t     &count,
    00358                               XMLByte*      &ref,
    00359                               const XMLCh *  stdRef);
    00360
    00361     void writeCharRef(const XMLCh &toWrite);
    00362     void writeCharRef(XMLSize_t toWrite);
    00363
    00364     bool inEscapeList(const XMLFormatter::EscapeFlags escStyle
    00365                     , const XMLCh                     toCheck);
    00366
    00367
    00368     XMLSize_t handleUnEscapedChars(const XMLCh *      srcPtr,
    00369                                    const XMLSize_t    count,
    00370                                    const UnRepFlags   unrepFlags);
    00371
    00372     void specialFormat
    00373     (
    00374         const   XMLCh* const    toFormat
    00375         , const XMLSize_t       count
    00376         , const EscapeFlags     escapeFlags
    00377     );
    00378
    00379
    00380     // -----------------------------------------------------------------------
    00381     //  Private, non-virtual methods
    00382     //
    00383     //  fEscapeFlags
    00384     //      The escape flags we were told to use in formatting. These are
    00385     //      defaults set in the ctor, which can be overridden on a particular
    00386     //      call.
    00387     //
    00388     //  fOutEncoding
    00389     //      This the name of the output encoding. Saved mainly for meaningful
    00390     //      error messages.
    00391     //
    00392     //  fTarget
    00393     //      This is the target object for the formatting operation.
    00394     //
    00395     //  fUnRepFlags
    00396     //      The unrepresentable flags that indicate how to react when a
    00397     //      character cannot be represented in the target encoding.
    00398     //
    00399     //  fXCoder
    00400     //      This the transcoder that we will use. It is created using the
    00401     //      encoding name we were told to use.
    00402     //
    00403     //  fTmpBuf
    00404     //      An output buffer that we use to transcode chars into before we
    00405     //      send them off to be output.
    00406     //
    00407     //  fAposRef
    00408     //  fAmpRef
    00409     //  fGTRef
    00410     //  fLTRef
    00411     //  fQuoteRef
    00412     //      These are character refs for the standard char refs, in the
    00413     //      output encoding. They are faulted in as required, by transcoding
    00414     //      them from fixed Unicode versions.
    00415     //
    00416     //  fIsXML11
    00417     //      for performance reason, we do not store the actual version string
    00418     //      and do the string comparison again and again.
    00419     //
    00420     // -----------------------------------------------------------------------
    00421     EscapeFlags                 fEscapeFlags;
    00422     XMLCh*                      fOutEncoding;
    00423     XMLFormatTarget*            fTarget;
    00424     UnRepFlags                  fUnRepFlags;
    00425     XMLTranscoder*              fXCoder;
    00426     XMLByte                     fTmpBuf[kTmpBufSize + 4];
    00427     XMLByte*                    fAposRef;
    00428     XMLSize_t                   fAposLen;
    00429     XMLByte*                    fAmpRef;
    00430     XMLSize_t                   fAmpLen;
    00431     XMLByte*                    fGTRef;
    00432     XMLSize_t                   fGTLen;
    00433     XMLByte*                    fLTRef;
    00434     XMLSize_t                   fLTLen;
    00435     XMLByte*                    fQuoteRef;
    00436     XMLSize_t                   fQuoteLen;
    00437     bool                        fIsXML11;
    00438     MemoryManager*              fMemoryManager;
    00439 };
    00440
    00441
    00442 class XMLPARSER_EXPORT XMLFormatTarget : public XMemory
    00443 {
    00444 public:
    00445     // -----------------------------------------------------------------------
    00446     //  Constructors and Destructor
    00447     // -----------------------------------------------------------------------
    00448     virtual ~XMLFormatTarget() {}
    00449
    00450
    00451     // -----------------------------------------------------------------------
    00452     //  Virtual interface
    00453     // -----------------------------------------------------------------------
    00454     virtual void writeChars
    00455     (
    00456           const XMLByte* const      toWrite
    00457         , const XMLSize_t           count
    00458         ,       XMLFormatter* const formatter
    00459     ) = 0;
    00460
    00461     virtual void flush() {};
    00462
    00463
    00464 protected :
    00465     // -----------------------------------------------------------------------
    00466     //  Hidden constructors and operators
    00467     // -----------------------------------------------------------------------
    00468     XMLFormatTarget() {};
    00469
    00470 private:
    00471     // -----------------------------------------------------------------------
    00472     //  Unimplemented constructors and operators
    00473     // -----------------------------------------------------------------------
    00474     XMLFormatTarget(const XMLFormatTarget&);
    00475     XMLFormatTarget& operator=(const XMLFormatTarget&);
    00476 };
    00477
    00478
    00479 // ---------------------------------------------------------------------------
    00480 //  XMLFormatter: Getter methods
    00481 // ---------------------------------------------------------------------------
    00482 inline const XMLCh* XMLFormatter::getEncodingName() const
    00483 {
    00484     return fOutEncoding;
    00485 }
    00486
    00487 inline const XMLTranscoder* XMLFormatter::getTranscoder() const
    00488 {
    00489     return fXCoder;
    00490 }
    00491
    00492 inline XMLTranscoder* XMLFormatter::getTranscoder()
    00493 {
    00494     return fXCoder;
    00495 }
    00496
    00497 // ---------------------------------------------------------------------------
    00498 //  XMLFormatter: Setter methods
    00499 // ---------------------------------------------------------------------------
    00500 inline void XMLFormatter::setEscapeFlags(const EscapeFlags newFlags)
    00501 {
    00502     fEscapeFlags = newFlags;
    00503 }
    00504
    00505 inline void XMLFormatter::setUnRepFlags(const UnRepFlags newFlags)
    00506 {
    00507     fUnRepFlags = newFlags;
    00508 }
    00509
    00510
    00511 inline XMLFormatter& XMLFormatter::operator<<(const EscapeFlags newFlags)
    00512 {
    00513     fEscapeFlags = newFlags;
    00514     return *this;
    00515 }
    00516
    00517 inline XMLFormatter& XMLFormatter::operator<<(const UnRepFlags newFlags)
    00518 {
    00519     fUnRepFlags = newFlags;
    00520     return *this;
    00521 }
    00522
    00523 // ---------------------------------------------------------------------------
    00524 //  XMLFormatter: Getter methods
    00525 // ---------------------------------------------------------------------------
    00526 inline XMLFormatter::EscapeFlags XMLFormatter::getEscapeFlags() const
    00527 {
    00528     return fEscapeFlags;
    00529 }
    00530
    00531 inline XMLFormatter::UnRepFlags XMLFormatter::getUnRepFlags() const
    00532 {
    00533     return fUnRepFlags;
    00534 }
    00535
    00536 XERCES_CPP_NAMESPACE_END
    00537
    00538 #endif