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.upper_bound(begin+minutes*60);
else
m_timemap_end = It->second.second.end();
return -1;
}
-void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service, ePtr<eServiceEvent> &ptr, ePyObject nowTime, ePyObject service_name )
+void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service, eServiceEvent *ptr, ePyObject nowTime, ePyObject service_name )
{
ePyObject tmp;
int pos=0;
}
}
-int handleEvent(ePtr<eServiceEvent> &ptr, ePyObject dest_list, char* argstring, int argcount, ePyObject service, ePyObject nowTime, ePyObject service_name, ePyObject convertFunc, ePyObject convertFuncArgs)
+int handleEvent(eServiceEvent *ptr, ePyObject dest_list, char* argstring, int argcount, ePyObject service, ePyObject nowTime, ePyObject service_name, ePyObject convertFunc, ePyObject convertFuncArgs)
{
if (convertFunc)
{
break;
}
}
+
+ if (minutes && stime == -1)
+ stime = eDVBLocalTimeHandler::getInstance()->nowTime();
+
eServiceReference ref(handleGroup(eServiceReference(PyString_AS_STRING(service))));
if (ref.type != eServiceReference::idDVB)
{
Lock();
if (!startTimeQuery(ref, stime, minutes))
{
- ePtr<eServiceEvent> ptr;
- while (!getNextTimeEntry(ptr))
+ while ( m_timemap_cursor != m_timemap_end )
{
- if (handleEvent(ptr, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs))
+ Event ev((uint8_t*)m_timemap_cursor++->second->get());
+ eServiceEvent evt;
+ evt.parseFrom(&ev, currentQueryTsidOnid);
+ if (handleEvent(&evt, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs))
{
Unlock();
return 0; // error
}
}
}
+ else
+ handleEvent(0, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs);
Unlock();
}
else
{
- ePtr<eServiceEvent> ptr;
+ eServiceEvent evt;
+ Event *ev=0;
if (stime)
{
if (type == 2)
- lookupEventId(ref, event_id, ptr);
+ lookupEventId(ref, event_id, ev);
else
- lookupEventTime(ref, stime, ptr, type);
+ lookupEventTime(ref, stime, ev, type);
+ if (ev)
+ {
+ const eServiceReferenceDVB &dref = (const eServiceReferenceDVB&)ref;
+ evt.parseFrom(ev, (dref.getTransportStreamID().get()<<16)|dref.getOriginalNetworkID().get());
+ }
}
- if (handleEvent(ptr, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs))
+ if (handleEvent(ev ? &evt : 0, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs))
return 0; // error
}
if (service_changed)
return dest_list;
}
-void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData *evData, ePtr<eServiceEvent> &ptr, ePyObject service_name, ePyObject service_reference)
+void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData *evData, eServiceEvent *ptr, ePyObject service_name, ePyObject service_reference)
{
ePyObject tmp;
int pos=0;
if (ref.valid())
{
// create servive event
- ePtr<eServiceEvent> ptr;
+ eServiceEvent ptr;
+ Event *ev=0;
if (needServiceEvent)
{
- lookupEventId(ref, evid, ptr);
- if (!ptr)
+ 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)
// create tuple
ePyObject tuple = PyTuple_New(argcount);
// fill tuple
- fillTuple2(tuple, argstring, argcount, evit->second, ptr, service_name, service_reference);
+ fillTuple2(tuple, argstring, argcount, evit->second, ev ? &ptr : 0, service_name, service_reference);
PyList_Append(ret, tuple);
Py_DECREF(tuple);
--maxcount;