X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/69d3f11e4bf566bc12981447c2b8cb999177b007..317c6217b933893659bbf2dc80c74eac357e0bd2:/lib/dvb/epgcache.cpp diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index 247b0c05..fd09c5ed 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -460,7 +460,14 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel) if ( data[ptr-1] < 0x40 ) --ptr; - uniqueEPGKey service( HILO(eit->service_id), HILO(eit->original_network_id), HILO(eit->transport_stream_id) ); + // Cablecom HACK .. tsid / onid in eit data are incorrect.. so we use + // it from running service (just for current transport stream eit data) + bool use_eit_chid = data[0] == 0x4F || data[0] > 0x5F; + eDVBChannelID chid = channel->channel->getChannelID(); + uniqueEPGKey service( HILO(eit->service_id), + use_eit_chid ? HILO(eit->original_network_id) : chid.original_network_id.get(), + use_eit_chid ? HILO(eit->transport_stream_id) : chid.transport_stream_id.get() ); + eit_event_struct* eit_event = (eit_event_struct*) (data+ptr); int eit_event_size; int duration; @@ -1518,10 +1525,10 @@ RESULT eEPGCache::lookupEventId(const eServiceReference &service, int event_id, RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin, int minutes) { + singleLock s(cache_lock); 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() ) { @@ -1547,10 +1554,8 @@ RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin, m_timemap_end = It->second.second.end(); currentQueryTsidOnid = (ref.getTransportStreamID().get()<<16) | ref.getOriginalNetworkID().get(); - Unlock(); - return 0; + return m_timemap_cursor == m_timemap_end ? -1 : 0; } - Unlock(); return -1; } @@ -1598,11 +1603,12 @@ RESULT eEPGCache::getNextTimeEntry(ePtr &result) void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service, eServiceEvent *ptr, ePyObject nowTime, ePyObject service_name ) { ePyObject tmp; - int pos=0; - while(pos < argcount) + int spos=0, tpos=0; + char c; + while(spos < argcount) { bool inc_refcount=false; - switch(argstring[pos]) + switch((c=argstring[spos++])) { case '0': // PyLong 0 tmp = PyLong_FromLong(0); @@ -1637,6 +1643,12 @@ void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service case 'N': // service name tmp = service_name; inc_refcount = true; + break; + case 'X': + ++argcount; + continue; + default: // ignore unknown + eDebug("fillTuple unknown '%c'... insert 'None' in result", c); } if (!tmp) { @@ -1645,7 +1657,7 @@ void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service } if (inc_refcount) Py_INCREF(tmp); - PyTuple_SET_ITEM(tuple, pos++, tmp); + PyTuple_SET_ITEM(tuple, tpos++, tmp); } } @@ -1694,6 +1706,9 @@ int handleEvent(eServiceEvent *ptr, ePyObject dest_list, char* argstring, int ar // R = Service Reference // N = Service Name // n = Short Service Name +// X = Return a minimum of one tuple per service in the result list... even when no event was found. +// The returned tuple is filled with all available infos... non avail is filled as None +// The position and existence of 'X' in the format string has no influence on the result tuple... its completely ignored.. // then for each service follows a tuple // first tuple entry is the servicereference (as string... use the ref.toString() function) // the second is the type of query @@ -1740,6 +1755,11 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) argcount = strlen(argstring); // eDebug("have %d args('%s')", argcount, argstring); } + + bool forceReturnOne = strchr(argstring, 'X') ? true : false; + if (forceReturnOne) + --argcount; + if (convertFunc) { if (!PyCallable_Check(convertFunc)) @@ -1870,7 +1890,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) } if (minutes) { - Lock(); + singleLock s(cache_lock); if (!startTimeQuery(ref, stime, minutes)) { while ( m_timemap_cursor != m_timemap_end ) @@ -1879,33 +1899,36 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) 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 if (forceReturnOne && handleEvent(0, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs)) + return 0; // error } else { eServiceEvent evt; - Event *ev=0; + const eventData *ev_data=0; if (stime) { + singleLock s(cache_lock); if (type == 2) - lookupEventId(ref, event_id, ev); + lookupEventId(ref, event_id, ev_data); else - lookupEventTime(ref, stime, ev, type); - if (ev) + lookupEventTime(ref, stime, ev_data, type); + if (ev_data) { const eServiceReferenceDVB &dref = (const eServiceReferenceDVB&)ref; - evt.parseFrom(ev, (dref.getTransportStreamID().get()<<16)|dref.getOriginalNetworkID().get()); + Event ev((uint8_t*)ev_data->get()); + evt.parseFrom(&ev, (dref.getTransportStreamID().get()<<16)|dref.getOriginalNetworkID().get()); } } - if (handleEvent(ev ? &evt : 0, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs)) + if (ev_data) + { + if (handleEvent(&evt, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs)) + return 0; // error + } + else if (forceReturnOne && handleEvent(0, dest_list, argstring, argcount, service, nowTime, service_name, convertFunc, convertFuncArgs)) return 0; // error } if (service_changed) @@ -1968,6 +1991,8 @@ void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData tmp = service_name; inc_refcount = true; break; + default: // ignore unknown + eDebug("fillTuple2 unknown '%c'... insert None in Result", argstring[pos]); } if (!tmp) { @@ -2095,16 +2120,14 @@ PyObject *eEPGCache::search(ePyObject arg) } else { - PyErr_SetString(PyExc_StandardError, - "type error"); + PyErr_SetString(PyExc_StandardError, "type error"); eDebug("tuple arg 4 is not a valid service reference string"); return NULL; } } else { - PyErr_SetString(PyExc_StandardError, - "type error"); + PyErr_SetString(PyExc_StandardError, "type error"); eDebug("tuple arg 4 is not a string"); return NULL; } @@ -2262,15 +2285,16 @@ PyObject *eEPGCache::search(ePyObject arg) { // create servive event eServiceEvent ptr; - Event *ev=0; + const eventData *ev_data=0; if (needServiceEvent) { - if (lookupEventId(ref, evid, ev)) + if (lookupEventId(ref, evid, ev_data)) eDebug("event not found !!!!!!!!!!!"); else { const eServiceReferenceDVB &dref = (const eServiceReferenceDVB&)ref; - ptr.parseFrom(ev, (dref.getTransportStreamID().get()<<16)|dref.getOriginalNetworkID().get()); + Event ev((uint8_t*)ev_data->get()); + ptr.parseFrom(&ev, (dref.getTransportStreamID().get()<<16)|dref.getOriginalNetworkID().get()); } } // create service name @@ -2319,7 +2343,7 @@ PyObject *eEPGCache::search(ePyObject arg) // create tuple ePyObject tuple = PyTuple_New(argcount); // fill tuple - fillTuple2(tuple, argstring, argcount, evit->second, ev ? &ptr : 0, service_name, service_reference); + fillTuple2(tuple, argstring, argcount, evit->second, ev_data ? &ptr : 0, service_name, service_reference); PyList_Append(ret, tuple); Py_DECREF(tuple); --maxcount;