filter short name brakets in getContent ('N')
[enigma2.git] / lib / base / estring.cpp
index 22b65698d2916ace5c2a5f36dab717fe6f1df944..487dceecceb630186a7ad5e47a6e8c1664efbe1e 100644 (file)
@@ -1,11 +1,27 @@
 #include <string>
 #include <ctype.h>
 #include <limits.h>
 #include <string>
 #include <ctype.h>
 #include <limits.h>
-#include <lib/base/elock.h>
 #include <lib/base/eerror.h>
 #include <lib/base/eerror.h>
+#include <lib/base/encoding.h>
 #include <lib/base/estring.h>
 
 #include <lib/base/estring.h>
 
-static pthread_mutex_t lock=PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP;
+std::string buildShortName( const std::string &str )
+{
+       std::string tmp;
+       static char stropen[3] = { 0xc2, 0x86, 0x00 };
+       static char strclose[3] = { 0xc2, 0x87, 0x00 };
+       unsigned int open=std::string::npos-1;
+       while ( (open = str.find(stropen, open+2)) != std::string::npos )
+       {
+               unsigned int close = str.find(strclose, open);
+               if ( close != std::string::npos )
+               {
+                       tmp+=str.substr( open+2, close-(open+2) );
+                       eDebug("now %s", tmp.c_str());
+               }
+       }
+       return tmp.length() ? tmp : str;
+}
 
 std::string getNum(int val, int sys)
 {
 
 std::string getNum(int val, int sys)
 {
@@ -331,31 +347,26 @@ std::string convertDVBUTF8(const unsigned char *data, int len, int table, int ts
 
        int i=0, t=0;
 
 
        int i=0, t=0;
 
-#if 0  // FIXME
        if ( tsidonid )
        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])
        {
 
        switch(data[0])
        {
-               case 1 ... 12:
+               case 1 ... 11:
                        table=data[i++]+4;
                        table=data[i++]+4;
-//                     eDebug("(1..12)text encoded in ISO-8859-%d",table);
+//                     eDebug("(1..11)text encoded in ISO-8859-%d",table);
                        break;
                case 0x10:
                {
 //                     eDebug("(0x10)text encoded in ISO-8859-%d",n);
                        break;
                case 0x10:
                {
 //                     eDebug("(0x10)text encoded in ISO-8859-%d",n);
-                       int n=(data[++i]<<8)|(data[++i]);
+                       int n=(data[++i]<<8);
+                       n |= (data[++i]);
                        ++i;
                        switch(n)
                        {
                                case 12:
                                        eDebug("unsup. ISO8859-12 enc.", n);
                        ++i;
                        switch(n)
                        {
                                case 12:
                                        eDebug("unsup. ISO8859-12 enc.", n);
+                                       break;
                                default:
                                        table=n;
                                        break;
                                default:
                                        table=n;
                                        break;
@@ -378,25 +389,28 @@ std::string convertDVBUTF8(const unsigned char *data, int len, int table, int ts
                        ++i;
                        eDebug("unsup. Big5 subset of ISO/IEC 10646-1 enc.");
                        break;
                        ++i;
                        eDebug("unsup. Big5 subset of ISO/IEC 10646-1 enc.");
                        break;
+               case 0x15: // UTF-8 encoding of ISO/IEC 10646-1
+                       return std::string((char*)data+1, len-1);
                case 0x0:
                case 0x0:
-               case 0xD ... 0xF:
-               case 0x15 ... 0x1F:
+               case 0xC ... 0xF:
+               case 0x16 ... 0x1F:
                        eDebug("reserved %d", data[0]);
                        ++i;
                        break;
        }
 
                        eDebug("reserved %d", data[0]);
                        ++i;
                        break;
        }
 
+       bool useTwoCharMapping =
+               tsidonid && encodingHandler.getTransponderUseTwoCharMapping(tsidonid);
+
        unsigned char res[2048];
        while (i < len)
        {
                unsigned long code=0;
 
        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;
                        (code=doVideoTexSuppl(data[i], data[i+1])) )
                        i+=2;
-#endif
+
                if (!code)
                        code=recode(data[i++], table);
                if (!code)
                if (!code)
                        code=recode(data[i++], table);
                if (!code)
@@ -529,7 +543,7 @@ std::string convertLatin1UTF8(const std::string &string)
 
        while (i < len)
        {
 
        while (i < len)
        {
-               unsigned long code=string[i++];
+               unsigned long code=(unsigned char)string[i++];
                                // Unicode->UTF8 encoding
                if (code < 0x80) // identity latin <-> utf8 mapping
                        res[t++]=char(code);
                                // Unicode->UTF8 encoding
                if (code < 0x80) // identity latin <-> utf8 mapping
                        res[t++]=char(code);
@@ -595,13 +609,13 @@ std::string removeDVBChars(const std::string &s)
        
        int len = s.length();
        
        
        int len = s.length();
        
-       for(int i = 0; i < len-1; i++)
+       for(int i = 0; i < len; i++)
        {
                unsigned char c1 = s[i];
                unsigned int c;
                
                        /* UTF8? decode (but only simple) */
        {
                unsigned char c1 = s[i];
                unsigned int c;
                
                        /* UTF8? decode (but only simple) */
-               if(c1 > 0x80)
+               if((c1 > 0x80) && (i < len-1))
                {
                        unsigned char c2 = s[i + 1];
                        c = ((c1&0x3F)<<6) + (c2&0x3F);
                {
                        unsigned char c2 = s[i + 1];
                        c = ((c1&0x3F)<<6) + (c2&0x3F);