X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a8310a1a7345577916560e789cdb8c1712e620a9..88101488f95cda7aff3dadb904edff963f914bfb:/lib/dvb/esection.cpp diff --git a/lib/dvb/esection.cpp b/lib/dvb/esection.cpp index 78db9015..4758008a 100644 --- a/lib/dvb/esection.cpp +++ b/lib/dvb/esection.cpp @@ -8,12 +8,27 @@ 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)) { 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) @@ -23,7 +38,12 @@ void eGTable::sectionRead(const __u8 *d) 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); @@ -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_tries = 0; + // setup filter struct eDVBSectionFilterMask mask;