void eEPGCache::timeUpdated()
{
- if ( !thread_running() )
+ if (!sync())
{
eDebug("[EPGC] time updated.. start EPG Mainloop");
run();
- }
- else
+ } else
messages.send(Message(Message::timeChanged));
}
void eEPGCache::thread()
{
+ hasStarted();
nice(4);
load();
cleanLoop();
{
if (!isRunning) // epg ready
{
- eDebug("[EPGC] stop caching events(%d)", time(0)+eDVBLocalTimeHandler::getInstance()->difference());
+ eDebug("[EPGC] stop caching events(%ld)", time(0)+eDVBLocalTimeHandler::getInstance()->difference());
zapTimer.start(UPDATE_INTERVAL, 1);
eDebug("[EPGC] next update in %i min", UPDATE_INTERVAL / 60000);
for (int i=0; i < 3; ++i)
void eEPGCache::channel_data::startEPG()
{
- eDebug("[EPGC] start caching events(%d)", eDVBLocalTimeHandler::getInstance()->difference()+time(0));
+ eDebug("[EPGC] start caching events(%ld)", eDVBLocalTimeHandler::getInstance()->difference()+time(0));
state=0;
haveData=0;
can_delete=0;
break;
default: eDebugNoNewLine("unknown");break;
}
- eDebug(" finished(%d)", time(0)+eDVBLocalTimeHandler::getInstance()->difference());
+ eDebug(" finished(%ld)", time(0)+eDVBLocalTimeHandler::getInstance()->difference());
if ( reader )
reader->stop();
isRunning &= ~source;
PyObject *item=PyList_GET_ITEM(list, listIt++); // borrowed reference!
if (PyTuple_Check(item))
{
+ bool service_changed=false;
int type=0;
long event_id=-1;
time_t stime=-1;
eDebug("service reference for epg query is not valid");
continue;
}
+
+ // redirect subservice querys to parent service
+ eServiceReferenceDVB &dvb_ref = (eServiceReferenceDVB&)ref;
+ if (dvb_ref.getParentTransportStreamID().get()) // linkage subservice
+ {
+ eServiceCenterPtr service_center;
+ if (!eServiceCenter::getPrivInstance(service_center))
+ {
+ dvb_ref.setTransportStreamID( dvb_ref.getParentTransportStreamID() );
+ dvb_ref.setServiceID( dvb_ref.getParentServiceID() );
+ dvb_ref.setParentTransportStreamID(eTransportStreamID(0));
+ dvb_ref.setParentServiceID(eServiceID(0));
+ dvb_ref.name="";
+ service = PyString_FromString(dvb_ref.toString().c_str());
+ service_changed = true;
+ }
+ }
+
PyObject *service_name=NULL;
if (must_get_service_name)
{
if (ret)
return ret;
}
+ if (service_changed)
+ Py_DECREF(service);
if (service_name)
Py_DECREF(service_name);
}
// 1 = search events with exactly title name (EXAKT_TITLE_SEARCH)
// 2 = search events with text in title name (PARTIAL_TITLE_SEARCH)
// when type is 0 (SIMILAR_BROADCASTINGS_SEARCH)
-// the fourth is the servicereference tring
+// the fourth is the servicereference string
// the fifth is the eventid
// when type is 1 or 2 (EXAKT_TITLE_SEARCH or PARTIAL_TITLE_SEARCH)
// the fourth is the search text
__u32 descr[512];
int eventid = -1;
const char *argstring=0;
+ char *refstr=0;
int argcount=0;
int querytype=-1;
bool needServiceEvent=false;
PyObject *obj = PyTuple_GET_ITEM(arg, 3);
if (PyString_Check(obj))
{
- const char *refstr = PyString_AS_STRING(obj);
+ refstr = PyString_AS_STRING(obj);
eServiceReferenceDVB ref(refstr);
if (ref.valid())
{
if (descridx > -1)
{
int maxcount=maxmatches;
+ eServiceReferenceDVB ref(refstr?refstr:"");
+ // ref is only valid in SIMILAR_BROADCASTING_SEARCH
+ // in this case we start searching with the base service
+ bool first = ref.valid() ? true : false;
singleLock s(cache_lock);
- // check all services
- for( eventCache::iterator cit(eventDB.begin()); cit != eventDB.end() && maxcount; ++cit)
+ eventCache::iterator cit(ref.valid() ? eventDB.find(ref) : eventDB.begin());
+ while(cit != eventDB.end() && maxcount)
{
+ if ( ref.valid() && !first && cit->first == ref )
+ {
+ // do not scan base service twice ( only in SIMILAR BROADCASTING SEARCH )
+ ++cit;
+ continue;
+ }
PyObject *service_name=0;
PyObject *service_reference=0;
- eventMap &evmap = cit->second.first;
+ timeMap &evmap = cit->second.second;
// check all events
- for (eventMap::iterator evit(evmap.begin()); evit != evmap.end() && maxcount; ++evit)
+ for (timeMap::iterator evit(evmap.begin()); evit != evmap.end() && maxcount; ++evit)
{
+ if (evit->second->getEventID() == eventid)
+ continue;
__u8 *data = evit->second->EITdata;
int tmp = evit->second->ByteSize-12;
__u32 *p = (__u32*)(data+12);
// check if any of our descriptor used by this event
- if (evit->first == eventid )
- continue;
int cnt=-1;
while(tmp>0)
{
Py_DECREF(service_name);
if (service_reference)
Py_DECREF(service_reference);
+ if (first)
+ {
+ // now start at first service in epgcache database ( only in SIMILAR BROADCASTING SEARCH )
+ first=false;
+ cit=eventDB.begin();
+ }
+ else
+ ++cit;
}
}