// CHARCONV.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__CHARCONV_H__)
#define __CHARCONV_H__

#if !defined(__E32STD_H__)
#include <E32STD.H>
#endif

#if !defined(__E32BASE_H__)
#include <E32BASE.H>
#endif

struct SCnvConversionData;

class CCnvCharacterSetConverter : public CBase
	{
public:
	class CDeepDestructingArrayOfCharactersSets;
	class CFileReader;
public:
	enum TError
		{
		EErrorIllFormedInput=-1
		};
	enum TEndianness
		{
		ELittleEndian,
		EBigEndian
		};
	enum {KStateDefault=0};
	struct SCharacterSet
		{
		TUint iIdentifier;
		HBufC16* iName;
	private:
		HBufC* iFullNameOfConversionDataFile;
	private:
		friend CCnvCharacterSetConverter;
		friend CDeepDestructingArrayOfCharactersSets;
		};
public:
	IMPORT_C static CCnvCharacterSetConverter* NewL();
	IMPORT_C static CCnvCharacterSetConverter* NewLC();
	IMPORT_C virtual ~CCnvCharacterSetConverter();
	IMPORT_C static CArrayFix<SCharacterSet>* CreateArrayOfCharacterSetsAvailableL();
	IMPORT_C static CArrayFix<SCharacterSet>* CreateArrayOfCharacterSetsAvailableLC();
	IMPORT_C void PrepareToConvertToOrFromL(TUint aCharacterSetIdentifier, const CArrayFix<SCharacterSet>& aArrayOfCharacterSetsAvailable);
	IMPORT_C void SetDefaultEndiannessOfForeignCharacters(TEndianness aEndianness);
	IMPORT_C void SetReplacementForUnconvertibleUnicodeCharactersL(const TDesC8& aReplacementForUnconvertibleUnicodeCharacters); // must be a single character, and must be little-endian if the endianness of the character-set is unspecified, otherwise in the same endianness as the character-set
	// the conversion functions return either one of the TError values above, or the number of unconverted elements left at the end of the input descriptor
	IMPORT_C TInt ConvertFromUnicode(TDes8& aForeign, const TDesC16& aUnicode) const;
	IMPORT_C TInt ConvertFromUnicode(TDes8& aForeign, const TDesC16& aUnicode, TBool& aReplacementWasMadeForOneOrMoreUnconvertibleCharacters) const;
	IMPORT_C TInt ConvertToUnicode(TDes16& aUnicode, const TDesC8& aForeign, TInt& aState) const;
	IMPORT_C TInt ConvertToUnicode(TDes16& aUnicode, const TDesC8& aForeign, TInt& aState, TBool& aReplacementWasMadeForOneOrMoreUnconvertibleCharacters) const;
	IMPORT_C static TInt ConvertFromUnicodeToNative8BitBuild(TDes8& aNative8BitBuild, const TDesC16& aUnicode);
	IMPORT_C static TInt ConvertFromUnicodeToNative8BitBuild(TDes8& aNative8BitBuild, const TDesC16& aUnicode, TBool& aReplacementWasMadeForOneOrMoreUnconvertibleCharacters);
	IMPORT_C static TInt ConvertFromUnicodeToNative8BitBuild(TDes8& aNative8BitBuild, const TDesC16& aUnicode, const TDesC8& aReplacementForUnconvertibleUnicodeCharacters);
	IMPORT_C static TInt ConvertFromUnicodeToNative8BitBuild(TDes8& aNative8BitBuild, const TDesC16& aUnicode, const TDesC8& aReplacementForUnconvertibleUnicodeCharacters, TBool& aReplacementWasMadeForOneOrMoreUnconvertibleCharacters);
	IMPORT_C static TInt ConvertToUnicodeFromNative8BitBuild(TDes16& aUnicode, const TDesC8& aNative8BitBuild, TInt& aState);
	IMPORT_C static TInt ConvertToUnicodeFromNative8BitBuild(TDes16& aUnicode, const TDesC8& aNative8BitBuild, TInt& aState, TBool& aReplacementWasMadeForOneOrMoreUnconvertibleCharacters);
private:
	CCnvCharacterSetConverter();
	static TInt DoConvertFromUnicode(const SCnvConversionData& aConversionData, TEndianness aDefaultEndiannessOfForeignCharacters, const TDesC8& aReplacementForUnconvertibleUnicodeCharacters, TDes8& aForeign, const TDesC16& aUnicode, TBool* aReplacementWasMadeForOneOrMoreUnconvertibleCharacters);
	static TInt DoConvertToUnicode(const SCnvConversionData& aConversionData, TEndianness aDefaultEndiannessOfForeignCharacters, TDes16& aUnicode, const TDesC8& aForeign, TInt& aState, TBool* aReplacementWasMadeForOneOrMoreUnconvertibleCharacters);
	static void CloseFileServerSession(TAny* aFileServerSession);
	static void CloseFile(TAny* aFile);
	static void DeleteConversionData(const SCnvConversionData* aConversionData);
	static void DeleteConversionData(TAny* aConversionData);
	static TEndianness EndiannessOfForeignCharacters(const SCnvConversionData& aConversionData, TEndianness aDefaultEndiannessOfForeignCharacters);
private:
	TUint iCharacterSetIdentifierOfLoadedConversionData; // 0 or a UID
	const SCnvConversionData* iConversionData;
	TEndianness iDefaultEndiannessOfForeignCharacters;
	HBufC8* iReplacementForUnconvertibleUnicodeCharacters;
	};

#endif

