X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/66a23d9e98fb4582c99672500f5e9b165104eb93..fdad4815a5c267a5f20f10604617b833d85ec32e:/lib/dvb/epgcache.cpp diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index 49b804b6..6c98011b 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -12,6 +12,7 @@ #include // for statfs // #include #include +#include #include #include #include @@ -45,7 +46,6 @@ const eServiceReference &handleGroup(const eServiceReference &ref) return ref; } - eventData::eventData(const eit_event_struct* e, int size, int type) :ByteSize(size&0xFF), type(type&0xFF) { @@ -226,7 +226,11 @@ eEPGCache::eEPGCache() if (!res_mgr) eDebug("[eEPGCache] no resource manager !!!!!!!"); else + { res_mgr->connectChannelAdded(slot(*this,&eEPGCache::DVBChannelAdded), m_chanAddedConn); + if (eDVBLocalTimeHandler::getInstance()->ready()) + timeUpdated(); + } instance=this; } @@ -516,10 +520,11 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel) if ( tm_it_tmp->first == TM ) // just update eventdata { // exempt memory - delete ev_it->second; + 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); + delete tmp; goto next; } else // event has new event begin time @@ -856,10 +861,10 @@ void eEPGCache::thread() void eEPGCache::load() { - singleLock s(cache_lock); FILE *f = fopen("/hdd/epg.dat", "r"); if (f) { + unlink("/hdd/epg.dat"); int size=0; int cnt=0; #if 0 @@ -893,6 +898,7 @@ void eEPGCache::load() fread( text1, 13, 1, f); if ( !strncmp( text1, "ENIGMA_EPG_V7", 13) ) { + singleLock s(cache_lock); fread( &size, sizeof(int), 1, f); while(size--) { @@ -1501,8 +1507,9 @@ RESULT eEPGCache::lookupEventId(const eServiceReference &service, int event_id, RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin, int minutes) { + const eServiceReferenceDVB &ref = (const eServiceReferenceDVB&)handleGroup(service); Lock(); - eventCache::iterator It = eventDB.find(handleGroup(service)); + eventCache::iterator It = eventDB.find(ref); if ( It != eventDB.end() && It->second.second.size() ) { m_timemap_end = minutes != -1 ? It->second.second.upper_bound(begin+minutes*60) : It->second.second.end(); @@ -1526,7 +1533,6 @@ RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin, } else m_timemap_cursor = It->second.second.begin(); - const eServiceReferenceDVB &ref = (const eServiceReferenceDVB&)handleGroup(service); currentQueryTsidOnid = (ref.getTransportStreamID().get()<<16) | ref.getOriginalNetworkID().get(); Unlock(); return 0; @@ -1614,6 +1620,7 @@ void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service tmp = service; inc_refcount = true; break; + case 'n': // short service name case 'N': // service name tmp = service_name; inc_refcount = true; @@ -1673,6 +1680,7 @@ int handleEvent(ePtr &ptr, ePyObject dest_list, char* argstring, // C = Current Time // R = Service Reference // N = Service Name +// n = Short Service Name // 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 @@ -1735,7 +1743,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) PyLong_FromLong(eDVBLocalTimeHandler::getInstance()->nowTime()) : ePyObject(); - bool must_get_service_name = strchr(argstring, 'N') ? true : false; + int must_get_service_name = strchr(argstring, 'N') ? 1 : strchr(argstring, 'n') ? 2 : 0; // create dest list ePyObject dest_list=PyList_New(0); @@ -1823,6 +1831,19 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) { std::string name; sptr->getName(ref, name); + + if (must_get_service_name == 1) + { + unsigned int pos; + // filter short name brakets + while((pos = name.find("\xc2\x86")) != std::string::npos) + name.erase(pos,2); + while((pos = name.find("\xc2\x87")) != std::string::npos) + name.erase(pos,2); + } + else + name = buildShortName(name); + if (name.length()) service_name = PyString_FromString(name.c_str()); } @@ -1915,6 +1936,7 @@ void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData tmp = service_reference; inc_refcount = true; break; + case 'n': // short service name case 'N': // service name tmp = service_name; inc_refcount = true; @@ -1941,6 +1963,7 @@ void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData // E = Event Extended Description // R = Service Reference // N = Service Name +// n = Short Service Name // the second tuple entry is the MAX matches value // the third tuple entry is the type of query // 0 = search for similar broadcastings (SIMILAR_BROADCASTINGS_SEARCH) @@ -2161,8 +2184,6 @@ PyObject *eEPGCache::search(ePyObject arg) return NULL; } - ASSERT(descridx <= 512); - if (descridx > -1) { int maxcount=maxmatches; @@ -2190,11 +2211,11 @@ PyObject *eEPGCache::search(ePyObject arg) if ( evid == eventid) continue; __u8 *data = evit->second->EITdata; - int tmp = evit->second->ByteSize-12; - __u32 *p = (__u32*)(data+12); + int tmp = evit->second->ByteSize-10; + __u32 *p = (__u32*)(data+10); // check if any of our descriptor used by this event int cnt=-1; - while(tmp>0) + while(tmp>3) { __u32 crc32 = *p++; for ( int i=0; i <= descridx; ++i) @@ -2221,24 +2242,41 @@ PyObject *eEPGCache::search(ePyObject arg) eDebug("event not found !!!!!!!!!!!"); } // create service name - if (!service_name && strchr(argstring,'N')) + if (!service_name) { - ePtr sptr; - eServiceCenterPtr service_center; - eServiceCenter::getPrivInstance(service_center); - if (service_center) + int must_get_service_name = strchr(argstring, 'N') ? 1 : strchr(argstring, 'n') ? 2 : 0; + if (must_get_service_name) { - service_center->info(ref, sptr); - if (sptr) + ePtr sptr; + eServiceCenterPtr service_center; + eServiceCenter::getPrivInstance(service_center); + if (service_center) { - std::string name; - sptr->getName(ref, name); - if (name.length()) - service_name = PyString_FromString(name.c_str()); + service_center->info(ref, sptr); + if (sptr) + { + std::string name; + sptr->getName(ref, name); + + if (must_get_service_name == 1) + { + unsigned int pos; + // filter short name brakets + while((pos = name.find("\xc2\x86")) != std::string::npos) + name.erase(pos,2); + while((pos = name.find("\xc2\x87")) != std::string::npos) + name.erase(pos,2); + } + else + name = buildShortName(name); + + if (name.length()) + service_name = PyString_FromString(name.c_str()); + } } + if (!service_name) + service_name = PyString_FromString(""); } - if (!service_name) - service_name = PyString_FromString(""); } // create servicereference string if (!service_reference && strchr(argstring,'R'))