diff options
Diffstat (limited to 'intl/uconv/nsUCSupport.h')
-rw-r--r-- | intl/uconv/nsUCSupport.h | 425 |
1 files changed, 425 insertions, 0 deletions
diff --git a/intl/uconv/nsUCSupport.h b/intl/uconv/nsUCSupport.h new file mode 100644 index 000000000..1e8fb6d6f --- /dev/null +++ b/intl/uconv/nsUCSupport.h @@ -0,0 +1,425 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsUCvJaSupport_h___ +#define nsUCvJaSupport_h___ + +#include "nsCOMPtr.h" +#include "nsIUnicodeEncoder.h" +#include "nsIUnicodeDecoder.h" +#include "uconvutil.h" +#include "mozilla/Mutex.h" + +#define ONE_BYTE_TABLE_SIZE 256 + +inline bool WillOverrun(char16_t* aDest, char16_t* aDestEnd, uint32_t aLength) +{ + NS_ASSERTION(aDest <= aDestEnd, "Pointer overrun even before check"); + return (uint32_t(aDestEnd - aDest) < aLength); +} +#define CHECK_OVERRUN(dest, destEnd, length) (WillOverrun(dest, destEnd, length)) + +#ifdef DEBUG +// {7AFC9F0A-CFE1-44ea-A755-E3B86AB1226E} +#define NS_IBASICDECODER_IID \ +{ 0x7afc9f0a, 0xcfe1, 0x44ea, { 0xa7, 0x55, 0xe3, 0xb8, 0x6a, 0xb1, 0x22, 0x6e } } + +// {65968A7B-6467-4c4a-B50A-3E0C97A32F07} +#define NS_IBASICENCODER_IID \ +{ 0x65968a7b, 0x6467, 0x4c4a, { 0xb5, 0xa, 0x3e, 0xc, 0x97, 0xa3, 0x2f, 0x7 } } + +class nsIBasicDecoder : public nsISupports { +public: + NS_DECLARE_STATIC_IID_ACCESSOR(NS_IBASICDECODER_IID) +}; + +NS_DEFINE_STATIC_IID_ACCESSOR(nsIBasicDecoder, NS_IBASICDECODER_IID) + +class nsIBasicEncoder : public nsISupports { +public: + NS_DECLARE_STATIC_IID_ACCESSOR(NS_IBASICENCODER_IID) +}; + +NS_DEFINE_STATIC_IID_ACCESSOR(nsIBasicEncoder, NS_IBASICENCODER_IID) + +#endif + +//---------------------------------------------------------------------- +// Class nsBasicDecoderSupport [declaration] + +/** + * Support class for the Unicode decoders. + * + * The class source files for this class are in /ucvlatin/nsUCvJaSupport. + * However, because these objects requires non-xpcom subclassing, local copies + * will be made into the other directories using them. Just don't forget to + * keep in sync with the master copy! + * + * This class implements: + * - nsISupports + * - nsIUnicodeDecoder + * + * @created 19/Apr/1999 + * @author Catalin Rotaru [CATA] + */ +class nsBasicDecoderSupport : public nsIUnicodeDecoder +#ifdef DEBUG + ,public nsIBasicDecoder +#endif +{ + NS_DECL_THREADSAFE_ISUPPORTS + +public: + + /** + * Class constructor. + */ + nsBasicDecoderSupport(); + + //-------------------------------------------------------------------- + // Interface nsIUnicodeDecoder [declaration] + + virtual void SetInputErrorBehavior(int32_t aBehavior) override; + virtual char16_t GetCharacterForUnMapped() override; + +protected: + int32_t mErrBehavior; + + /** + * Class destructor. + */ + virtual ~nsBasicDecoderSupport(); +}; + +//---------------------------------------------------------------------- +// Class nsBufferDecoderSupport [declaration] + +/** + * Support class for the Unicode decoders. + * + * This class implements: + * - the buffer management + * + * @created 15/Mar/1999 + * @author Catalin Rotaru [CATA] + */ +class nsBufferDecoderSupport : public nsBasicDecoderSupport +{ +protected: + + /** + * Internal buffer for partial conversions. + */ + char * mBuffer; + int32_t mBufferCapacity; + int32_t mBufferLength; + + uint32_t mMaxLengthFactor; + + /** + * Convert method but *without* the buffer management stuff. + */ + NS_IMETHOD ConvertNoBuff(const char * aSrc, int32_t * aSrcLength, + char16_t * aDest, int32_t * aDestLength) = 0; + + void FillBuffer(const char ** aSrc, int32_t aSrcLength); + +public: + + /** + * Class constructor. + */ + explicit nsBufferDecoderSupport(uint32_t aMaxLengthFactor); + + /** + * Class destructor. + */ + virtual ~nsBufferDecoderSupport(); + + //-------------------------------------------------------------------- + // Interface nsIUnicodeDecoder [declaration] + + NS_IMETHOD Convert(const char * aSrc, int32_t * aSrcLength, + char16_t * aDest, int32_t * aDestLength); + NS_IMETHOD Reset(); + NS_IMETHOD GetMaxLength(const char *aSrc, + int32_t aSrcLength, + int32_t* aDestLength); +}; + +//---------------------------------------------------------------------- +// Class nsMultiTableDecoderSupport [declaration] + +/** + * Support class for a multi-table-driven Unicode decoder. + * + * @created 24/Mar/1999 + * @author Catalin Rotaru [CATA] + */ +class nsMultiTableDecoderSupport : public nsBufferDecoderSupport +{ +public: + + /** + * Class constructor. + */ + nsMultiTableDecoderSupport(int32_t aTableCount, const uRange * aRangeArray, + uScanClassID * aScanClassArray, + uMappingTable ** aMappingTable, + uint32_t aMaxLengthFactor); + + /** + * Class destructor. + */ + virtual ~nsMultiTableDecoderSupport(); + +protected: + + int32_t mTableCount; + const uRange * mRangeArray; + uScanClassID * mScanClassArray; + uMappingTable ** mMappingTable; + + //-------------------------------------------------------------------- + // Subclassing of nsBufferDecoderSupport class [declaration] + + NS_IMETHOD ConvertNoBuff(const char * aSrc, int32_t * aSrcLength, + char16_t * aDest, int32_t * aDestLength); +}; + +//---------------------------------------------------------------------- +// Class nsBufferDecoderSupport [declaration] + +/** + * Support class for a single-byte Unicode decoder. + * + * @created 19/Apr/1999 + * @author Catalin Rotaru [CATA] + */ +class nsOneByteDecoderSupport : public nsBasicDecoderSupport +{ +public: + + /** + * Class constructor. + */ + explicit nsOneByteDecoderSupport(uMappingTable * aMappingTable); + + /** + * Class destructor. + */ + virtual ~nsOneByteDecoderSupport(); + +protected: + + uMappingTable * mMappingTable; + char16_t mFastTable[ONE_BYTE_TABLE_SIZE]; + bool mFastTableCreated; + mozilla::Mutex mFastTableMutex; + + //-------------------------------------------------------------------- + // Subclassing of nsBasicDecoderSupport class [declaration] + + NS_IMETHOD Convert(const char * aSrc, int32_t * aSrcLength, + char16_t * aDest, int32_t * aDestLength); + NS_IMETHOD GetMaxLength(const char * aSrc, int32_t aSrcLength, + int32_t * aDestLength); + NS_IMETHOD Reset(); +}; + +//---------------------------------------------------------------------- +// Class nsBasicEncoder [declaration] + +class nsBasicEncoder : public nsIUnicodeEncoder +#ifdef DEBUG + ,public nsIBasicEncoder +#endif +{ + NS_DECL_ISUPPORTS + +public: + /** + * Class constructor. + */ + nsBasicEncoder(); + +protected: + /** + * Class destructor. + */ + virtual ~nsBasicEncoder(); + +}; +//---------------------------------------------------------------------- +// Class nsEncoderSupport [declaration] + +/** + * Support class for the Unicode encoders. + * + * This class implements: + * - nsISupports + * - the buffer management + * - error handling procedure(s) + * + * @created 17/Feb/1999 + * @author Catalin Rotaru [CATA] + */ +class nsEncoderSupport : public nsBasicEncoder +{ + +protected: + + /** + * Internal buffer for partial conversions. + */ + char * mBuffer; + int32_t mBufferCapacity; + char * mBufferStart; + char * mBufferEnd; + + /** + * Error handling stuff + */ + int32_t mErrBehavior; + nsCOMPtr<nsIUnicharEncoder> mErrEncoder; + char16_t mErrChar; + uint32_t mMaxLengthFactor; + + /** + * Convert method but *without* the buffer management stuff and *with* + * error handling stuff. + */ + NS_IMETHOD ConvertNoBuff(const char16_t * aSrc, int32_t * aSrcLength, + char * aDest, int32_t * aDestLength); + + /** + * Convert method but *without* the buffer management stuff and *without* + * error handling stuff. + */ + NS_IMETHOD ConvertNoBuffNoErr(const char16_t * aSrc, int32_t * aSrcLength, + char * aDest, int32_t * aDestLength) = 0; + + /** + * Finish method but *without* the buffer management stuff. + */ + NS_IMETHOD FinishNoBuff(char * aDest, int32_t * aDestLength); + + /** + * Copy as much as possible from the internal buffer to the destination. + */ + nsresult FlushBuffer(char ** aDest, const char * aDestEnd); + +public: + + /** + * Class constructor. + */ + explicit nsEncoderSupport(uint32_t aMaxLengthFactor); + + /** + * Class destructor. + */ + virtual ~nsEncoderSupport(); + + //-------------------------------------------------------------------- + // Interface nsIUnicodeEncoder [declaration] + + NS_IMETHOD Convert(const char16_t * aSrc, int32_t * aSrcLength, + char * aDest, int32_t * aDestLength); + NS_IMETHOD Finish(char * aDest, int32_t * aDestLength); + NS_IMETHOD Reset(); + NS_IMETHOD SetOutputErrorBehavior(int32_t aBehavior, + nsIUnicharEncoder * aEncoder, char16_t aChar); + NS_IMETHOD GetMaxLength(const char16_t * aSrc, + int32_t aSrcLength, + int32_t * aDestLength); +}; + +//---------------------------------------------------------------------- +// Class nsTableEncoderSupport [declaration] + +/** + * Support class for a single-table-driven Unicode encoder. + * + * @created 17/Feb/1999 + * @author Catalin Rotaru [CATA] + */ +class nsTableEncoderSupport : public nsEncoderSupport +{ +public: + + /** + * Class constructors. + */ + nsTableEncoderSupport(uScanClassID aScanClass, + uShiftOutTable * aShiftOutTable, + uMappingTable * aMappingTable, + uint32_t aMaxLengthFactor); + + nsTableEncoderSupport(uScanClassID aScanClass, + uMappingTable * aMappingTable, + uint32_t aMaxLengthFactor); + + /** + * Class destructor. + */ + virtual ~nsTableEncoderSupport(); + +protected: + + uScanClassID mScanClass; + uShiftOutTable * mShiftOutTable; + uMappingTable * mMappingTable; + + //-------------------------------------------------------------------- + // Subclassing of nsEncoderSupport class [declaration] + + NS_IMETHOD ConvertNoBuffNoErr(const char16_t * aSrc, int32_t * aSrcLength, + char * aDest, int32_t * aDestLength); +}; + +//---------------------------------------------------------------------- +// Class nsMultiTableEncoderSupport [declaration] + +/** + * Support class for a multi-table-driven Unicode encoder. + * + * @created 11/Mar/1999 + * @author Catalin Rotaru [CATA] + */ +class nsMultiTableEncoderSupport : public nsEncoderSupport +{ +public: + + /** + * Class constructor. + */ + nsMultiTableEncoderSupport(int32_t aTableCount, + uScanClassID * aScanClassArray, + uShiftOutTable ** aShiftOutTable, + uMappingTable ** aMappingTable, + uint32_t aMaxLengthFactor); + + /** + * Class destructor. + */ + virtual ~nsMultiTableEncoderSupport(); + +protected: + + int32_t mTableCount; + uScanClassID * mScanClassArray; + uShiftOutTable ** mShiftOutTable; + uMappingTable ** mMappingTable; + + //-------------------------------------------------------------------- + // Subclassing of nsEncoderSupport class [declaration] + + NS_IMETHOD ConvertNoBuffNoErr(const char16_t * aSrc, int32_t * aSrcLength, + char * aDest, int32_t * aDestLength); +}; + + +#endif /* nsUCvJaSupport_h___ */ |