get rid of unneeded for loop .. do recursion now
[enigma2.git] / lib / dvb / esection.cpp
index 78db9015ffaf332ce81eb9fb00800d59d42e5e5a..4758008a88db6e20235d1ebffbf78fc573807e8d 100644 (file)
@@ -8,12 +8,27 @@ void eGTable::sectionRead(const __u8 *d)
        m_table.flags |= eDVBTableSpec::tfThisVersion;
        m_table.version = (d[5]>>1)&0x1F;
 
        m_table.flags |= eDVBTableSpec::tfThisVersion;
        m_table.version = (d[5]>>1)&0x1F;
 
+               /* if a section is missing, we retry reading the
+                  whole data up to 5 times. if after that the
+                  section is still missing, we timeout. */
+       if (m_tries > 5 * (last_section_number+1))
+       {
+               timeout();
+               return;
+       }
+       
+       m_tries++;
 
        if (createTable(d[6], d, last_section_number + 1))
        {
                if (m_timeout)
                        m_timeout->stop();
 
        if (createTable(d[6], d, last_section_number + 1))
        {
                if (m_timeout)
                        m_timeout->stop();
-               m_reader->stop();
+               if (m_reader)
+               {
+                       m_reader->stop();
+                       m_reader=0;
+               }
+               m_sectionRead_conn=0;
                ready = 1;
                tableReady(error);
        } else if ((m_table.flags & eDVBTableSpec::tfHaveTimeout) && m_timeout)
                ready = 1;
                tableReady(error);
        } else if ((m_table.flags & eDVBTableSpec::tfHaveTimeout) && m_timeout)
@@ -23,7 +38,12 @@ void eGTable::sectionRead(const __u8 *d)
 void eGTable::timeout()
 {
        eDebug("timeout!");
 void eGTable::timeout()
 {
        eDebug("timeout!");
-       m_reader->stop();
+       if (m_reader)
+       {
+               m_reader->stop();
+               m_reader=0;
+       }
+       m_sectionRead_conn=0;
        ready = 1;
        error = -1;
        tableReady(error);
        ready = 1;
        error = -1;
        tableReady(error);
@@ -44,6 +64,8 @@ RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table)
        m_reader = reader;
        m_reader->connectRead(slot(*this, &eGTable::sectionRead), m_sectionRead_conn);
        
        m_reader = reader;
        m_reader->connectRead(slot(*this, &eGTable::sectionRead), m_sectionRead_conn);
        
+       m_tries = 0;
+       
        // setup filter struct
        eDVBSectionFilterMask mask;
        
        // setup filter struct
        eDVBSectionFilterMask mask;