}
}
-void eEPGCache::FixOverlapping(std::pair<eventMap,timeMap> &servicemap, time_t TM, int duration, const timeMap::iterator &tm_it, const uniqueEPGKey &service)
+bool eEPGCache::FixOverlapping(std::pair<eventMap,timeMap> &servicemap, time_t TM, int duration, const timeMap::iterator &tm_it, const uniqueEPGKey &service)
{
+ bool ret = false;
timeMap::iterator tmp = tm_it;
while ((tmp->first+tmp->second->getDuration()-300) > TM)
{
}
else
servicemap.second.erase(tmp--);
+ ret = true;
}
else
{
#endif
delete tmp->second;
servicemap.second.erase(tmp++);
+ ret = true;
}
else
++tmp;
if (tmp == servicemap.second.end())
break;
}
+ return ret;
}
void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel)
eventData *tmp = ev_it->second;
ev_it->second = tm_it_tmp->second =
new eventData(eit_event, eit_event_size, source);
- FixOverlapping(servicemap, TM, duration, tm_it_tmp, service);
+ if (FixOverlapping(servicemap, TM, duration, tm_it_tmp, service))
+ {
+ prevEventIt = servicemap.first.end();
+ prevTimeIt = servicemap.second.end();
+ }
delete tmp;
goto next;
}
tm_it=prevTimeIt=servicemap.second.insert( prevTimeIt, std::pair<const time_t, eventData*>( TM, evt ) );
}
- FixOverlapping(servicemap, TM, duration, tm_it, service);
-
#ifdef EPG_DEBUG
if ( consistencyCheck )
{
ev_it->first, event_id );
}
#endif
+ if (FixOverlapping(servicemap, TM, duration, tm_it, service))
+ {
+ prevEventIt = servicemap.first.end();
+ prevTimeIt = servicemap.second.end();
+ }
}
next:
#ifdef EPG_DEBUG
RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin, int minutes)
{
const eServiceReferenceDVB &ref = (const eServiceReferenceDVB&)handleGroup(service);
+ if (begin == -1)
+ begin = eDVBLocalTimeHandler::getInstance()->nowTime();
Lock();
eventCache::iterator It = eventDB.find(ref);
if ( It != eventDB.end() && It->second.second.size() )
{
- if ( begin != -1 )
+ m_timemap_cursor = It->second.second.lower_bound(begin);
+ if ( m_timemap_cursor != It->second.second.end() )
{
- m_timemap_cursor = It->second.second.lower_bound(begin);
- if ( m_timemap_cursor != It->second.second.end() )
+ if ( m_timemap_cursor->first != begin )
{
- if ( m_timemap_cursor->first != begin )
+ timeMap::iterator x = m_timemap_cursor;
+ --x;
+ if ( x != It->second.second.end() )
{
- timeMap::iterator x = m_timemap_cursor;
- --x;
- if ( x != It->second.second.end() )
- {
- time_t start_time = x->first;
- if ( begin > start_time && begin < (start_time+x->second->getDuration()))
- m_timemap_cursor = x;
- }
+ time_t start_time = x->first;
+ if ( begin > start_time && begin < (start_time+x->second->getDuration()))
+ m_timemap_cursor = x;
}
}
}
- else
- m_timemap_cursor = It->second.second.begin();
- if (minutes != -1 && m_timemap_cursor != It->second.second.end())
- m_timemap_end = It->second.second.upper_bound(m_timemap_cursor->first+minutes*60);
+ if (minutes != -1)
+ m_timemap_end = It->second.second.lower_bound(begin+minutes*60);
else
m_timemap_end = It->second.second.end();
break;
}
}
+
+ if (minutes && stime == -1)
+ stime = eDVBLocalTimeHandler::getInstance()->nowTime();
+
eServiceReference ref(handleGroup(eServiceReference(PyString_AS_STRING(service))));
if (ref.type != eServiceReference::idDVB)
{
}
}
}
+ else
+ handleEvent(0, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs);
Unlock();
}
else
{
if (lookupEventId(ref, evid, ev))
eDebug("event not found !!!!!!!!!!!");
+ else
+ {
+ const eServiceReferenceDVB &dref = (const eServiceReferenceDVB&)ref;
+ ptr.parseFrom(ev, (dref.getTransportStreamID().get()<<16)|dref.getOriginalNetworkID().get());
+ }
}
// create service name
if (!service_name)
int sid = data[ptr++] << 8;
sid |= data[ptr++];
-// WORKAROUND for wrong transmitted epg data (01.08.2006)
+// WORKAROUND for wrong transmitted epg data (01.10.2007)
if ( onid == 0x85 )
{
switch( (tsid << 16) | sid )
case 0x0300f5: sid = 0xdc; break;
case 0x0400d2: sid = 0xe2; tsid = 0x11; break;
case 0x1100d3: sid = 0xe3; break;
+ case 0x0100d4: sid = 0xe4; tsid = 4; break;
}
}
////////////////////////////////////////////