00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 #if !defined(XMLFORMATTER_HPP)
00092 #define XMLFORMATTER_HPP
00093 
00094 #include <util/XercesDefs.hpp>
00095 
00096 class XMLFormatTarget;
00097 class XMLTranscoder;
00098 
00108 class  XMLFormatter
00109 {
00110 public:
00111     
00112     
00113     
00114     enum EscapeFlags
00115     {
00116         NoEscapes
00117         , StdEscapes
00118         , AttrEscapes
00119         , CharEscapes
00120 
00121         
00122         , EscapeFlags_Count
00123         , DefaultEscape     = 999
00124     };
00125 
00126     enum UnRepFlags
00127     {
00128         UnRep_Fail
00129         , UnRep_CharRef
00130         , UnRep_Replace
00131 
00132         , DefaultUnRep      = 999
00133     };
00134 
00135 
00136     
00137     
00138     
00139     XMLFormatter
00140     (
00141         const   XMLCh* const            outEncoding
00142         ,       XMLFormatTarget* const  target
00143         , const EscapeFlags             escapeFlags = NoEscapes
00144         , const UnRepFlags              unrepFlags = UnRep_Fail
00145     );
00146 
00147     XMLFormatter
00148     (
00149         const   char* const             outEncoding
00150         ,       XMLFormatTarget* const  target
00151         , const EscapeFlags             escapeFlags = NoEscapes
00152         , const UnRepFlags              unrepFlags = UnRep_Fail
00153     );
00154 
00155     ~XMLFormatter();
00156 
00157 
00158     
00159     
00160     
00161     void formatBuf
00162     (
00163         const   XMLCh* const    toFormat
00164         , const unsigned int    count
00165         , const EscapeFlags     escapeFlags = DefaultEscape
00166         , const UnRepFlags      unrepFlags = DefaultUnRep
00167     );
00168 
00169     XMLFormatter& operator<<
00170     (
00171         const   XMLCh* const    toFormat
00172     );
00173 
00174     XMLFormatter& operator<<
00175     (
00176         const   XMLCh           toFormat
00177     );
00178 
00179 
00180     
00181     
00182     
00183     const XMLCh* getEncodingName() const;
00184 
00185 
00186     
00187     
00188     
00189     void setEscapeFlags
00190     (
00191         const   EscapeFlags     newFlags
00192     );
00193 
00194     void setUnRepFlags
00195     (
00196         const   UnRepFlags      newFlags
00197     );
00198 
00199     XMLFormatter& operator<<
00200     (
00201         const   EscapeFlags     newFlags
00202     );
00203 
00204     XMLFormatter& operator<<
00205     (
00206         const   UnRepFlags      newFlags
00207     );
00208 
00209 
00210 private :
00211     
00212     
00213     
00214     XMLFormatter();
00215     XMLFormatter(const XMLFormatter&);
00216     void operator=(const XMLFormatter&);
00217 
00218 
00219     
00220     
00221     
00222     enum Constants
00223     {
00224         kTmpBufSize     = 16 * 1024
00225     };
00226 
00227 
00228     
00229     
00230     
00231     const XMLByte* getAposRef(unsigned int & count);
00232     const XMLByte* getAmpRef(unsigned int & count);
00233     const XMLByte* getGTRef(unsigned int & count);
00234     const XMLByte* getLTRef(unsigned int & count);
00235     const XMLByte* getQuoteRef(unsigned int & count);
00236 
00237     void specialFormat
00238     (
00239         const   XMLCh* const    toFormat
00240         , const unsigned int    count
00241         , const EscapeFlags     escapeFlags
00242     );
00243 
00244 
00245     
00246     
00247     
00248     
00249     
00250     
00251     
00252     
00253     
00254     
00255     
00256     
00257     
00258     
00259     
00260     
00261     
00262     
00263     
00264     
00265     
00266     
00267     
00268     
00269     
00270     
00271     
00272     
00273     
00274     
00275     
00276     
00277     
00278     
00279     
00280     
00281     EscapeFlags                 fEscapeFlags;
00282     XMLCh*                      fOutEncoding;
00283     XMLFormatTarget*            fTarget;
00284     UnRepFlags                  fUnRepFlags;
00285     XMLTranscoder*              fXCoder;
00286     XMLByte                     fTmpBuf[kTmpBufSize + 4];
00287 
00288     XMLByte*                    fAposRef;
00289     unsigned int                fAposLen;
00290     XMLByte*                    fAmpRef;
00291     unsigned int                fAmpLen;
00292     XMLByte*                    fGTRef;
00293     unsigned int                fGTLen;
00294     XMLByte*                    fLTRef;
00295     unsigned int                fLTLen;
00296     XMLByte*                    fQuoteRef;
00297     unsigned int                fQuoteLen;
00298 };
00299 
00300 
00301 class  XMLFormatTarget
00302 {
00303 public:
00304     
00305     
00306     
00307     virtual ~XMLFormatTarget() {}
00308 
00309 
00310     
00311     
00312     
00313     virtual void writeChars
00314     (
00315         const   XMLByte* const      toWrite
00316         , const unsigned int        count
00317         ,       XMLFormatter* const formatter
00318     ) = 0;
00319 
00320 
00321 protected :
00322     
00323     
00324     
00325     XMLFormatTarget() {}
00326     XMLFormatTarget(const XMLFormatTarget&) {}
00327     void operator=(const XMLFormatTarget&) {}
00328 };
00329 
00330 
00331 
00332 
00333 
00334 inline const XMLCh* XMLFormatter::getEncodingName() const
00335 {
00336     return fOutEncoding;
00337 }
00338 
00339 
00340 
00341 
00342 
00343 inline void XMLFormatter::setEscapeFlags(const EscapeFlags newFlags)
00344 {
00345     fEscapeFlags = newFlags;
00346 }
00347 
00348 inline void XMLFormatter::setUnRepFlags(const UnRepFlags newFlags)
00349 {
00350     fUnRepFlags = newFlags;
00351 }
00352 
00353 
00354 inline XMLFormatter& XMLFormatter::operator<<(const EscapeFlags newFlags)
00355 {
00356     fEscapeFlags = newFlags;
00357     return *this;
00358 }
00359 
00360 inline XMLFormatter& XMLFormatter::operator<<(const UnRepFlags newFlags)
00361 {
00362     fUnRepFlags = newFlags;
00363     return *this;
00364 }
00365 
00366 
00367 #endif