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 )
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)
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);
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;
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() )
{
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();
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();
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);
}
}
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) )
{
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();
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();
m_ScheduleOtherReader->stop();
m_ScheduleOtherConn=0;
}
+ if (isRunning & VIASAT)
+ {
+ isRunning &= ~VIASAT;
+ m_ViasatReader->stop();
+ m_ViasatConn=0;
+ }
#ifdef ENABLE_MHW_EPG
if (isRunning & MHW)
{
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;
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;
m_ScheduleOtherConn=0;
eDebugNoNewLine("schedule other");
break;
+ case VIASAT:
+ m_ViasatConn=0;
+ eDebugNoNewLine("viasat");
+ break;
default: eDebugNoNewLine("unknown");break;
}
eDebug(" finished(%ld)", ::time(0));
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])
{
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
int title_len = data[5];
if ( querytype == 1 )
{
- if (title_len != textlen)
- continue;
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+offs, str, title_len) )
}
}
}
- 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;
void eEPGCache::channel_data::timeMHW2DVB( u_char day, u_char hours, u_char minutes, u_char *return_time)
// For date plus time of day
{
+ char tz_saved[1024];
// Remove offset in mhw time.
__u8 local_hours = hours;
if ( hours >= 16 )
time_t dt = ::time(0);
char *old_tz = getenv( "TZ" );
+ if (old_tz)
+ strcpy(tz_saved, old_tz);
putenv("TZ=CET-1CEST,M3.5.0/2,M10.5.0/3");
tzset();
if ( old_tz == NULL )
unsetenv( "TZ" );
else
- putenv( old_tz );
+ setenv("TZ", tz_saved, 1);
tzset();
// Calculate MJD according to annex in ETSI EN 300 468
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);
}
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);
}