/*************************************************************************** ktextcharcodec.cpp - description ------------------- begin : Sa Nov 27 2004 copyright : (C) 2004 by Friedrich W. H. Kossebau email : Friedrich.W.H@Kossebau.de ***************************************************************************/ /*************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License version 2 as published by the Free Software Foundation. * * * ***************************************************************************/ // qt specific #include "textcodec.h" // kde specific #include #include #include // lib specific #include "ktextcharcodec.h" using namespace KHE; static const char TQTextCodecWhiteSpace = 63; static struct KEncodingNames { KEncoding Encoding; const char *Name; } const EncodingNames[] = { { ISO8859_1Encoding, "ISO 8859-1" }, { ISO8859_2Encoding, "ISO 8859-2" }, { ISO8859_3Encoding, "ISO 8859-3" }, { ISO8859_4Encoding, "ISO 8859-4" }, { ISO8859_5Encoding, "ISO 8859-5" }, { ISO8859_6Encoding, "ISO 8859-6" }, { ISO8859_7Encoding, "ISO 8859-7" }, { ISO8859_8Encoding, "ISO 8859-8" }, { ISO8859_8_IEncoding, "ISO 8859-8-I" }, { ISO8859_9Encoding, "ISO 8859-9" }, { ISO8859_11Encoding, "ISO 8859-11" }, { ISO8859_13Encoding, "ISO 8859-13" }, { ISO8859_15Encoding, "ISO 8859-15" }, { CP1250Encoding, "CP 1250" }, { CP1251Encoding, "CP 1251" }, { CP1252Encoding, "CP 1252" }, { CP1253Encoding, "CP 1253" }, { CP1254Encoding, "CP 1254" }, { CP1255Encoding, "CP 1255" }, { CP1256Encoding, "CP 1256" }, { CP1257Encoding, "CP 1257" }, { CP1258Encoding, "CP 1258" }, { IBM850Encoding, "IBM 850" }, { IBM866Encoding, "IBM 866" }, { KOI8_REncoding, "KOI8-R" }, { KOI8_UEncoding, "KOI8-U" } }; //TODO: WS2 static const unsigned int NoOfEncodings = 26; static bool is8Bit( TQTextCodec *Codec ) { bool Found = false; for( unsigned int i=0; iname(),EncodingNames[i].Name) == 0 ) { Found = true; break; } } return Found; } static TQTextCodec *createLatin1() { return KGlobal::charsets()->codecForName( EncodingNames[0].Name ); } /** heuristic seems to be doomed :( static bool is8Bit( TQTextCodec *Codec ) { bool Result = true; // first test different for 0 unsigned char c[4]; c[0] = 0; c[1] = c[2] = c[3] = 230; TQString S = Codec->toUnicode( (const char*)&c,4 ); int Length = 1; TQCString CS = Codec->fromUnicode( S, Length ); //kdDebug() << Codec->name() << " "< 0 ) Result = false; // test if all chars survive the recoding else do { ++c[0]; S = Codec->toUnicode( (const char*)&c,4 ); Length = 1; CS = Codec->fromUnicode( S, Length ); //kdDebug() << Codec->name() << " "<"<availableEncodingNames(); for( TQStringList::ConstIterator it = CharSets.begin(); it != CharSets.end(); ++it ) { bool Found = true; TQTextCodec* Codec = KGlobal::charsets()->codecForName( *it, Found ); if( Found && is8Bit(Codec) ) CodecNames.append( TQString::fromLatin1(Codec->name()) ); } } return CodecNames; } TQString KTextCharCodec::nameOfEncoding( KEncoding C ) { KTextCharCodec *Codec = 0; const char* N = 0; for( unsigned int i=0; icodecForEncoding(); if( !is8Bit(Codec) ) Codec = createLatin1(); return new KTextCharCodec( Codec ); } KTextCharCodec *KTextCharCodec::createCodec( const TQString &CodeName ) { bool Ok; TQTextCodec *Codec = KGlobal::charsets()->codecForName( CodeName, Ok ); if( Ok ) Ok = is8Bit( Codec ); return Ok ? new KTextCharCodec( Codec ) : 0; } const TQStringList &KTextCharCodec::codecNames() { // first call? if( CodecNames.isEmpty() ) { for( unsigned int i=0; icodecForName( Name, Found ); if( Found ) CodecNames.append( TQString::fromLatin1(Codec->name()) ); } } return CodecNames; } KTextCharCodec::KTextCharCodec( TQTextCodec *C ) : Codec( C ), Decoder( C->makeDecoder() ), Encoder( C->makeEncoder() ) {} KTextCharCodec::~KTextCharCodec() { delete Decoder; delete Encoder; } bool KTextCharCodec::encode( char *D, const TQChar &C ) const { if( !Codec->canEncode(C) ) // TODO: do we really need the codec? return false; int dummy; char T = Encoder->fromUnicode( C, dummy )[0]; *D = T; return true; } KHEChar KTextCharCodec::decode( char Byte ) const { TQString S( Decoder->toUnicode(&Byte,1) ); return KHEChar(S.at(0)); } const TQString& KTextCharCodec::name() const { if( Name.isNull() ) Name = TQString::fromLatin1( Codec->name() ); return Name; }