diff --git a/src/xercesc/util/TransService.cpp b/src/xercesc/util/TransService.cpp index b34e8a3ac79c79d0f3e886cd80811958b6a4655d..ff1e0048c376f55b8000ae2070b36e04357992f4 100644 --- a/src/xercesc/util/TransService.cpp +++ b/src/xercesc/util/TransService.cpp @@ -21,7 +21,6 @@ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- -#include <xercesc/util/Janitor.hpp> #include <xercesc/util/TransService.hpp> #include <xercesc/util/XML88591Transcoder.hpp> #include <xercesc/util/XMLASCIITranscoder.hpp> @@ -553,7 +552,7 @@ XMLLCPTranscoder::~XMLLCPTranscoder() TranscodeToStr::TranscodeToStr(const XMLCh *in, const char *encoding, MemoryManager *manager) : fString(0), - fBytesWritten(0), + fBytesWritten(0), fMemoryManager(manager) { XMLTransService::Codes failReason; @@ -568,7 +567,7 @@ TranscodeToStr::TranscodeToStr(const XMLCh *in, const char *encoding, TranscodeToStr::TranscodeToStr(const XMLCh *in, XMLSize_t length, const char *encoding, MemoryManager *manager) : fString(0), - fBytesWritten(0), + fBytesWritten(0), fMemoryManager(manager) { XMLTransService::Codes failReason; @@ -583,7 +582,7 @@ TranscodeToStr::TranscodeToStr(const XMLCh *in, XMLSize_t length, const char *en TranscodeToStr::TranscodeToStr(const XMLCh *in, XMLTranscoder* trans, MemoryManager *manager) : fString(0), - fBytesWritten(0), + fBytesWritten(0), fMemoryManager(manager) { transcode(in, XMLString::stringLen(in), trans); @@ -592,7 +591,7 @@ TranscodeToStr::TranscodeToStr(const XMLCh *in, XMLTranscoder* trans, TranscodeToStr::TranscodeToStr(const XMLCh *in, XMLSize_t length, XMLTranscoder* trans, MemoryManager *manager) : fString(0), - fBytesWritten(0), + fBytesWritten(0), fMemoryManager(manager) { transcode(in, length, trans); @@ -600,8 +599,6 @@ TranscodeToStr::TranscodeToStr(const XMLCh *in, XMLSize_t length, XMLTranscoder* TranscodeToStr::~TranscodeToStr() { - if(fString) - fMemoryManager->deallocate(fString); } // --------------------------------------------------------------------------- @@ -612,37 +609,35 @@ void TranscodeToStr::transcode(const XMLCh *in, XMLSize_t len, XMLTranscoder* tr if(!in) return; XMLSize_t allocSize = (len * sizeof(XMLCh)) + 4; - fString = (XMLByte*)fMemoryManager->allocate(allocSize); + fString.reset((XMLByte*)fMemoryManager->allocate(allocSize), fMemoryManager); XMLSize_t charsDone = 0; while(charsDone < len) { - XMLSize_t charsRead = 0; + XMLSize_t charsRead = 0; fBytesWritten += trans->transcodeTo(in + charsDone, len - charsDone, - fString + fBytesWritten, allocSize - fBytesWritten, + fString.get() + fBytesWritten, allocSize - fBytesWritten, charsRead, XMLTranscoder::UnRep_Throw); if(charsRead == 0) ThrowXMLwithMemMgr(TranscodingException, XMLExcepts::Trans_BadSrcSeq, fMemoryManager); charsDone += charsRead; - if((allocSize - fBytesWritten) < (len - charsDone)) - { - allocSize *= 2; - XMLByte *newBuf = (XMLByte*)fMemoryManager->allocate(allocSize); - memcpy(newBuf, fString, fBytesWritten); - fMemoryManager->deallocate(fString); - fString = newBuf; - } + if((allocSize - fBytesWritten) < (len - charsDone)) + { + allocSize *= 2; + XMLByte *newBuf = (XMLByte*)fMemoryManager->allocate(allocSize); + memcpy(newBuf, fString.get(), fBytesWritten); + fString.reset(newBuf, fMemoryManager); + } } // null terminate if((fBytesWritten + 4) > allocSize) { allocSize = fBytesWritten + 4; XMLByte *newBuf = (XMLByte*)fMemoryManager->allocate(allocSize); - memcpy(newBuf, fString, fBytesWritten); - fMemoryManager->deallocate(fString); - fString = newBuf; + memcpy(newBuf, fString.get(), fBytesWritten); + fString.reset(newBuf, fMemoryManager); } fString[fBytesWritten + 0] = 0; fString[fBytesWritten + 1] = 0; @@ -656,7 +651,7 @@ void TranscodeToStr::transcode(const XMLCh *in, XMLSize_t len, XMLTranscoder* tr TranscodeFromStr::TranscodeFromStr(const XMLByte *data, XMLSize_t length, const char *encoding, MemoryManager *manager) : fString(0), - fCharsWritten(0), + fCharsWritten(0), fMemoryManager(manager) { XMLTransService::Codes failReason; @@ -671,7 +666,7 @@ TranscodeFromStr::TranscodeFromStr(const XMLByte *data, XMLSize_t length, const TranscodeFromStr::TranscodeFromStr(const XMLByte *data, XMLSize_t length, XMLTranscoder *trans, MemoryManager *manager) : fString(0), - fCharsWritten(0), + fCharsWritten(0), fMemoryManager(manager) { transcode(data, length, trans); @@ -679,8 +674,6 @@ TranscodeFromStr::TranscodeFromStr(const XMLByte *data, XMLSize_t length, XMLTra TranscodeFromStr::~TranscodeFromStr() { - if(fString) - fMemoryManager->deallocate(fString); } // --------------------------------------------------------------------------- @@ -691,7 +684,7 @@ void TranscodeFromStr::transcode(const XMLByte *in, XMLSize_t length, XMLTransco if(!in) return; XMLSize_t allocSize = length + 1; - fString = (XMLCh*)fMemoryManager->allocate(allocSize * sizeof(XMLCh)); + fString.reset((XMLCh*)fMemoryManager->allocate(allocSize * sizeof(XMLCh)), fMemoryManager); XMLSize_t csSize = allocSize; ArrayJanitor<unsigned char> charSizes((unsigned char*)fMemoryManager->allocate(csSize * sizeof(unsigned char)), @@ -704,32 +697,30 @@ void TranscodeFromStr::transcode(const XMLByte *in, XMLSize_t length, XMLTransco csSize = allocSize - fCharsWritten; charSizes.reset((unsigned char*)fMemoryManager->allocate(csSize * sizeof(unsigned char)), fMemoryManager); } - XMLSize_t bytesRead = 0; + XMLSize_t bytesRead = 0; fCharsWritten += trans->transcodeFrom(in + bytesDone, length - bytesDone, - fString + fCharsWritten, allocSize - fCharsWritten, + fString.get() + fCharsWritten, allocSize - fCharsWritten, bytesRead, charSizes.get()); if(bytesRead == 0) ThrowXMLwithMemMgr(TranscodingException, XMLExcepts::Trans_BadSrcSeq, fMemoryManager); bytesDone += bytesRead; - if(((allocSize - fCharsWritten)*sizeof(XMLCh)) < (length - bytesDone)) - { - allocSize *= 2; - XMLCh *newBuf = (XMLCh*)fMemoryManager->allocate(allocSize * sizeof(XMLCh)); - memcpy(newBuf, fString, fCharsWritten*sizeof(XMLCh)); - fMemoryManager->deallocate(fString); - fString = newBuf; - } + if(((allocSize - fCharsWritten)*sizeof(XMLCh)) < (length - bytesDone)) + { + allocSize *= 2; + XMLCh *newBuf = (XMLCh*)fMemoryManager->allocate(allocSize * sizeof(XMLCh)); + memcpy(newBuf, fString.get(), fCharsWritten*sizeof(XMLCh)); + fString.reset(newBuf, fMemoryManager); + } } // null terminate if((fCharsWritten + 1) > allocSize) { allocSize = fCharsWritten + 1; XMLCh *newBuf = (XMLCh*)fMemoryManager->allocate(allocSize * sizeof(XMLCh)); - memcpy(newBuf, fString, fCharsWritten*sizeof(XMLCh)); - fMemoryManager->deallocate(fString); - fString = newBuf; + memcpy(newBuf, fString.get(), fCharsWritten*sizeof(XMLCh)); + fString.reset(newBuf, fMemoryManager); } fString[fCharsWritten] = 0; } diff --git a/src/xercesc/util/TransService.hpp b/src/xercesc/util/TransService.hpp index a07c3fdf9ad68e4d59c8e0cfe4376fdf52b403ab..337a89a186a66ee6b52bbf159e46d6f5ac7c7cbb 100644 --- a/src/xercesc/util/TransService.hpp +++ b/src/xercesc/util/TransService.hpp @@ -27,6 +27,7 @@ #include <xercesc/framework/XMLRecognizer.hpp> #include <xercesc/util/RefHashTableOf.hpp> #include <xercesc/util/RefVectorOf.hpp> +#include <xercesc/util/Janitor.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -122,7 +123,7 @@ public : virtual const XMLCh* getId() const = 0; // ----------------------------------------------------------------------- - // Create a new transcoder for the local code page. + // Create a new transcoder for the local code page. // // @param manager The memory manager to use. // ----------------------------------------------------------------------- @@ -134,13 +135,13 @@ public : virtual void lowerCase(XMLCh* const toLowerCase) = 0; // ----------------------------------------------------------------------- - // Allow users to add their own encodings to the intrinsic mapping - // table - // Usage: - // XMLTransService::addEncoding ( - // gMyEncodingNameString - // , new ENameMapFor<MyTransClassType>(gMyEncodingNameString) - // ); + // Allow users to add their own encodings to the intrinsic mapping + // table + // Usage: + // XMLTransService::addEncoding ( + // gMyEncodingNameString + // , new ENameMapFor<MyTransClassType>(gMyEncodingNameString) + // ); // ----------------------------------------------------------------------- static void addEncoding(const XMLCh* const encoding, ENameMap* const ownMapping); @@ -215,29 +216,29 @@ class XMLUTIL_EXPORT XMLTranscoder : public XMemory { public : - /** - * This enum is used by the <code>transcodeTo()</code> method - * to indicate how to react to unrepresentable characters. The - * <code>transcodeFrom()</code> method always works the - * same. It will consider any invalid data to be an error and - * throw. - */ + /** + * This enum is used by the <code>transcodeTo()</code> method + * to indicate how to react to unrepresentable characters. The + * <code>transcodeFrom()</code> method always works the + * same. It will consider any invalid data to be an error and + * throw. + */ enum UnRepOpts { - UnRep_Throw /**< Throw an exception */ - , UnRep_RepChar /**< Use the replacement char */ + UnRep_Throw /**< Throw an exception */ + , UnRep_RepChar /**< Use the replacement char */ }; - /** @name Destructor. */ - //@{ + /** @name Destructor. */ + //@{ - /** - * Destructor for XMLTranscoder - * - */ + /** + * Destructor for XMLTranscoder + * + */ virtual ~XMLTranscoder(); - //@} + //@} @@ -323,7 +324,7 @@ public : * <code>XMLTranscoder</code> object is for */ const XMLCh* getEncodingName() const; - //@} + //@} /** @name Getter methods*/ //@{ @@ -337,7 +338,7 @@ public : */ MemoryManager* getMemoryManager() const; - //@} + //@} protected : // ----------------------------------------------------------------------- @@ -532,7 +533,7 @@ public: */ XMLSize_t length () const; - //@} + //@} private: // ----------------------------------------------------------------------- @@ -555,7 +556,7 @@ private: // fBytesWritten // The length of the transcoded string in bytes // ----------------------------------------------------------------------- - XMLByte *fString; + ArrayJanitor<XMLByte> fString; XMLSize_t fBytesWritten; MemoryManager *fMemoryManager; }; @@ -614,7 +615,7 @@ public: */ XMLSize_t length() const; - //@} + //@} private: // ----------------------------------------------------------------------- @@ -637,7 +638,7 @@ private: // fCharsWritten // The length of the transcoded string in characters // ----------------------------------------------------------------------- - XMLCh *fString; + ArrayJanitor<XMLCh> fString; XMLSize_t fCharsWritten; MemoryManager *fMemoryManager; }; @@ -668,14 +669,13 @@ inline const XMLCh* XMLTranscoder::getEncodingName() const // --------------------------------------------------------------------------- inline const XMLByte *TranscodeToStr::str() const { - return fString; + return fString.get(); } inline XMLByte *TranscodeToStr::adopt() { - XMLByte *tmp = fString; - fString = 0; - return tmp; + fBytesWritten = 0; + return fString.release(); } inline XMLSize_t TranscodeToStr::length () const @@ -688,14 +688,13 @@ inline XMLSize_t TranscodeToStr::length () const // --------------------------------------------------------------------------- inline const XMLCh *TranscodeFromStr::str() const { - return fString; + return fString.get(); } inline XMLCh *TranscodeFromStr::adopt() { - XMLCh *tmp = fString; - fString = 0; - return tmp; + fCharsWritten = 0; + return fString.release(); } inline XMLSize_t TranscodeFromStr::length() const diff --git a/src/xercesc/util/Xerces_autoconf_config.msvc.hpp b/src/xercesc/util/Xerces_autoconf_config.msvc.hpp index 28f350e67cb3c0dcc76d9b425a131d1046fdae62..c20a849c4455bc35a527cbd8f8766b9e4970de11 100644 --- a/src/xercesc/util/Xerces_autoconf_config.msvc.hpp +++ b/src/xercesc/util/Xerces_autoconf_config.msvc.hpp @@ -46,6 +46,8 @@ // silence the warning "while compiling class-template member function xxxx : identifier was truncated to '255' // characters in the browser information" #pragma warning( disable: 4786 ) +// silence the warning "class 'XXXX' needs to have dll-interface to be used by clients of class 'YYYY'" +#pragma warning( disable: 4251) // --------------------------------------------------------------------------- // These defines have been hardcoded for the Microsoft Visual C++ compilers