add missing semicolon after ASSERT()
[enigma2.git] / lib / dvb / epgcache.cpp
index dbb695bd97c0cbc1ee1bab65f6a44f79c906a4ac..4ea47963c0d939d606ac75a1bd270a24504c3a81 100644 (file)
@@ -303,6 +303,13 @@ void eEPGCache::DVBChannelRunning(iDVBChannel *chan)
                                        eDebug("[eEPGCache] couldnt initialize schedule other reader!!");
                                        return;
                                }
+
+                               res = demux->createSectionReader( this, data.m_ViasatReader );
+                               if ( res )
+                               {
+                                       eDebug("[eEPGCache] couldnt initialize viasat reader!!");
+                                       return;
+                               }
 #ifdef ENABLE_PRIVATE_EPG
                                res = demux->createSectionReader( this, data.m_PrivateReader );
                                if ( res )
@@ -472,7 +479,12 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel)
        int eit_event_size;
        int duration;
 
-       time_t TM = parseDVBtime( eit_event->start_time_1, eit_event->start_time_2,     eit_event->start_time_3, eit_event->start_time_4, eit_event->start_time_5);
+       time_t TM = parseDVBtime(
+                       eit_event->start_time_1,
+                       eit_event->start_time_2,
+                       eit_event->start_time_3,
+                       eit_event->start_time_4,
+                       eit_event->start_time_5);
        time_t now = ::time(0);
 
        if ( TM != 3599 && TM > -1)
@@ -487,6 +499,7 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel)
 
        while (ptr<len)
        {
+               __u16 event_hash;
                eit_event_size = HILO(eit_event->descriptors_loop_length)+EIT_LOOP_SIZE;
 
                duration = fromBCD(eit_event->duration_1)*3600+fromBCD(eit_event->duration_2)*60+fromBCD(eit_event->duration_3);
@@ -495,7 +508,8 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel)
                        eit_event->start_time_2,
                        eit_event->start_time_3,
                        eit_event->start_time_4,
-                       eit_event->start_time_5);
+                       eit_event->start_time_5,
+                       &event_hash);
 
                if ( TM == 3599 )
                        goto next;
@@ -506,16 +520,24 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel)
                if ( now <= (TM+duration) || TM == 3599 /*NVOD Service*/ )  // old events should not be cached
                {
                        __u16 event_id = HILO(eit_event->event_id);
-//                     eDebug("event_id is %d sid is %04x", event_id, service.sid);
-
                        eventData *evt = 0;
                        int ev_erase_count = 0;
                        int tm_erase_count = 0;
 
+                       if (event_id == 0) {
+                               // hack for some polsat services on 13.0E..... but this also replaces other valid event_ids with value 0..
+                               // but we dont care about it...
+                               event_id = event_hash;
+                               eit_event->event_id_hi = event_hash >> 8;
+                               eit_event->event_id_lo = event_hash & 0xFF;
+                       }
+
                        // search in eventmap
                        eventMap::iterator ev_it =
                                servicemap.first.find(event_id);
 
+//                     eDebug("event_id is %d sid is %04x", event_id, service.sid);
+
                        // entry with this event_id is already exist ?
                        if ( ev_it != servicemap.first.end() )
                        {
@@ -1115,7 +1137,7 @@ bool eEPGCache::channel_data::finishEPG()
                eDebug("[EPGC] stop caching events(%ld)", ::time(0));
                zapTimer->start(UPDATE_INTERVAL, 1);
                eDebug("[EPGC] next update in %i min", UPDATE_INTERVAL / 60000);
-               for (int i=0; i < 3; ++i)
+               for (unsigned int i=0; i < sizeof(seenSections)/sizeof(tidMap); ++i)
                {
                        seenSections[i].clear();
                        calcedSections[i].clear();
@@ -1135,7 +1157,7 @@ void eEPGCache::channel_data::startEPG()
        eDebug("[EPGC] start caching events(%ld)", ::time(0));
        state=0;
        haveData=0;
-       for (int i=0; i < 3; ++i)
+       for (unsigned int i=0; i < sizeof(seenSections)/sizeof(tidMap); ++i)
        {
                seenSections[i].clear();
                calcedSections[i].clear();
@@ -1186,6 +1208,14 @@ void eEPGCache::channel_data::startEPG()
        m_ScheduleOtherReader->start(mask);
        isRunning |= SCHEDULE_OTHER;
 
+       mask.pid = 0x39;
+
+       mask.data[0] = 0x40;
+       mask.mask[0] = 0x40;
+       m_ViasatReader->connectRead(slot(*this, &eEPGCache::channel_data::readDataViasat), m_ViasatConn);
+       m_ViasatReader->start(mask);
+       isRunning |= VIASAT;
+
        abortTimer->start(7000,true);
 }
 
@@ -1209,11 +1239,18 @@ void eEPGCache::channel_data::abortNonAvail()
                }
                if ( !(haveData&SCHEDULE_OTHER) && (isRunning&SCHEDULE_OTHER) )
                {
-                       eDebug("[EPGC] abort non avail schedule_other reading");
+                       eDebug("[EPGC] abort non avail schedule other reading");
                        isRunning &= ~SCHEDULE_OTHER;
                        m_ScheduleOtherReader->stop();
                        m_ScheduleOtherConn=0;
                }
+               if ( !(haveData&VIASAT) && (isRunning&VIASAT) )
+               {
+                       eDebug("[EPGC] abort non avail viasat reading");
+                       isRunning &= ~VIASAT;
+                       m_ViasatReader->stop();
+                       m_ViasatConn=0;
+               }
 #ifdef ENABLE_MHW_EPG
                if ( !(haveData&MHW) && (isRunning&MHW) )
                {
@@ -1225,12 +1262,14 @@ void eEPGCache::channel_data::abortNonAvail()
                        m_MHWConn2=0;
                }
 #endif
-               if ( isRunning )
+               if ( isRunning & VIASAT )
+                       abortTimer->start(300000, true);
+               else if ( isRunning )
                        abortTimer->start(90000, true);
                else
                {
                        ++state;
-                       for (int i=0; i < 3; ++i)
+                       for (unsigned int i=0; i < sizeof(seenSections)/sizeof(tidMap); ++i)
                        {
                                seenSections[i].clear();
                                calcedSections[i].clear();
@@ -1259,7 +1298,7 @@ void eEPGCache::channel_data::startChannel()
 
 void eEPGCache::channel_data::abortEPG()
 {
-       for (int i=0; i < 3; ++i)
+       for (unsigned int i=0; i < sizeof(seenSections)/sizeof(tidMap); ++i)
        {
                seenSections[i].clear();
                calcedSections[i].clear();
@@ -1287,6 +1326,12 @@ void eEPGCache::channel_data::abortEPG()
                        m_ScheduleOtherReader->stop();
                        m_ScheduleOtherConn=0;
                }
+               if (isRunning & VIASAT)
+               {
+                       isRunning &= ~VIASAT;
+                       m_ViasatReader->stop();
+                       m_ViasatConn=0;
+               }
 #ifdef ENABLE_MHW_EPG
                if (isRunning & MHW)
                {
@@ -1307,6 +1352,15 @@ void eEPGCache::channel_data::abortEPG()
        pthread_mutex_unlock(&channel_active);
 }
 
+
+void eEPGCache::channel_data::readDataViasat( const __u8 *data)
+{
+       __u8 *d=0;
+       memcpy(&d, &data, sizeof(__u8*));
+       d[0] |= 0x80;
+       readData(data);
+}
+
 void eEPGCache::channel_data::readData( const __u8 *data)
 {
        int source;
@@ -1329,6 +1383,12 @@ void eEPGCache::channel_data::readData( const __u8 *data)
                        source=SCHEDULE_OTHER;
                        map=2;
                        break;
+               case 0xD0 ... 0xDF:
+               case 0xE0 ... 0xEF:
+                       reader=m_ViasatReader;
+                       source=VIASAT;
+                       map=3;
+                       break;
                default:
                        eDebug("[EPGC] unknown table_id !!!");
                        return;
@@ -1352,6 +1412,10 @@ void eEPGCache::channel_data::readData( const __u8 *data)
                                m_ScheduleOtherConn=0;
                                eDebugNoNewLine("schedule other");
                                break;
+                       case VIASAT:
+                               m_ViasatConn=0;
+                               eDebugNoNewLine("viasat");
+                               break;
                        default: eDebugNoNewLine("unknown");break;
                }
                eDebug(" finished(%ld)", ::time(0));
@@ -2047,6 +2111,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))
        {
@@ -2056,7 +2122,11 @@ PyObject *eEPGCache::search(ePyObject arg)
                        ePyObject obj = PyTuple_GET_ITEM(arg,0);
                        if (PyString_Check(obj))
                        {
+#if PY_VERSION_HEX < 0x02060000
                                argcount = PyString_GET_SIZE(obj);
+#else
+                               argcount = PyString_Size(obj);
+#endif
                                argstring = PyString_AS_STRING(obj);
                                for (int i=0; i < argcount; ++i)
                                        switch(argstring[i])
@@ -2065,6 +2135,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;
                                        }
@@ -2144,7 +2224,11 @@ PyObject *eEPGCache::search(ePyObject arg)
                                {
                                        int casetype = PyLong_AsLong(PyTuple_GET_ITEM(arg, 4));
                                        const char *str = PyString_AS_STRING(obj);
+#if PY_VERSION_HEX < 0x02060000
                                        int textlen = PyString_GET_SIZE(obj);
+#else
+                                       int textlen = PyString_Size(obj);
+#endif
                                        if (querytype == 1)
                                                eDebug("lookup for events with '%s' as title(%s)", str, casetype?"ignore case":"case sensitive");
                                        else
@@ -2159,22 +2243,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;
                                                                }
@@ -2303,44 +2397,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);
+                                                                       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);
-
-                                                                               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)
@@ -2578,7 +2668,7 @@ void eEPGCache::privateSectionRead(const uniqueEPGKey &current_service, const __
                        }
                }
        }
-       ASSERT(pdescr <= &descriptors[65])
+       ASSERT(pdescr <= &descriptors[65]);
        __u8 event[4098];
        eit_event_struct *ev_struct = (eit_event_struct*) event;
        ev_struct->running_status = 0;
@@ -2957,7 +3047,7 @@ void eEPGCache::channel_data::readMHWData(const __u8 *data)
 
        if ( state > 1 || // aborted
                // have si data.. so we dont read mhw data
-               (haveData & (SCHEDULE|SCHEDULE_OTHER)) )
+               (haveData & (SCHEDULE|SCHEDULE_OTHER|VIASAT)) )
        {
                eDebug("[EPGC] mhw aborted %d", state);
        }
@@ -3123,7 +3213,7 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data)
 
        if ( state > 1 || // aborted
                // have si data.. so we dont read mhw data
-               (haveData & (eEPGCache::SCHEDULE|eEPGCache::SCHEDULE_OTHER)) )
+               (haveData & (SCHEDULE|SCHEDULE_OTHER|VIASAT)) )
        {
                eDebug("[EPGC] mhw2 aborted %d", state);
        }