diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2005-11-26 19:01:11 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2005-11-26 19:01:11 +0000 |
| commit | f94e2c9821eb8784ca03b7122485d4720ec6d6e6 (patch) | |
| tree | 6da2323d2220093ea1c3756dbddb8e02fded2969 /lib/base | |
| parent | 68271eeaf83872270f13cc01e98960367d7d553f (diff) | |
| download | enigma2-f94e2c9821eb8784ca03b7122485d4720ec6d6e6.tar.gz enigma2-f94e2c9821eb8784ca03b7122485d4720ec6d6e6.zip | |
add ability to select default encoding for dvb texts in many ways.. ( take a look in data/encodings.conf )
Diffstat (limited to 'lib/base')
| -rw-r--r-- | lib/base/Makefile.am | 2 | ||||
| -rw-r--r-- | lib/base/encoding.cpp | 59 | ||||
| -rw-r--r-- | lib/base/encoding.h | 22 | ||||
| -rw-r--r-- | lib/base/estring.cpp | 22 |
4 files changed, 89 insertions, 16 deletions
diff --git a/lib/base/Makefile.am b/lib/base/Makefile.am index 7c66c4db..f7176e27 100644 --- a/lib/base/Makefile.am +++ b/lib/base/Makefile.am @@ -7,4 +7,4 @@ libenigma_base_a_SOURCES = \ buffer.cpp ebase.cpp econfig.cpp eerror.cpp elock.cpp \ init.cpp message.cpp thread.cpp \ smartptr.cpp estring.cpp connection.cpp \ - filepush.cpp + filepush.cpp encoding.cpp diff --git a/lib/base/encoding.cpp b/lib/base/encoding.cpp new file mode 100644 index 00000000..e8651699 --- /dev/null +++ b/lib/base/encoding.cpp @@ -0,0 +1,59 @@ +#include <lib/base/encoding.h> +#include <lib/base/eerror.h> +#include <config.h> + +eDVBTextEncodingHandler encodingHandler; // the one and only instance + +eDVBTextEncodingHandler::eDVBTextEncodingHandler() +{ + const char * file=DATADIR "/enigma2/encoding.conf"; + FILE *f = fopen(file, "rt"); + if (f) + { + char *line = (char*) malloc(256); + size_t bufsize=256; + char countrycode[256]; + while( getline(&line, &bufsize, f) != -1 ) + { + if ( line[0] == '#' ) + continue; + int tsid, onid, encoding; + if ( sscanf( line, "%s ISO8859-%d", countrycode, &encoding ) == 2 ) + m_CountryCodeDefaultMapping[countrycode]=encoding; + else if ( (sscanf( line, "0x%x 0x%x ISO8859-%d", &tsid, &onid, &encoding ) == 3 ) + ||(sscanf( line, "%d %d ISO8859-%d", &tsid, &onid, &encoding ) == 3 ) ) + m_TransponderDefaultMapping[(tsid<<16)|onid]=encoding; + else if ( (sscanf( line, "0x%x 0x%x", &tsid, &onid ) == 2 ) + ||(sscanf( line, "%d %d", &tsid, &onid ) == 2 ) ) + m_TransponderUseTwoCharMapping.insert((tsid<<16)|onid); + else + eDebug("couldn't parse %s", line); + } + fclose(f); + free(line); + } + else + eDebug("[eDVBTextEncodingHandler] couldn't open %s !", file); +} + +void eDVBTextEncodingHandler::getTransponderDefaultMapping(int tsidonid, int &table) +{ + std::map<int, int>::iterator it = + m_TransponderDefaultMapping.find(tsidonid); + if ( it != m_TransponderDefaultMapping.end() ) + table = it->second; +} + +bool eDVBTextEncodingHandler::getTransponderUseTwoCharMapping(int tsidonid) +{ + return m_TransponderUseTwoCharMapping.find(tsidonid) != m_TransponderUseTwoCharMapping.end(); +} + +int eDVBTextEncodingHandler::getCountryCodeDefaultMapping( const std::string &country_code ) +{ + std::map<std::string, int>::iterator it = + m_CountryCodeDefaultMapping.find(country_code); + if ( it != m_CountryCodeDefaultMapping.end() ) + return it->second; + return 0; // ISO8859-1 / Latin1 +} diff --git a/lib/base/encoding.h b/lib/base/encoding.h new file mode 100644 index 00000000..3f107d66 --- /dev/null +++ b/lib/base/encoding.h @@ -0,0 +1,22 @@ +#ifndef __lib_base_encoding_h__ +#define __lib_base_encoding_h__ + +#include <string> +#include <set> +#include <map> + +class eDVBTextEncodingHandler +{ + std::map<std::string, int> m_CountryCodeDefaultMapping; + std::map<int, int> m_TransponderDefaultMapping; + std::set<int> m_TransponderUseTwoCharMapping; +public: + eDVBTextEncodingHandler(); + void getTransponderDefaultMapping(int tsidonid, int &table); + bool getTransponderUseTwoCharMapping(int tsidonid); + int getCountryCodeDefaultMapping( const std::string &country_code ); +}; + +extern eDVBTextEncodingHandler encodingHandler; + +#endif // __lib_base_encoding_h__
\ No newline at end of file diff --git a/lib/base/estring.cpp b/lib/base/estring.cpp index 4259c58f..10bfbef8 100644 --- a/lib/base/estring.cpp +++ b/lib/base/estring.cpp @@ -1,12 +1,10 @@ #include <string> #include <ctype.h> #include <limits.h> -#include <lib/base/elock.h> #include <lib/base/eerror.h> +#include <lib/base/encoding.h> #include <lib/base/estring.h> -static pthread_mutex_t lock=PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; - std::string getNum(int val, int sys) { // Returns a string that contain the value val as string @@ -331,15 +329,8 @@ std::string convertDVBUTF8(const unsigned char *data, int len, int table, int ts int i=0, t=0; -#if 0 // FIXME if ( tsidonid ) - { - std::map<int, int>::iterator it = - std::string::TransponderDefaultMapping.find(tsidonid); - if ( it != std::string::TransponderDefaultMapping.end() ) - table = it->second; - } -#endif + encodingHandler.getTransponderDefaultMapping(tsidonid, table); switch(data[0]) { @@ -386,17 +377,18 @@ std::string convertDVBUTF8(const unsigned char *data, int len, int table, int ts break; } + bool useTwoCharMapping = + tsidonid && encodingHandler.getTransponderUseTwoCharMapping(tsidonid); + unsigned char res[2048]; while (i < len) { unsigned long code=0; -#if 0 // FIXME - if ( i+1 < len && tsidonid && - std::string::TransponderUseTwoCharMapping.find(tsidonid) != std::string::TransponderUseTwoCharMapping.end() && + if ( useTwoCharMapping && i+1 < len && (code=doVideoTexSuppl(data[i], data[i+1])) ) i+=2; -#endif + if (!code) code=recode(data[i++], table); if (!code) |
