- work around scan problem
[enigma2.git] / lib / dvb / scan.cpp
index 5571a810feb7923eee08c0f44f6c83d4587ae0f8..4b31aadaed0ecdf2b8c308a5b3edb3f1d2597ae9 100644 (file)
 #include <lib/base/eerror.h>
 #include <errno.h>
 
+#define SCAN_eDebug(x...) eDebug(x)
+#define SCAN_eDebugNoNewLine(x...) eDebugNoNewLine(x)
+
+DEFINE_REF(eDVBScan);
+
 eDVBScan::eDVBScan(iDVBChannel *channel): m_channel(channel)
 {
        if (m_channel->getDemux(m_demux))
-               eDebug("scan: failed to allocate demux!");
+               SCAN_eDebug("scan: failed to allocate demux!");
        m_channel->connectStateChange(slot(*this, &eDVBScan::stateChange), m_stateChanged_connection);
 }
 
@@ -91,11 +96,18 @@ RESULT eDVBScan::nextChannel()
        m_ch_toScan.pop_front();
        
        if (m_channel->getFrontend(fe))
+       {
+               m_event(evtFail);
                return -ENOTSUP;
+       }
        
        m_channel_state = iDVBChannel::state_idle;
        if (fe->tune(*m_ch_current))
+       {
+               return nextChannel();
+               m_event(evtFail);
                return -EINVAL;
+       }
                
        m_event(evtUpdate);
        return 0;
@@ -126,7 +138,7 @@ RESULT eDVBScan::startFilter()
 
 void eDVBScan::SDTready(int err)
 {
-       eDebug("got sdt");
+       SCAN_eDebug("got sdt");
        m_ready |= readySDT;
        if (!err)
                m_ready |= validSDT;
@@ -135,7 +147,7 @@ void eDVBScan::SDTready(int err)
 
 void eDVBScan::NITready(int err)
 {
-       eDebug("got nit, err %d", err);
+       SCAN_eDebug("got nit, err %d", err);
        m_ready |= readyNIT;
        if (!err)
                m_ready |= validNIT;
@@ -144,7 +156,7 @@ void eDVBScan::NITready(int err)
 
 void eDVBScan::BATready(int err)
 {
-       eDebug("got bat");
+       SCAN_eDebug("got bat");
        m_ready |= readyBAT;
        if (!err)
                m_ready |= validBAT;
@@ -204,7 +216,7 @@ void eDVBScan::channelDone()
                        (**m_SDT->getSections().begin()).getTransportStreamId(),
                        hash);
                
-               eDebug("SDT: ");
+               SCAN_eDebug("SDT: ");
                ServiceDescriptionTableConstIterator i;
                for (i = m_SDT->getSections().begin(); i != m_SDT->getSections().end(); ++i)
                        processSDT(dvbnamespace, **i);
@@ -213,7 +225,7 @@ void eDVBScan::channelDone()
        
        if (m_ready & validNIT)
        {
-               eDebug("dumping NIT");
+               SCAN_eDebug("dumping NIT");
                NetworkInformationTableConstIterator i;
                for (i = m_NIT->getSections().begin(); i != m_NIT->getSections().end(); ++i)
                {
@@ -222,7 +234,7 @@ void eDVBScan::channelDone()
                        for (TransportStreamInfoConstIterator tsinfo(tsinfovec.begin()); 
                                tsinfo != tsinfovec.end(); ++tsinfo)
                        {
-                               eDebug("TSID: %04x ONID: %04x", (*tsinfo)->getTransportStreamId(),
+                               SCAN_eDebug("TSID: %04x ONID: %04x", (*tsinfo)->getTransportStreamId(),
                                        (*tsinfo)->getOriginalNetworkId());
                                
                                eOriginalNetworkID onid = (*tsinfo)->getOriginalNetworkId();
@@ -237,7 +249,7 @@ void eDVBScan::channelDone()
                                        case SATELLITE_DELIVERY_SYSTEM_DESCRIPTOR:
                                        {
                                                SatelliteDeliverySystemDescriptor &d = (SatelliteDeliverySystemDescriptor&)**desc;
-                                               eDebug("%d kHz, %d%d%d.%d%c %s MOD:%d %d symb/s, fec %d", 
+                                               SCAN_eDebug("%d kHz, %d%d%d.%d%c %s MOD:%d %d symb/s, fec %d", 
                                                                d.getFrequency(), 
                                                                (d.getOrbitalPosition()>>12)&0xF,
                                                                (d.getOrbitalPosition()>>8)&0xF,
@@ -265,7 +277,7 @@ void eDVBScan::channelDone()
                                                break;
                                        }
                                        default:
-                                               eDebug("descr<%x>", (*desc)->getTag());
+                                               SCAN_eDebug("descr<%x>", (*desc)->getTag());
                                                break;
                                        }
                                }
@@ -277,7 +289,7 @@ void eDVBScan::channelDone()
        
        if ((m_ready  & readyAll) != readyAll)
                return;
-       eDebug("channel done!");
+       SCAN_eDebug("channel done!");
        m_ch_scanned.push_back(m_ch_current);
        nextChannel();
 }
@@ -293,7 +305,7 @@ void eDVBScan::start(const std::list<ePtr<iDVBFrontendParameters> > &known_trans
        nextChannel();
 }
 
-void eDVBScan::insertInto(eDVBDB *db)
+void eDVBScan::insertInto(iDVBChannelList *db)
 {
        for (std::map<eDVBChannelID, ePtr<iDVBFrontendParameters> >::const_iterator 
                        ch(m_new_channels.begin()); ch != m_new_channels.end(); ++ch)
@@ -312,12 +324,12 @@ void eDVBScan::insertInto(eDVBDB *db)
 RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescriptionTable &sdt)
 {
        const ServiceDescriptionVector &services = *sdt.getDescriptions();
-       eDebug("ONID: %04x", sdt.getOriginalNetworkId());
+       SCAN_eDebug("ONID: %04x", sdt.getOriginalNetworkId());
        eDVBChannelID chid(dvbnamespace, sdt.getTransportStreamId(), sdt.getOriginalNetworkId());
        
        for (ServiceDescriptionConstIterator s(services.begin()); s != services.end(); ++s)
        {
-               eDebugNoNewLine("SID %04x: ", (*s)->getServiceId());
+               SCAN_eDebugNoNewLine("SID %04x: ", (*s)->getServiceId());
 
                eServiceReferenceDVB ref;
                ePtr<eDVBService> service = new eDVBService;
@@ -338,7 +350,7 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
                        case SERVICE_DESCRIPTOR:
                        {
                                ServiceDescriptor &d = (ServiceDescriptor&)**desc;
-                               eDebug("name '%s', provider_name '%s'", d.getServiceName().c_str(), d.getServiceProviderName().c_str());
+                               SCAN_eDebug("name '%s', provider_name '%s'", d.getServiceName().c_str(), d.getServiceProviderName().c_str());
                                service->m_service_name = d.getServiceName();
                                service->m_provider_name = d.getServiceProviderName();
                                break;
@@ -347,17 +359,17 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
                        {
                                CaIdentifierDescriptor &d = (CaIdentifierDescriptor&)**desc;
                                const CaSystemIdVector &caids = *d.getCaSystemIds();
-                               eDebugNoNewLine("CA ");
+                               SCAN_eDebugNoNewLine("CA ");
                                for (CaSystemIdVector::const_iterator i(caids.begin()); i != caids.end(); ++i)
                                {
-                                       eDebugNoNewLine("%04x ", *i);
+                                       SCAN_eDebugNoNewLine("%04x ", *i);
                                        service->m_ca.insert(*i);
                                }
-                               eDebug("");
+                               SCAN_eDebug("");
                                break;
                        }
                        default:
-                               eDebug("descr<%x>", (*desc)->getTag());
+                               SCAN_eDebug("descr<%x>", (*desc)->getTag());
                                break;
                        }
                }
@@ -372,3 +384,10 @@ RESULT eDVBScan::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &c
        connection = new eConnection(this, m_event.connect(event));
        return 0;
 }
+
+void eDVBScan::getStats(int &transponders_done, int &transponders_total, int &services)
+{
+       transponders_done = m_ch_scanned.size() + m_ch_unavailable.size();
+       transponders_total = m_ch_toScan.size() + transponders_done;
+       services = m_new_services.size();
+}