also use refcounting for eTimers
[enigma2.git] / lib / dvb / epgcache.cpp
index e70ed0abefc6b85c0907f14dfd11fa9c33ed29bf..0bb6e25b8a34bbde75514f6f5294f45b38af0119 100644 (file)
@@ -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<eDVBResourceManager> res_mgr;
        eDVBResourceManager::getInstance(res_mgr);
@@ -473,7 +473,7 @@ void eEPGCache::sectionRead(const __u8 *data, int source, channel_data *channel)
        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<eServiceEvent> &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,7 +1666,7 @@ 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)
        {
@@ -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);
@@ -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 &current_service, const __
        ASSERT(ptr <= 4098);
        for ( std::map< date_time, std::list<uniqueEPGKey> >::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());
                }
        }