no comment!
[enigma2.git] / lib / dvb / epgcache.cpp
index 1a07755f7eec10e1c897e68a23c0b5626e589139..a8eca85b5cf598311923c41fdc33b6d69badddf8 100644 (file)
@@ -213,13 +213,13 @@ pthread_mutex_t eEPGCache::channel_map_lock=
 DEFINE_REF(eEPGCache)
 
 eEPGCache::eEPGCache()
-       :messages(this,1), cleanTimer(this)//, paused(0)
+       :messages(this,1), cleanTimer(eTimer::create(this))//, paused(0)
 {
        eDebug("[EPGC] Initialized EPGCache");
 
        CONNECT(messages.recv_msg, eEPGCache::gotMessage);
        CONNECT(eDVBLocalTimeHandler::getInstance()->m_timeUpdated, eEPGCache::timeUpdated);
-       CONNECT(cleanTimer.timeout, eEPGCache::cleanLoop);
+       CONNECT(cleanTimer->timeout, eEPGCache::cleanLoop);
 
        ePtr<eDVBResourceManager> res_mgr;
        eDVBResourceManager::getInstance(res_mgr);
@@ -783,7 +783,7 @@ void eEPGCache::cleanLoop()
                eDebug("[EPGC] stop cleanloop");
                eDebug("[EPGC] %i bytes for cache used", eventData::CacheSize);
        }
-       cleanTimer.start(CLEAN_INTERVAL,true);
+       cleanTimer->start(CLEAN_INTERVAL,true);
 }
 
 eEPGCache::~eEPGCache()
@@ -847,7 +847,7 @@ void eEPGCache::gotMessage( const Message &msg )
                                        int update = ( It != channelLastUpdated.end() ? ( UPDATE_INTERVAL - ( (::time(0)-It->second) * 1000 ) ) : ZAP_DELAY );
                                        if (update < ZAP_DELAY)
                                                update = ZAP_DELAY;
-                                       data->startPrivateTimer.start(update, 1);
+                                       data->startPrivateTimer->start(update, 1);
                                        if (update >= 60000)
                                                eDebug("[EPGC] next private update in %i min", update/60000);
                                        else if (update >= 1000)
@@ -1088,22 +1088,22 @@ void eEPGCache::save()
 
 eEPGCache::channel_data::channel_data(eEPGCache *ml)
        :cache(ml)
-       ,abortTimer(ml), zapTimer(ml), state(0)
+       ,abortTimer(eTimer::create(ml)), zapTimer(eTimer::create(ml)), state(0)
        ,isRunning(0), haveData(0)
 #ifdef ENABLE_PRIVATE_EPG
-       ,startPrivateTimer(ml)
+       ,startPrivateTimer(eTimer::create(ml))
 #endif
 #ifdef ENABLE_MHW_EPG
-       ,m_MHWTimeoutTimer(ml)
+       ,m_MHWTimeoutTimer(eTimer::create(ml))
 #endif
 {
 #ifdef ENABLE_MHW_EPG
-       CONNECT(m_MHWTimeoutTimer.timeout, eEPGCache::channel_data::MHWTimeout);
+       CONNECT(m_MHWTimeoutTimer->timeout, eEPGCache::channel_data::MHWTimeout);
 #endif
-       CONNECT(zapTimer.timeout, eEPGCache::channel_data::startEPG);
-       CONNECT(abortTimer.timeout, eEPGCache::channel_data::abortNonAvail);
+       CONNECT(zapTimer->timeout, eEPGCache::channel_data::startEPG);
+       CONNECT(abortTimer->timeout, eEPGCache::channel_data::abortNonAvail);
 #ifdef ENABLE_PRIVATE_EPG
-       CONNECT(startPrivateTimer.timeout, eEPGCache::channel_data::startPrivateReader);
+       CONNECT(startPrivateTimer->timeout, eEPGCache::channel_data::startPrivateReader);
 #endif
        pthread_mutex_init(&channel_active, 0);
 }
@@ -1113,7 +1113,7 @@ bool eEPGCache::channel_data::finishEPG()
        if (!isRunning)  // epg ready
        {
                eDebug("[EPGC] stop caching events(%ld)", ::time(0));
-               zapTimer.start(UPDATE_INTERVAL, 1);
+               zapTimer->start(UPDATE_INTERVAL, 1);
                eDebug("[EPGC] next update in %i min", UPDATE_INTERVAL / 60000);
                for (int i=0; i < 3; ++i)
                {
@@ -1186,7 +1186,7 @@ void eEPGCache::channel_data::startEPG()
        m_ScheduleOtherReader->start(mask);
        isRunning |= SCHEDULE_OTHER;
 
-       abortTimer.start(7000,true);
+       abortTimer->start(7000,true);
 }
 
 void eEPGCache::channel_data::abortNonAvail()
@@ -1226,7 +1226,7 @@ void eEPGCache::channel_data::abortNonAvail()
                }
 #endif
                if ( isRunning )
-                       abortTimer.start(90000, true);
+                       abortTimer->start(90000, true);
                else
                {
                        ++state;
@@ -1250,7 +1250,7 @@ void eEPGCache::channel_data::startChannel()
        if (update < ZAP_DELAY)
                update = ZAP_DELAY;
 
-       zapTimer.start(update, 1);
+       zapTimer->start(update, 1);
        if (update >= 60000)
                eDebug("[EPGC] next update in %i min", update/60000);
        else if (update >= 1000)
@@ -1264,8 +1264,8 @@ void eEPGCache::channel_data::abortEPG()
                seenSections[i].clear();
                calcedSections[i].clear();
        }
-       abortTimer.stop();
-       zapTimer.stop();
+       abortTimer->stop();
+       zapTimer->stop();
        if (isRunning)
        {
                eDebug("[EPGC] abort caching events !!");
@@ -1672,7 +1672,7 @@ int handleEvent(eServiceEvent *ptr, ePyObject dest_list, const char* argstring,
        {
                fillTuple(convertFuncArgs, argstring, argcount, service, ptr, nowTime, service_name);
                ePyObject result = PyObject_CallObject(convertFunc, convertFuncArgs);
-               if (result)
+               if (!result)
                {
                        if (service_name)
                                Py_DECREF(service_name);
@@ -2047,6 +2047,8 @@ PyObject *eEPGCache::search(ePyObject arg)
        int querytype=-1;
        bool needServiceEvent=false;
        int maxmatches=0;
+       int must_get_service_name = 0;
+       bool must_get_service_reference = false;
 
        if (PyTuple_Check(arg))
        {
@@ -2065,6 +2067,16 @@ PyObject *eEPGCache::search(ePyObject arg)
                                        case 'E':
                                        case 'T':
                                                needServiceEvent=true;
+                                               break;
+                                       case 'N':
+                                               must_get_service_name = 1;
+                                               break;
+                                       case 'n':
+                                               must_get_service_name = 2;
+                                               break;
+                                       case 'R':
+                                               must_get_service_reference = true;
+                                               break;
                                        default:
                                                break;
                                        }
@@ -2159,22 +2171,32 @@ PyObject *eEPGCache::search(ePyObject arg)
                                                        int title_len = data[5];
                                                        if ( querytype == 1 )
                                                        {
-                                                               if (title_len > textlen)
-                                                                       continue;
-                                                               else if (title_len < textlen)
+                                                               int offs = 6;
+                                                               // skip DVB-Text Encoding!
+                                                               if (data[6] == 0x10)
+                                                               {
+                                                                       offs+=3;
+                                                                       title_len-=3;
+                                                               }
+                                                               else if(data[6] > 0 && data[6] < 0x20)
+                                                               {
+                                                                       offs+=1;
+                                                                       title_len-=1;
+                                                               }
+                                                               if (title_len != textlen)
                                                                        continue;
                                                                if ( casetype )
                                                                {
-                                                                       if ( !strncasecmp((const char*)data+6, str, title_len) )
+                                                                       if ( !strncasecmp((const char*)data+offs, str, title_len) )
                                                                        {
-//                                                                             std::string s((const char*)data+6, title_len);
+//                                                                             std::string s((const char*)data+offs, title_len);
 //                                                                             eDebug("match1 %s %s", str, s.c_str() );
                                                                                descr[++descridx] = it->first;
                                                                        }
                                                                }
-                                                               else if ( !strncmp((const char*)data+6, str, title_len) )
+                                                               else if ( !strncmp((const char*)data+offs, str, title_len) )
                                                                {
-//                                                                     std::string s((const char*)data+6, title_len);
+//                                                                     std::string s((const char*)data+offs, title_len);
 //                                                                     eDebug("match2 %s %s", str, s.c_str() );
                                                                        descr[++descridx] = it->first;
                                                                }
@@ -2193,13 +2215,13 @@ PyObject *eEPGCache::search(ePyObject arg)
 //                                                                                     eDebug("match 3 %s %s", str, s.c_str() );
                                                                                        break;
                                                                                }
-                                                                               else if (!strncmp((const char*)data+6+idx, str, textlen) )
-                                                                               {
-                                                                                       descr[++descridx] = it->first;
-//                                                                                     std::string s((const char*)data+6, title_len);
-//                                                                                     eDebug("match 4 %s %s", str, s.c_str() );
-                                                                                       break;
-                                                                               }
+                                                                       }
+                                                                       else if (!strncmp((const char*)data+6+idx, str, textlen) )
+                                                                       {
+                                                                               descr[++descridx] = it->first;
+//                                                                             std::string s((const char*)data+6, title_len);
+//                                                                             eDebug("match 4 %s %s", str, s.c_str() );
+                                                                               break;
                                                                        }
                                                                        ++idx;
                                                                }
@@ -2303,44 +2325,40 @@ PyObject *eEPGCache::search(ePyObject arg)
                                                        }
                                                }
                                        // create service name
-                                               if (!service_name)
+                                               if (must_get_service_name && !service_name)
                                                {
-                                                       int must_get_service_name = strchr(argstring, 'N') ? 1 : strchr(argstring, 'n') ? 2 : 0;
-                                                       if (must_get_service_name)
+                                                       ePtr<iStaticServiceInformation> sptr;
+                                                       eServiceCenterPtr service_center;
+                                                       eServiceCenter::getPrivInstance(service_center);
+                                                       if (service_center)
                                                        {
-                                                               ePtr<iStaticServiceInformation> sptr;
-                                                               eServiceCenterPtr service_center;
-                                                               eServiceCenter::getPrivInstance(service_center);
-                                                               if (service_center)
+                                                               service_center->info(ref, sptr);
+                                                               if (sptr)
                                                                {
-                                                                       service_center->info(ref, sptr);
-                                                                       if (sptr)
-                                                                       {
-                                                                               std::string name;
-                                                                               sptr->getName(ref, name);
-
-                                                                               if (must_get_service_name == 1)
-                                                                               {
-                                                                                       size_t pos;
-                                                                                       // filter short name brakets
-                                                                                       while((pos = name.find("\xc2\x86")) != std::string::npos)
-                                                                                               name.erase(pos,2);
-                                                                                       while((pos = name.find("\xc2\x87")) != std::string::npos)
-                                                                                               name.erase(pos,2);
-                                                                               }
-                                                                               else
-                                                                                       name = buildShortName(name);
+                                                                       std::string name;
+                                                                       sptr->getName(ref, name);
 
-                                                                               if (name.length())
-                                                                                       service_name = PyString_FromString(name.c_str());
+                                                                       if (must_get_service_name == 1)
+                                                                       {
+                                                                               size_t pos;
+                                                                               // filter short name brakets
+                                                                               while((pos = name.find("\xc2\x86")) != std::string::npos)
+                                                                                       name.erase(pos,2);
+                                                                               while((pos = name.find("\xc2\x87")) != std::string::npos)
+                                                                                       name.erase(pos,2);
                                                                        }
+                                                                       else
+                                                                               name = buildShortName(name);
+
+                                                                       if (name.length())
+                                                                               service_name = PyString_FromString(name.c_str());
                                                                }
-                                                               if (!service_name)
-                                                                       service_name = PyString_FromString("<n/a>");
                                                        }
+                                                       if (!service_name)
+                                                               service_name = PyString_FromString("<n/a>");
                                                }
                                        // create servicereference string
-                                               if (!service_reference && strchr(argstring,'R'))
+                                               if (must_get_service_reference && !service_reference)
                                                        service_reference = PyString_FromString(ref.toString().c_str());
                                        // create list
                                                if (!ret)
@@ -2919,7 +2937,7 @@ void eEPGCache::channel_data::storeTitle(std::map<__u32, mhw_title_t>::iterator
 
 void eEPGCache::channel_data::startTimeout(int msec)
 {
-       m_MHWTimeoutTimer.start(msec,true);
+       m_MHWTimeoutTimer->start(msec,true);
        m_MHWTimeoutet=false;
 }