X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/1aeefd997cc362c3b37c1587c5f08891b35c3a75..46f910a175efeaf9558cdc4b59e826d0a5f5f34d:/lib/dvb/esection.h diff --git a/lib/dvb/esection.h b/lib/dvb/esection.h index 78895e76..98d53b48 100644 --- a/lib/dvb/esection.h +++ b/lib/dvb/esection.h @@ -1,23 +1,25 @@ #ifndef __esection_h #define __esection_h -#include +#include #include class eGTable: public iObject, public Object { -DECLARE_REF; +DECLARE_REF(eGTable); private: ePtr m_reader; eDVBTableSpec m_table; + unsigned int m_tries; + eTimer *m_timeout; void sectionRead(const __u8 *data); void timeout(); ePtr m_sectionRead_conn; protected: - virtual int createTable(int nr, const __u8 *data, unsigned int max)=0; + virtual int createTable(unsigned int nr, const __u8 *data, unsigned int max)=0; public: Signal1 tableReady; eGTable(); @@ -36,27 +38,35 @@ private: std::vector sections; std::set avail; protected: - int createTable(int nr, const __u8 *data, unsigned int max) + int createTable(unsigned int nr, const __u8 *data, unsigned int max) { + unsigned int ssize = sections.size(); + if (max < ssize || nr >= max) + { + eDebug("kaputt max(%d) < ssize(%d) || nr(%d) >= max(%d)", + max, ssize, nr, max); + return 0; + } if (avail.find(nr) != avail.end()) delete sections[nr]; + sections.resize(max); - - sections[nr] = new Section(data); avail.insert(nr); for (unsigned int i = 0; i < max; ++i) if (avail.find(i) != avail.end()) - printf("+"); + eDebugNoNewLine("+"); else - printf("-"); + eDebugNoNewLine("-"); - printf(" %d/%d\n", avail.size(), max); + eDebug(" %d/%d TID %02x", avail.size(), max, data[0]); if (avail.size() == max) + { + eDebug("done!"); return 1; - else + } else return 0; } public: @@ -66,8 +76,8 @@ public: } ~eTable() { - for (typename std::vector::iterator i(sections.begin()); i != sections.end(); ++i) - delete *i; + for (std::set::iterator i(avail.begin()); i != avail.end(); ++i) + delete sections[*i]; } }; @@ -95,7 +105,13 @@ public: ~eAUTable() { - current=next=0; + stop(); + } + + void stop() + { + current = next = 0; + m_demux = 0; } int begin(eMainloop *m, const eDVBTableSpec &spec, ePtr demux)