tables: don't retry more than 5*nr times.
[enigma2.git] / lib / dvb / esection.cpp
index 08cb49bee96f3d84001d5b7323d2bec99b8933f7..0af622521aad7e0ae1f7d6394774c4233068587e 100644 (file)
@@ -8,6 +8,16 @@ void eGTable::sectionRead(const __u8 *d)
        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))
        {
@@ -30,7 +40,7 @@ void eGTable::timeout()
 }
 
 eGTable::eGTable():
-               ref(0), m_timeout(0), error(0)
+               m_timeout(0), error(0)
 {
 }
 
@@ -44,6 +54,8 @@ RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table)
        m_reader = reader;
        m_reader->connectRead(slot(*this, &eGTable::sectionRead), m_sectionRead_conn);
        
+       m_tries = 0;
+       
        // setup filter struct
        eDVBSectionFilterMask mask;
        
@@ -57,15 +69,26 @@ RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table)
        if (m_table.flags & eDVBTableSpec::tfHaveTID)
        {
                mask.data[0] = m_table.tid;
-               mask.mask[0] = 0xFF;
+               if (m_table.flags & eDVBTableSpec::tfHaveTIDMask)
+                       mask.mask[0] = m_table.tid_mask;
+               else
+                       mask.mask[0] = 0xFF;
        }
-       
+
        if (m_table.flags & eDVBTableSpec::tfHaveTIDExt)
        {
                mask.data[1] = m_table.tidext >> 8;
                mask.data[2] = m_table.tidext;
-               mask.mask[1] = 0xFF;
-               mask.mask[2] = 0xFF;
+               if (m_table.flags & eDVBTableSpec::tfHaveTIDExtMask)
+               {
+                       mask.mask[1] = m_table.tidext_mask >> 8;
+                       mask.mask[2] = m_table.tidext_mask;
+               }
+               else
+               {
+                       mask.mask[1] = 0xFF;
+                       mask.mask[2] = 0xFF;
+               }
        }
        
        if (!(m_table.flags & eDVBTableSpec::tfAnyVersion))
@@ -97,7 +120,6 @@ RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table)
        
        if (m_table.flags & eDVBTableSpec::tfHaveTimeout)
        {
-               eDebug("have timeout, %d", m_table.timeout);
                if (m_timeout)
                        delete m_timeout;
                m_timeout = new eTimer(eApp);