X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/317c6217b933893659bbf2dc80c74eac357e0bd2..c2369e09f42741f4b1ca200b4fc31f39329a2fa8:/lib/dvb/epgcache.cpp diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index fd09c5ed..dbb695bd 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -213,13 +213,13 @@ pthread_mutex_t eEPGCache::channel_map_lock= DEFINE_REF(eEPGCache) eEPGCache::eEPGCache() - :messages(this,1), cleanTimer(this)//, paused(0) + :messages(this,1), cleanTimer(eTimer::create(this))//, paused(0) { eDebug("[EPGC] Initialized EPGCache"); CONNECT(messages.recv_msg, eEPGCache::gotMessage); CONNECT(eDVBLocalTimeHandler::getInstance()->m_timeUpdated, eEPGCache::timeUpdated); - CONNECT(cleanTimer.timeout, eEPGCache::cleanLoop); + CONNECT(cleanTimer->timeout, eEPGCache::cleanLoop); ePtr res_mgr; eDVBResourceManager::getInstance(res_mgr); @@ -461,19 +461,19 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel) --ptr; // 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; + // it from running channel (just for current transport stream eit data) + bool use_transponder_chid = source == SCHEDULE || (source == NOWNEXT && data[0] == 0x4E); 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() ); + use_transponder_chid ? chid.original_network_id.get() : HILO(eit->original_network_id), + use_transponder_chid ? chid.transport_stream_id.get() : HILO(eit->transport_stream_id)); eit_event_struct* eit_event = (eit_event_struct*) (data+ptr); int eit_event_size; int duration; time_t TM = parseDVBtime( eit_event->start_time_1, eit_event->start_time_2, eit_event->start_time_3, eit_event->start_time_4, eit_event->start_time_5); - time_t now = eDVBLocalTimeHandler::getInstance()->nowTime(); + time_t now = ::time(0); if ( TM != 3599 && TM > -1) channel->haveData |= source; @@ -725,7 +725,7 @@ void eEPGCache::cleanLoop() { eDebug("[EPGC] start cleanloop"); - time_t now = eDVBLocalTimeHandler::getInstance()->nowTime(); + time_t now = ::time(0); for (eventCache::iterator DBIt = eventDB.begin(); DBIt != eventDB.end(); DBIt++) { @@ -783,7 +783,7 @@ void eEPGCache::cleanLoop() eDebug("[EPGC] stop cleanloop"); eDebug("[EPGC] %i bytes for cache used", eventData::CacheSize); } - cleanTimer.start(CLEAN_INTERVAL,true); + cleanTimer->start(CLEAN_INTERVAL,true); } eEPGCache::~eEPGCache() @@ -844,10 +844,10 @@ void eEPGCache::gotMessage( const Message &msg ) onid |= 0x80000000; // we use highest bit as private epg indicator chid.original_network_id = onid; updateMap::iterator It = channelLastUpdated.find( chid ); - int update = ( It != channelLastUpdated.end() ? ( UPDATE_INTERVAL - ( (eDVBLocalTimeHandler::getInstance()->nowTime()-It->second) * 1000 ) ) : ZAP_DELAY ); + int update = ( It != channelLastUpdated.end() ? ( UPDATE_INTERVAL - ( (::time(0)-It->second) * 1000 ) ) : ZAP_DELAY ); if (update < ZAP_DELAY) update = ZAP_DELAY; - data->startPrivateTimer.start(update, 1); + data->startPrivateTimer->start(update, 1); if (update >= 60000) eDebug("[EPGC] next private update in %i min", update/60000); else if (update >= 1000) @@ -1018,7 +1018,7 @@ void eEPGCache::save() { unsigned int magic = 0x98765432; fwrite( &magic, sizeof(int), 1, f); - const char *text = "ENIGMA_EPG_V7"; + const char *text = "UNFINISHED_V7"; fwrite( text, 13, 1, f ); int size = eventDB.size(); fwrite( &size, sizeof(int), 1, f ); @@ -1065,6 +1065,11 @@ void eEPGCache::save() } } #endif + // write version string after binary data + // has been written to disk. + fsync(fileno(f)); + fseek(f, sizeof(int), SEEK_SET); + fwrite("ENIGMA_EPG_V7", 13, 1, f); fclose(f); #if 0 unsigned char md5[16]; @@ -1083,22 +1088,22 @@ void eEPGCache::save() eEPGCache::channel_data::channel_data(eEPGCache *ml) :cache(ml) - ,abortTimer(ml), zapTimer(ml), state(0) + ,abortTimer(eTimer::create(ml)), zapTimer(eTimer::create(ml)), state(0) ,isRunning(0), haveData(0) #ifdef ENABLE_PRIVATE_EPG - ,startPrivateTimer(ml) + ,startPrivateTimer(eTimer::create(ml)) #endif #ifdef ENABLE_MHW_EPG - ,m_MHWTimeoutTimer(ml) + ,m_MHWTimeoutTimer(eTimer::create(ml)) #endif { #ifdef ENABLE_MHW_EPG - CONNECT(m_MHWTimeoutTimer.timeout, eEPGCache::channel_data::MHWTimeout); + CONNECT(m_MHWTimeoutTimer->timeout, eEPGCache::channel_data::MHWTimeout); #endif - CONNECT(zapTimer.timeout, eEPGCache::channel_data::startEPG); - CONNECT(abortTimer.timeout, eEPGCache::channel_data::abortNonAvail); + CONNECT(zapTimer->timeout, eEPGCache::channel_data::startEPG); + CONNECT(abortTimer->timeout, eEPGCache::channel_data::abortNonAvail); #ifdef ENABLE_PRIVATE_EPG - CONNECT(startPrivateTimer.timeout, eEPGCache::channel_data::startPrivateReader); + CONNECT(startPrivateTimer->timeout, eEPGCache::channel_data::startPrivateReader); #endif pthread_mutex_init(&channel_active, 0); } @@ -1107,8 +1112,8 @@ bool eEPGCache::channel_data::finishEPG() { if (!isRunning) // epg ready { - eDebug("[EPGC] stop caching events(%ld)", eDVBLocalTimeHandler::getInstance()->nowTime()); - zapTimer.start(UPDATE_INTERVAL, 1); + eDebug("[EPGC] stop caching events(%ld)", ::time(0)); + zapTimer->start(UPDATE_INTERVAL, 1); eDebug("[EPGC] next update in %i min", UPDATE_INTERVAL / 60000); for (int i=0; i < 3; ++i) { @@ -1116,7 +1121,7 @@ bool eEPGCache::channel_data::finishEPG() calcedSections[i].clear(); } singleLock l(cache->cache_lock); - cache->channelLastUpdated[channel->getChannelID()] = eDVBLocalTimeHandler::getInstance()->nowTime(); + cache->channelLastUpdated[channel->getChannelID()] = ::time(0); #ifdef ENABLE_MHW_EPG cleanup(); #endif @@ -1127,7 +1132,7 @@ bool eEPGCache::channel_data::finishEPG() void eEPGCache::channel_data::startEPG() { - eDebug("[EPGC] start caching events(%ld)", eDVBLocalTimeHandler::getInstance()->nowTime()); + eDebug("[EPGC] start caching events(%ld)", ::time(0)); state=0; haveData=0; for (int i=0; i < 3; ++i) @@ -1181,7 +1186,7 @@ void eEPGCache::channel_data::startEPG() m_ScheduleOtherReader->start(mask); isRunning |= SCHEDULE_OTHER; - abortTimer.start(7000,true); + abortTimer->start(7000,true); } void eEPGCache::channel_data::abortNonAvail() @@ -1221,7 +1226,7 @@ void eEPGCache::channel_data::abortNonAvail() } #endif if ( isRunning ) - abortTimer.start(90000, true); + abortTimer->start(90000, true); else { ++state; @@ -1240,12 +1245,12 @@ void eEPGCache::channel_data::startChannel() pthread_mutex_lock(&channel_active); updateMap::iterator It = cache->channelLastUpdated.find( channel->getChannelID() ); - int update = ( It != cache->channelLastUpdated.end() ? ( UPDATE_INTERVAL - ( (eDVBLocalTimeHandler::getInstance()->nowTime()-It->second) * 1000 ) ) : ZAP_DELAY ); + int update = ( It != cache->channelLastUpdated.end() ? ( UPDATE_INTERVAL - ( (::time(0)-It->second) * 1000 ) ) : ZAP_DELAY ); if (update < ZAP_DELAY) update = ZAP_DELAY; - zapTimer.start(update, 1); + zapTimer->start(update, 1); if (update >= 60000) eDebug("[EPGC] next update in %i min", update/60000); else if (update >= 1000) @@ -1259,8 +1264,8 @@ void eEPGCache::channel_data::abortEPG() seenSections[i].clear(); calcedSections[i].clear(); } - abortTimer.stop(); - zapTimer.stop(); + abortTimer->stop(); + zapTimer->stop(); if (isRunning) { eDebug("[EPGC] abort caching events !!"); @@ -1349,7 +1354,7 @@ void eEPGCache::channel_data::readData( const __u8 *data) break; default: eDebugNoNewLine("unknown");break; } - eDebug(" finished(%ld)", eDVBLocalTimeHandler::getInstance()->nowTime()); + eDebug(" finished(%ld)", ::time(0)); if ( reader ) reader->stop(); isRunning &= ~source; @@ -1399,7 +1404,7 @@ RESULT eEPGCache::lookupEventTime(const eServiceReference &service, time_t t, co if ( It != eventDB.end() && !It->second.first.empty() ) // entrys cached ? { if (t==-1) - t = eDVBLocalTimeHandler::getInstance()->nowTime(); + t = ::time(0); timeMap::iterator i = direction <= 0 ? It->second.second.lower_bound(t) : // find > or equal It->second.second.upper_bound(t); // just > if ( i != It->second.second.end() ) @@ -1528,7 +1533,7 @@ RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin, singleLock s(cache_lock); const eServiceReferenceDVB &ref = (const eServiceReferenceDVB&)handleGroup(service); if (begin == -1) - begin = eDVBLocalTimeHandler::getInstance()->nowTime(); + begin = ::time(0); eventCache::iterator It = eventDB.find(ref); if ( It != eventDB.end() && It->second.second.size() ) { @@ -1600,7 +1605,7 @@ RESULT eEPGCache::getNextTimeEntry(ePtr &result) return -1; } -void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service, eServiceEvent *ptr, ePyObject nowTime, ePyObject service_name ) +void fillTuple(ePyObject tuple, const char *argstring, int argcount, ePyObject service, eServiceEvent *ptr, ePyObject nowTime, ePyObject service_name ) { ePyObject tmp; int spos=0, tpos=0; @@ -1661,13 +1666,13 @@ void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service } } -int handleEvent(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, const char* argstring, int argcount, ePyObject service, ePyObject nowTime, ePyObject service_name, ePyObject convertFunc, ePyObject convertFuncArgs) { if (convertFunc) { fillTuple(convertFuncArgs, argstring, argcount, service, ptr, nowTime, service_name); ePyObject result = PyObject_CallObject(convertFunc, convertFuncArgs); - if (result) + if (!result) { if (service_name) Py_DECREF(service_name); @@ -1725,7 +1730,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) { ePyObject convertFuncArgs; int argcount=0; - char *argstring=NULL; + const char *argstring=NULL; if (!PyList_Check(list)) { PyErr_SetString(PyExc_StandardError, @@ -1773,7 +1778,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) } ePyObject nowTime = strchr(argstring, 'C') ? - PyLong_FromLong(eDVBLocalTimeHandler::getInstance()->nowTime()) : + PyLong_FromLong(::time(0)) : ePyObject(); int must_get_service_name = strchr(argstring, 'N') ? 1 : strchr(argstring, 'n') ? 2 : 0; @@ -1829,7 +1834,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) } if (minutes && stime == -1) - stime = eDVBLocalTimeHandler::getInstance()->nowTime(); + stime = ::time(0); eServiceReference ref(handleGroup(eServiceReference(PyString_AS_STRING(service)))); if (ref.type != eServiceReference::idDVB) @@ -1871,7 +1876,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc) if (must_get_service_name == 1) { - unsigned int pos; + size_t pos; // filter short name brakets while((pos = name.find("\xc2\x86")) != std::string::npos) name.erase(pos,2); @@ -2188,13 +2193,13 @@ PyObject *eEPGCache::search(ePyObject arg) // eDebug("match 3 %s %s", str, s.c_str() ); break; } - else if (!strncmp((const char*)data+6+idx, str, textlen) ) - { - descr[++descridx] = it->first; -// std::string s((const char*)data+6, title_len); -// eDebug("match 4 %s %s", str, s.c_str() ); - break; - } + } + else if (!strncmp((const char*)data+6+idx, str, textlen) ) + { + descr[++descridx] = it->first; +// std::string s((const char*)data+6, title_len); +// eDebug("match 4 %s %s", str, s.c_str() ); + break; } ++idx; } @@ -2316,7 +2321,7 @@ PyObject *eEPGCache::search(ePyObject arg) if (must_get_service_name == 1) { - unsigned int pos; + size_t pos; // filter short name brakets while((pos = name.find("\xc2\x86")) != std::string::npos) name.erase(pos,2); @@ -2590,7 +2595,7 @@ void eEPGCache::privateSectionRead(const uniqueEPGKey ¤t_service, const __ ASSERT(ptr <= 4098); for ( std::map< date_time, std::list >::iterator it(start_times.begin()); it != start_times.end(); ++it ) { - time_t now = eDVBLocalTimeHandler::getInstance()->nowTime(); + time_t now = ::time(0); if ( (it->first.tm + duration_sec) < now ) continue; memcpy(event+2, it->first.data, 5); @@ -2666,7 +2671,7 @@ void eEPGCache::channel_data::readPrivateData( const __u8 *data) int tmp = chid.original_network_id.get(); tmp |= 0x80000000; // we use highest bit as private epg indicator chid.original_network_id = tmp; - cache->channelLastUpdated[chid] = eDVBLocalTimeHandler::getInstance()->nowTime(); + cache->channelLastUpdated[chid] = ::time(0); m_PrevVersion = (data[5] & 0x3E) >> 1; startPrivateReader(); } @@ -2725,7 +2730,7 @@ void eEPGCache::channel_data::timeMHW2DVB( u_char day, u_char hours, u_char minu // As far as we know all mhw time data is sent in central Europe time zone. // So, temporarily set timezone to western europe - time_t dt = eDVBLocalTimeHandler::getInstance()->nowTime(); + time_t dt = ::time(0); char *old_tz = getenv( "TZ" ); putenv("TZ=CET-1CEST,M3.5.0/2,M10.5.0/3"); @@ -2914,7 +2919,7 @@ void eEPGCache::channel_data::storeTitle(std::map<__u32, mhw_title_t>::iterator void eEPGCache::channel_data::startTimeout(int msec) { - m_MHWTimeoutTimer.start(msec,true); + m_MHWTimeoutTimer->start(msec,true); m_MHWTimeoutet=false; } @@ -3095,7 +3100,7 @@ void eEPGCache::channel_data::readMHWData(const __u8 *data) } } eDebug("[EPGC] mhw finished(%ld) %d summaries not found", - eDVBLocalTimeHandler::getInstance()->nowTime(), + ::time(0), m_program_ids.size()); // Summaries have been read, titles that have summaries have been stored. // Now store titles that do not have summaries. @@ -3400,7 +3405,7 @@ start_summary: for (std::map<__u32, mhw_title_t>::iterator itTitle(m_titles.begin()); itTitle != m_titles.end(); itTitle++) storeTitle( itTitle, "", data ); eDebug("[EPGC] mhw2 finished(%ld) %d summaries not found", - eDVBLocalTimeHandler::getInstance()->nowTime(), + ::time(0), m_program_ids.size()); } }