|
||||
File indexing completed on 2025-01-18 10:15:13
0001 /* 0002 * Licensed to the Apache Software Foundation (ASF) under one or more 0003 * contributor license agreements. See the NOTICE file distributed with 0004 * this work for additional information regarding copyright ownership. 0005 * The ASF licenses this file to You under the Apache License, Version 2.0 0006 * (the "License"); you may not use this file except in compliance with 0007 * the License. You may obtain a copy of the License at 0008 * 0009 * http://www.apache.org/licenses/LICENSE-2.0 0010 * 0011 * Unless required by applicable law or agreed to in writing, software 0012 * distributed under the License is distributed on an "AS IS" BASIS, 0013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 0014 * See the License for the specific language governing permissions and 0015 * limitations under the License. 0016 */ 0017 0018 /* 0019 * $Id$ 0020 */ 0021 0022 #if !defined(XERCESC_INCLUDE_GUARD_TRANSSERVICE_HPP) 0023 #define XERCESC_INCLUDE_GUARD_TRANSSERVICE_HPP 0024 0025 #include <xercesc/util/XMemory.hpp> 0026 #include <xercesc/util/PlatformUtils.hpp> 0027 #include <xercesc/framework/XMLRecognizer.hpp> 0028 #include <xercesc/util/RefHashTableOf.hpp> 0029 #include <xercesc/util/RefVectorOf.hpp> 0030 #include <xercesc/util/Janitor.hpp> 0031 0032 XERCES_CPP_NAMESPACE_BEGIN 0033 0034 // Forward references 0035 //class XMLPlatformUtils; 0036 class XMLLCPTranscoder; 0037 class XMLTranscoder; 0038 class ENameMap; 0039 0040 0041 // 0042 // This class is an abstract base class which are used to abstract the 0043 // transcoding services that Xerces uses. The parser's actual transcoding 0044 // needs are small so it is desirable to allow different implementations 0045 // to be provided. 0046 // 0047 // The transcoding service has to provide a couple of required string 0048 // and character operations, but its most important service is the creation 0049 // of transcoder objects. There are two types of transcoders, which are 0050 // discussed below in the XMLTranscoder class' description. 0051 // 0052 class XMLUTIL_EXPORT XMLTransService : public XMemory 0053 { 0054 public : 0055 // ----------------------------------------------------------------------- 0056 // Class specific types 0057 // ----------------------------------------------------------------------- 0058 enum Codes 0059 { 0060 Ok 0061 , UnsupportedEncoding 0062 , InternalFailure 0063 , SupportFilesNotFound 0064 }; 0065 0066 struct TransRec 0067 { 0068 XMLCh intCh; 0069 XMLByte extCh; 0070 }; 0071 0072 0073 // ----------------------------------------------------------------------- 0074 // Public constructors and destructor 0075 // ----------------------------------------------------------------------- 0076 virtual ~XMLTransService(); 0077 0078 0079 // ----------------------------------------------------------------------- 0080 // Non-virtual API 0081 // ----------------------------------------------------------------------- 0082 XMLTranscoder* makeNewTranscoderFor 0083 ( 0084 const XMLCh* const encodingName 0085 , XMLTransService::Codes& resValue 0086 , const XMLSize_t blockSize 0087 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager 0088 ); 0089 0090 XMLTranscoder* makeNewTranscoderFor 0091 ( 0092 const char* const encodingName 0093 , XMLTransService::Codes& resValue 0094 , const XMLSize_t blockSize 0095 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager 0096 ); 0097 0098 XMLTranscoder* makeNewTranscoderFor 0099 ( 0100 XMLRecognizer::Encodings encodingEnum 0101 , XMLTransService::Codes& resValue 0102 , const XMLSize_t blockSize 0103 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager 0104 ); 0105 0106 0107 // ----------------------------------------------------------------------- 0108 // The virtual transcoding service API 0109 // ----------------------------------------------------------------------- 0110 virtual int compareIString 0111 ( 0112 const XMLCh* const comp1 0113 , const XMLCh* const comp2 0114 ) = 0; 0115 0116 virtual int compareNIString 0117 ( 0118 const XMLCh* const comp1 0119 , const XMLCh* const comp2 0120 , const XMLSize_t maxChars 0121 ) = 0; 0122 0123 virtual const XMLCh* getId() const = 0; 0124 0125 // ----------------------------------------------------------------------- 0126 // Create a new transcoder for the local code page. 0127 // 0128 // @param manager The memory manager to use. 0129 // ----------------------------------------------------------------------- 0130 virtual XMLLCPTranscoder* makeNewLCPTranscoder(MemoryManager* manager) = 0; 0131 0132 virtual bool supportsSrcOfs() const = 0; 0133 0134 virtual void upperCase(XMLCh* const toUpperCase) = 0; 0135 virtual void lowerCase(XMLCh* const toLowerCase) = 0; 0136 0137 // ----------------------------------------------------------------------- 0138 // Allow users to add their own encodings to the intrinsic mapping 0139 // table 0140 // Usage: 0141 // XMLTransService::addEncoding ( 0142 // gMyEncodingNameString 0143 // , new ENameMapFor<MyTransClassType>(gMyEncodingNameString) 0144 // ); 0145 // ----------------------------------------------------------------------- 0146 static void addEncoding(const XMLCh* const encoding, ENameMap* const ownMapping); 0147 0148 0149 protected : 0150 // ----------------------------------------------------------------------- 0151 // Hidden constructors 0152 // ----------------------------------------------------------------------- 0153 XMLTransService(); 0154 0155 0156 // ----------------------------------------------------------------------- 0157 // Protected virtual methods. 0158 // ----------------------------------------------------------------------- 0159 #ifdef OS390 0160 friend class Uniconv390TransService; 0161 #endif 0162 virtual XMLTranscoder* makeNewXMLTranscoder 0163 ( 0164 const XMLCh* const encodingName 0165 , XMLTransService::Codes& resValue 0166 , const XMLSize_t blockSize 0167 , MemoryManager* const manager 0168 ) = 0; 0169 0170 // ----------------------------------------------------------------------- 0171 // Protected init method for platform utils to call 0172 // ----------------------------------------------------------------------- 0173 friend class XMLPlatformUtils; 0174 virtual void initTransService(); 0175 0176 // ----------------------------------------------------------------------- 0177 // protected static members 0178 // gMappings 0179 // This is a hash table of ENameMap objects. It is created and filled 0180 // in when the platform init calls our initTransService() method. 0181 // 0182 // gMappingsRecognizer 0183 // This is an array of ENameMap objects, predefined for those 0184 // already recognized by XMLRecognizer::Encodings. 0185 // 0186 0187 static RefHashTableOf<ENameMap>* gMappings; 0188 static RefVectorOf<ENameMap>* gMappingsRecognizer; 0189 0190 private : 0191 // ----------------------------------------------------------------------- 0192 // Unimplemented constructors and operators 0193 // ----------------------------------------------------------------------- 0194 XMLTransService(const XMLTransService&); 0195 XMLTransService& operator=(const XMLTransService&); 0196 0197 // ----------------------------------------------------------------------- 0198 // Hidden method to enable/disable strict IANA encoding check 0199 // Caller: XMLPlatformUtils 0200 // ----------------------------------------------------------------------- 0201 void strictIANAEncoding(const bool newState); 0202 bool isStrictIANAEncoding(); 0203 0204 friend class XMLInitializer; 0205 }; 0206 0207 /** 0208 * <code>XMLTranscoder</code> is for transcoding non-local code 0209 * page encodings, i.e. named encodings. These are used internally 0210 * by the scanner to internalize raw XML into the internal Unicode 0211 * format, and by writer classes to convert that internal Unicode 0212 * format (which comes out of the parser) back out to a format that 0213 * the receiving client code wants to use. 0214 */ 0215 class XMLUTIL_EXPORT XMLTranscoder : public XMemory 0216 { 0217 public : 0218 0219 /** 0220 * This enum is used by the <code>transcodeTo()</code> method 0221 * to indicate how to react to unrepresentable characters. The 0222 * <code>transcodeFrom()</code> method always works the 0223 * same. It will consider any invalid data to be an error and 0224 * throw. 0225 */ 0226 enum UnRepOpts 0227 { 0228 UnRep_Throw /**< Throw an exception */ 0229 , UnRep_RepChar /**< Use the replacement char */ 0230 }; 0231 0232 0233 /** @name Destructor. */ 0234 //@{ 0235 0236 /** 0237 * Destructor for XMLTranscoder 0238 * 0239 */ 0240 virtual ~XMLTranscoder(); 0241 //@} 0242 0243 0244 0245 /** @name The virtual transcoding interface */ 0246 //@{ 0247 0248 /** Converts from the encoding of the service to the internal XMLCh* encoding 0249 * 0250 * @param srcData the source buffer to be transcoded 0251 * @param srcCount number of bytes in the source buffer 0252 * @param toFill the destination buffer 0253 * @param maxChars the max number of characters in the destination buffer 0254 * @param bytesEaten after transcoding, this will hold the number of bytes 0255 * that were processed from the source buffer 0256 * @param charSizes an array which must be at least as big as maxChars 0257 * into which will be inserted values that indicate how many 0258 * bytes from the input went into each XMLCh that was created 0259 * into toFill. Since many encodings use variable numbers of 0260 * byte per character, this provides a means to find out what 0261 * bytes in the input went into making a particular output 0262 * UTF-16 character. 0263 * @return Returns the number of chars put into the target buffer 0264 */ 0265 0266 0267 virtual XMLSize_t transcodeFrom 0268 ( 0269 const XMLByte* const srcData 0270 , const XMLSize_t srcCount 0271 , XMLCh* const toFill 0272 , const XMLSize_t maxChars 0273 , XMLSize_t& bytesEaten 0274 , unsigned char* const charSizes 0275 ) = 0; 0276 0277 /** Converts from the internal XMLCh* encoding to the encoding of the service 0278 * 0279 * @param srcData the source buffer to be transcoded 0280 * @param srcCount number of characters in the source buffer 0281 * @param toFill the destination buffer 0282 * @param maxBytes the max number of bytes in the destination buffer 0283 * @param charsEaten after transcoding, this will hold the number of chars 0284 * that were processed from the source buffer 0285 * @param options options to pass to the transcoder that explain how to 0286 * respond to an unrepresentable character 0287 * @return Returns the number of chars put into the target buffer 0288 */ 0289 0290 virtual XMLSize_t transcodeTo 0291 ( 0292 const XMLCh* const srcData 0293 , const XMLSize_t srcCount 0294 , XMLByte* const toFill 0295 , const XMLSize_t maxBytes 0296 , XMLSize_t& charsEaten 0297 , const UnRepOpts options 0298 ) = 0; 0299 0300 /** Query whether the transcoder can handle a given character 0301 * 0302 * @param toCheck the character code point to check 0303 */ 0304 0305 virtual bool canTranscodeTo 0306 ( 0307 const unsigned int toCheck 0308 ) = 0; 0309 0310 //@} 0311 0312 /** @name Getter methods */ 0313 //@{ 0314 0315 /** Get the internal block size 0316 * 0317 * @return The block size indicated in the constructor. 0318 */ 0319 XMLSize_t getBlockSize() const; 0320 0321 /** Get the encoding name 0322 * 0323 * @return the name of the encoding that this 0324 * <code>XMLTranscoder</code> object is for 0325 */ 0326 const XMLCh* getEncodingName() const; 0327 //@} 0328 0329 /** @name Getter methods*/ 0330 //@{ 0331 0332 /** Get the plugged-in memory manager 0333 * 0334 * This method returns the plugged-in memory manager user for dynamic 0335 * memory allocation/deallocation. 0336 * 0337 * @return the plugged-in memory manager 0338 */ 0339 MemoryManager* getMemoryManager() const; 0340 0341 //@} 0342 0343 protected : 0344 // ----------------------------------------------------------------------- 0345 // Hidden constructors 0346 // ----------------------------------------------------------------------- 0347 XMLTranscoder 0348 ( 0349 const XMLCh* const encodingName 0350 , const XMLSize_t blockSize 0351 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager 0352 ); 0353 0354 0355 // ----------------------------------------------------------------------- 0356 // Protected helper methods 0357 // ----------------------------------------------------------------------- 0358 0359 private : 0360 // ----------------------------------------------------------------------- 0361 // Unimplemented constructors and operators 0362 // ----------------------------------------------------------------------- 0363 XMLTranscoder(const XMLTranscoder&); 0364 XMLTranscoder& operator=(const XMLTranscoder&); 0365 0366 // ----------------------------------------------------------------------- 0367 // Private data members 0368 // 0369 // fBlockSize 0370 // This is the block size indicated in the constructor. 0371 // 0372 // fEncodingName 0373 // This is the name of the encoding this encoder is for. All basic 0374 // XML transcoder's are for named encodings. 0375 // ----------------------------------------------------------------------- 0376 XMLSize_t fBlockSize; 0377 XMLCh* fEncodingName; 0378 MemoryManager* fMemoryManager; 0379 }; 0380 0381 0382 // 0383 // This class is a specialized transcoder that only transcodes between 0384 // the internal XMLCh format and the local code page. It is specialized 0385 // for the very common job of translating data from the client app's 0386 // native code page to the internal format and vice versa. 0387 // 0388 class XMLUTIL_EXPORT XMLLCPTranscoder : public XMemory 0389 { 0390 public : 0391 // ----------------------------------------------------------------------- 0392 // Public constructors and destructor 0393 // ----------------------------------------------------------------------- 0394 virtual ~XMLLCPTranscoder(); 0395 0396 0397 // ----------------------------------------------------------------------- 0398 // The virtual transcoder API 0399 // 0400 // NOTE: All these APIs don't include null terminator characters in 0401 // their parameters. So calcRequiredSize() returns the number 0402 // of actual chars, not including the null. maxBytes and maxChars 0403 // parameters refer to actual chars, not including the null so 0404 // its assumed that the buffer is physically one char or byte 0405 // larger. 0406 // ----------------------------------------------------------------------- 0407 0408 // ----------------------------------------------------------------------- 0409 // The 'normal' way to transcode a XMLCh-string from/to local string 0410 // representation 0411 // 0412 // NOTE: Both methods return a string allocated via the MemoryManager. 0413 // It is the responsibility of the calling environment to 0414 // release this string after use. 0415 // ----------------------------------------------------------------------- 0416 virtual char* transcode(const XMLCh* const toTranscode, 0417 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager) = 0; 0418 0419 virtual XMLCh* transcode(const char* const toTranscode, 0420 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager) = 0; 0421 0422 0423 // ----------------------------------------------------------------------- 0424 // DEPRECATED old transcode interface 0425 // ----------------------------------------------------------------------- 0426 virtual XMLSize_t calcRequiredSize(const char* const srcText 0427 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager) = 0; 0428 0429 virtual XMLSize_t calcRequiredSize(const XMLCh* const srcText 0430 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager) = 0; 0431 0432 virtual bool transcode 0433 ( 0434 const char* const toTranscode 0435 , XMLCh* const toFill 0436 , const XMLSize_t maxChars 0437 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager 0438 ) = 0; 0439 0440 virtual bool transcode 0441 ( 0442 const XMLCh* const toTranscode 0443 , char* const toFill 0444 , const XMLSize_t maxBytes 0445 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager 0446 ) = 0; 0447 0448 0449 protected : 0450 // ----------------------------------------------------------------------- 0451 // Hidden constructors 0452 // ----------------------------------------------------------------------- 0453 XMLLCPTranscoder(); 0454 0455 0456 private : 0457 // ----------------------------------------------------------------------- 0458 // Unimplemented constructors and operators 0459 // ----------------------------------------------------------------------- 0460 XMLLCPTranscoder(const XMLLCPTranscoder&); 0461 XMLLCPTranscoder& operator=(const XMLLCPTranscoder&); 0462 }; 0463 0464 // 0465 // This class can be used to transcode to a target encoding. It manages the 0466 // memory allocated for the transcode in an exception safe manner, automatically 0467 // deleting it when the class goes out of scope. 0468 // 0469 class XMLUTIL_EXPORT TranscodeToStr 0470 { 0471 public: 0472 // ----------------------------------------------------------------------- 0473 // Public constructors and destructor 0474 // ----------------------------------------------------------------------- 0475 0476 /** Converts from the internal XMLCh* encoding to the specified encoding 0477 * 0478 * @param in the null terminated source buffer to be transcoded 0479 * @param encoding the name of the encoding to transcode to 0480 * @param manager the memory manager to use 0481 */ 0482 TranscodeToStr(const XMLCh *in, const char *encoding, 0483 MemoryManager *manager = XMLPlatformUtils::fgMemoryManager); 0484 0485 /** Converts from the internal XMLCh* encoding to the specified encoding 0486 * 0487 * @param in the source buffer to be transcoded 0488 * @param length the length of the source buffer 0489 * @param encoding the name of the encoding to transcode to 0490 * @param manager the memory manager to use 0491 */ 0492 TranscodeToStr(const XMLCh *in, XMLSize_t length, const char *encoding, 0493 MemoryManager *manager = XMLPlatformUtils::fgMemoryManager); 0494 0495 /** Converts from the internal XMLCh* encoding to the specified encoding 0496 * 0497 * @param in the null terminated source buffer to be transcoded 0498 * @param trans the transcoder to use 0499 * @param manager the memory manager to use 0500 */ 0501 TranscodeToStr(const XMLCh *in, XMLTranscoder* trans, 0502 MemoryManager *manager = XMLPlatformUtils::fgMemoryManager); 0503 0504 /** Converts from the internal XMLCh* encoding to the specified encoding 0505 * 0506 * @param in the source buffer to be transcoded 0507 * @param length the length of the source buffer 0508 * @param trans the transcoder to use 0509 * @param manager the memory manager to use 0510 */ 0511 TranscodeToStr(const XMLCh *in, XMLSize_t length, XMLTranscoder* trans, 0512 MemoryManager *manager = XMLPlatformUtils::fgMemoryManager); 0513 0514 ~TranscodeToStr(); 0515 0516 /** @name Getter methods */ 0517 //@{ 0518 0519 /** Returns the transcoded, null terminated string 0520 * @return the transcoded string 0521 */ 0522 const XMLByte *str() const; 0523 0524 /** Returns the transcoded, null terminated string - adopting 0525 * the memory allocated to it from the TranscodeToStr object 0526 * @return the transcoded string 0527 */ 0528 XMLByte *adopt(); 0529 0530 /** Returns the length of the transcoded string in bytes. The length 0531 * does not include the null terminator. 0532 * @return the length of the transcoded string in bytes 0533 */ 0534 XMLSize_t length () const; 0535 0536 //@} 0537 0538 private: 0539 // ----------------------------------------------------------------------- 0540 // Unimplemented constructors and operators 0541 // ----------------------------------------------------------------------- 0542 TranscodeToStr(const TranscodeToStr &); 0543 TranscodeToStr &operator=(const TranscodeToStr &); 0544 0545 // ----------------------------------------------------------------------- 0546 // Private helper methods 0547 // ----------------------------------------------------------------------- 0548 void transcode(const XMLCh *in, XMLSize_t len, XMLTranscoder* trans); 0549 0550 // ----------------------------------------------------------------------- 0551 // Private data members 0552 // 0553 // fString 0554 // The transcoded string 0555 // 0556 // fBytesWritten 0557 // The length of the transcoded string in bytes 0558 // ----------------------------------------------------------------------- 0559 ArrayJanitor<XMLByte> fString; 0560 XMLSize_t fBytesWritten; 0561 MemoryManager *fMemoryManager; 0562 }; 0563 0564 // 0565 // This class can be used to transcode from a source encoding. It manages the 0566 // memory allocated for the transcode in an exception safe manner, automatically 0567 // deleting it when the class goes out of scope. 0568 // 0569 class XMLUTIL_EXPORT TranscodeFromStr 0570 { 0571 public: 0572 // ----------------------------------------------------------------------- 0573 // Public constructors and destructor 0574 // ----------------------------------------------------------------------- 0575 0576 /** Converts from the specified encoding to the internal XMLCh* encoding 0577 * 0578 * @param data the source buffer to be transcoded 0579 * @param length the length of the source buffer 0580 * @param encoding the name of the encoding to transcode to 0581 * @param manager the memory manager to use 0582 */ 0583 TranscodeFromStr(const XMLByte *data, XMLSize_t length, const char *encoding, 0584 MemoryManager *manager = XMLPlatformUtils::fgMemoryManager); 0585 0586 /** Converts from the specified encoding to the internal XMLCh* encoding 0587 * 0588 * @param data the source buffer to be transcoded 0589 * @param length the length of the source buffer 0590 * @param trans the transcoder to use 0591 * @param manager the memory manager to use 0592 */ 0593 TranscodeFromStr(const XMLByte *data, XMLSize_t length, XMLTranscoder *trans, 0594 MemoryManager *manager = XMLPlatformUtils::fgMemoryManager); 0595 0596 ~TranscodeFromStr(); 0597 0598 /** @name Getter methods */ 0599 //@{ 0600 0601 /** Returns the transcoded, null terminated string 0602 * @return the transcoded string 0603 */ 0604 const XMLCh *str() const; 0605 0606 /** Returns the transcoded, null terminated string - adopting 0607 * the memory allocated to it from the TranscodeFromStr object 0608 * @return the transcoded string 0609 */ 0610 XMLCh *adopt(); 0611 0612 /** Returns the length of the transcoded string in characters. The length 0613 * does not include the null terminator. 0614 * @return the length of the transcoded string in characters 0615 */ 0616 XMLSize_t length() const; 0617 0618 //@} 0619 0620 private: 0621 // ----------------------------------------------------------------------- 0622 // Unimplemented constructors and operators 0623 // ----------------------------------------------------------------------- 0624 TranscodeFromStr(const TranscodeFromStr &); 0625 TranscodeFromStr &operator=(const TranscodeFromStr &); 0626 0627 // ----------------------------------------------------------------------- 0628 // Private helper methods 0629 // ----------------------------------------------------------------------- 0630 void transcode(const XMLByte *in, XMLSize_t length, XMLTranscoder *trans); 0631 0632 // ----------------------------------------------------------------------- 0633 // Private data members 0634 // 0635 // fString 0636 // The transcoded string 0637 // 0638 // fCharsWritten 0639 // The length of the transcoded string in characters 0640 // ----------------------------------------------------------------------- 0641 ArrayJanitor<XMLCh> fString; 0642 XMLSize_t fCharsWritten; 0643 MemoryManager *fMemoryManager; 0644 }; 0645 0646 // --------------------------------------------------------------------------- 0647 // XMLTranscoder: Getter methods 0648 // --------------------------------------------------------------------------- 0649 inline MemoryManager* XMLTranscoder::getMemoryManager() const 0650 { 0651 return fMemoryManager; 0652 } 0653 0654 // --------------------------------------------------------------------------- 0655 // XMLTranscoder: Protected helper methods 0656 // --------------------------------------------------------------------------- 0657 inline XMLSize_t XMLTranscoder::getBlockSize() const 0658 { 0659 return fBlockSize; 0660 } 0661 0662 inline const XMLCh* XMLTranscoder::getEncodingName() const 0663 { 0664 return fEncodingName; 0665 } 0666 0667 // --------------------------------------------------------------------------- 0668 // TranscodeToStr: Getter methods 0669 // --------------------------------------------------------------------------- 0670 inline const XMLByte *TranscodeToStr::str() const 0671 { 0672 return fString.get(); 0673 } 0674 0675 inline XMLByte *TranscodeToStr::adopt() 0676 { 0677 fBytesWritten = 0; 0678 return fString.release(); 0679 } 0680 0681 inline XMLSize_t TranscodeToStr::length () const 0682 { 0683 return fBytesWritten; 0684 } 0685 0686 // --------------------------------------------------------------------------- 0687 // TranscodeFromStr: Getter methods 0688 // --------------------------------------------------------------------------- 0689 inline const XMLCh *TranscodeFromStr::str() const 0690 { 0691 return fString.get(); 0692 } 0693 0694 inline XMLCh *TranscodeFromStr::adopt() 0695 { 0696 fCharsWritten = 0; 0697 return fString.release(); 0698 } 0699 0700 inline XMLSize_t TranscodeFromStr::length() const 0701 { 0702 return fCharsWritten; 0703 } 0704 0705 XERCES_CPP_NAMESPACE_END 0706 0707 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |