fix scan
[enigma2.git] / lib / dvb / scan.cpp
index c44471d9bd51d42170b8c4ee567dc4ec98f76e93..89c4735ad1cd914de8158aa417551767ce71cdd5 100644 (file)
 #include <lib/base/eerror.h>
 #include <lib/base/estring.h>
 #include <errno.h>
-#include <set>
 
-#define SCAN_eDebug(x...) eDebug(x)
-#define SCAN_eDebugNoNewLine(x...) eDebugNoNewLine(x)
+static bool scan_debug;
+#define SCAN_eDebug(x...) do { if (scan_debug) eDebug(x); } while(0)
+#define SCAN_eDebugNoNewLine(x...) do { if (scan_debug) eDebugNoNewLine(x); } while(0)
 
 DEFINE_REF(eDVBScan);
 
-eDVBScan::eDVBScan(iDVBChannel *channel): m_channel(channel)
+eDVBScan::eDVBScan(iDVBChannel *channel, bool debug)
+       :m_channel(channel), m_channel_state(iDVBChannel::state_idle)
+       ,m_ready(0), m_ready_all(readySDT), m_flags(0)
 {
+       scan_debug=debug;
        if (m_channel->getDemux(m_demux))
                SCAN_eDebug("scan: failed to allocate demux!");
        m_channel->connectStateChange(slot(*this, &eDVBScan::stateChange), m_stateChanged_connection);
@@ -98,10 +101,10 @@ RESULT eDVBScan::nextChannel()
        
        if (m_ch_toScan.empty())
        {
-               eDebug("no channels left to scan.");
-               eDebug("%d channels scanned, %d were unavailable.", 
+               SCAN_eDebug("no channels left to scan.");
+               SCAN_eDebug("%d channels scanned, %d were unavailable.", 
                                m_ch_scanned.size(), m_ch_unavailable.size());
-               eDebug("%d channels in database.", m_new_channels.size());
+               SCAN_eDebug("%d channels in database.", m_new_channels.size());
                m_event(evtFinish);
                return -ENOENT;
        }
@@ -252,6 +255,11 @@ void eDVBScan::channelDone()
        if (m_ready & validSDT)
        {
                unsigned long hash = 0;
+
+               // m_ch_current is not set, when eDVBScan is just used for a SDT update
+               if (!m_ch_current)
+                       m_channel->getCurrentFrontendParameters(m_ch_current);
+
                m_ch_current->getHash(hash);
                
                eDVBNamespace dvbnamespace = buildNamespace(
@@ -339,7 +347,7 @@ void eDVBScan::channelDone()
                                                
                                                if ( m_chid_current.dvbnamespace.get() != -1 &&
                                                        ((ns.get() ^ m_chid_current.dvbnamespace.get()) & 0xFFFF0000))
-                                                       eDebug("dropping this transponder, it's on another satellite.");
+                                                       SCAN_eDebug("dropping this transponder, it's on another satellite.");
                                                else
                                                {
                                                        addChannelToScan(
@@ -383,7 +391,7 @@ void eDVBScan::channelDone()
                   These are the reasons for adding the transponder
                   here, and not before.
                */
-       
+
        if (!m_chid_current)
                eWarning("SCAN: the current channel's ID was not corrected - not adding channel.");
        else
@@ -421,7 +429,7 @@ void eDVBScan::start(const eSmartPtrList<iDVBFrontendParameters> &known_transpon
        nextChannel();
 }
 
-void eDVBScan::insertInto(iDVBChannelList *db)
+void eDVBScan::insertInto(iDVBChannelList *db, bool dontRemoveOldFlags)
 {
        if (m_flags & scanRemoveServices)
        {
@@ -498,8 +506,9 @@ void eDVBScan::insertInto(iDVBChannelList *db)
                {
                        eDVBChannelID chid;
                        if (m_flags & scanDontRemoveFeeds)
-                               chid.dvbnamespace = eDVBNamespace((*it)<<16);
-                       db->removeServices(chid, *it);
+                               chid.dvbnamespace = eDVBNamespace((*x)<<16);
+//                     eDebug("remove %d %08x", *x, chid.dvbnamespace.get());
+                       db->removeServices(chid, *x);
                }
        }
 
@@ -511,9 +520,25 @@ void eDVBScan::insertInto(iDVBChannelList *db)
        {
                ePtr<eDVBService> dvb_service;
                if (!db->getService(service->first, dvb_service))
-                       *dvb_service = *service->second;
+               {
+                       if (dvb_service->m_flags & eDVBService::dxNoSDT)
+                               continue;
+                       if (!(dvb_service->m_flags & eDVBService::dxHoldName))
+                       {
+                               dvb_service->m_service_name = service->second->m_service_name;
+                               dvb_service->m_service_name_sort = service->second->m_service_name_sort;
+                       }
+                       dvb_service->m_provider_name = service->second->m_provider_name;
+                       if (service->second->m_ca.size())
+                               dvb_service->m_ca = service->second->m_ca;
+                       if (!dontRemoveOldFlags) // do not remove new found flags when not wished
+                               dvb_service->m_flags &= ~eDVBService::dxNewFound;
+               }
                else
+               {
                        db->addService(service->first, service->second);
+                       service->second->m_flags |= eDVBService::dxNewFound;
+               }
        }
 }
 
@@ -565,7 +590,7 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
                                for (CaSystemIdList::const_iterator i(caids.begin()); i != caids.end(); ++i)
                                {
                                        SCAN_eDebugNoNewLine("%04x ", *i);
-                                       service->m_ca.insert(*i);
+                                       service->m_ca.push_front(*i);
                                }
                                SCAN_eDebug("");
                                break;