fix
[enigma2.git] / lib / dvb / dvbtime.cpp
index 45430480d240b79d513d1c2a19e1aa1f9dc785b9..eb0ed6929acecdc028eff612300691590b334d06 100644 (file)
@@ -84,7 +84,8 @@ int TDT::createTable(int nr, const __u8 *data, unsigned int max)
                if ( length >= 5 )
                {
                        time_t tptime = parseDVBtime(data[3], data[4], data[5], data[6], data[7]);
-                       eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan, update_count);
+                       if (tptime && tptime != -1)
+                               eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan, update_count);
                        error=0;
                        return 1;
                }
@@ -189,14 +190,15 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up
                        time_t rtc_time = getRTC();
                        if ( rtc_time ) // RTC Ready?
                        {
-                               tm now = *localtime(&rtc_time);
+                               tm now;
+                               localtime_r(&rtc_time, &now);
                                eDebug("[eDVBLocalTimerHandler] RTC time is %02d:%02d:%02d",
                                        now.tm_hour,
                                        now.tm_min,
                                        now.tm_sec);
                                time_t linuxTime=time(0);
                                time_t nowTime=linuxTime+m_time_difference;
-                               now = *localtime(&nowTime);
+                               localtime_r(&nowTime, &now);
                                eDebug("[eDVBLocalTimerHandler] Receiver time is %02d:%02d:%02d",
                                        now.tm_hour,
                                        now.tm_min,
@@ -313,7 +315,8 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up
                        return;
                }
 
-               tm now = *localtime(&t);
+               tm now;
+               localtime_r(&t, &now);
                eDebug("[eDVBLocalTimerHandler] time update to %02d:%02d:%02d",
                        now.tm_hour,
                        now.tm_min,
@@ -368,8 +371,9 @@ void eDVBLocalTimeHandler::DVBChannelAdded(eDVBChannel *chan)
 //             eDebug("[eDVBLocalTimerHandler] add channel %p", chan);
                std::pair<std::map<iDVBChannel*, channel_data>::iterator, bool> tmp =
                        m_knownChannels.insert( std::pair<iDVBChannel*, channel_data>(chan, channel_data()) );
-               tmp.first->second.tdt = new TDT(chan);
+               tmp.first->second.tdt = NULL;
                tmp.first->second.channel = chan;
+               tmp.first->second.m_prevChannelState = -1;
                chan->connectStateChange(slot(*this, &eDVBLocalTimeHandler::DVBChannelStateChanged), tmp.first->second.m_stateChangedConn);
        }
 }
@@ -382,17 +386,24 @@ void eDVBLocalTimeHandler::DVBChannelStateChanged(iDVBChannel *chan)
        {
                int state=0;
                chan->getState(state);
-               switch (state)
+               if ( state != it->second.m_prevChannelState )
                {
-                       case iDVBChannel::state_ok:
-                               eDebug("[eDVBLocalTimerHandler] channel %p running", chan);
-                               it->second.tdt->start();
-                               break;
-                       case iDVBChannel::state_release:
-                               eDebug("[eDVBLocalTimerHandler] remove channel %p", chan);
-                               delete it->second.tdt;
-                               m_knownChannels.erase(it);
-                               break;
+                       switch (state)
+                       {
+                               case iDVBChannel::state_ok:
+                                       eDebug("[eDVBLocalTimerHandler] channel %p running", chan);
+                                       it->second.tdt = new TDT(it->second.channel);
+                                       it->second.tdt->start();
+                                       break;
+                               case iDVBChannel::state_release:
+                                       eDebug("[eDVBLocalTimerHandler] remove channel %p", chan);
+                                       delete it->second.tdt;
+                                       m_knownChannels.erase(it);
+                                       break;
+                               default: // ignore all other events
+                                       return;
+                       }
+                       it->second.m_prevChannelState = state;
                }
        }
 }