aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/esection.h
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2003-10-17 15:36:42 +0000
committerFelix Domke <tmbinc@elitedvb.net>2003-10-17 15:36:42 +0000
commitd63d2c3c6cbbd574dda4f8b00ebe6c661735edd5 (patch)
tree84d0cacfd0b6c1241c236c7860f7cbd7f26901bb /lib/dvb/esection.h
downloadenigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.tar.gz
enigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.zip
import of enigma2
Diffstat (limited to 'lib/dvb/esection.h')
-rw-r--r--lib/dvb/esection.h189
1 files changed, 189 insertions, 0 deletions
diff --git a/lib/dvb/esection.h b/lib/dvb/esection.h
new file mode 100644
index 00000000..ca63c184
--- /dev/null
+++ b/lib/dvb/esection.h
@@ -0,0 +1,189 @@
+#ifndef __esection_h
+#define __esection_h
+
+#include <lib/dvb/isection.h>
+#include <set>
+
+class eGTable: public virtual iObject, public Object
+{
+DECLARE_REF;
+private:
+ ePtr<iDVBSectionReader> m_reader;
+ eDVBTableSpec m_table;
+
+ eTimer *m_timeout;
+
+ void sectionRead(const __u8 *data);
+ void timeout();
+ ePtr<eConnection> m_sectionRead_conn;
+protected:
+ virtual int createTable(int nr, const __u8 *data, unsigned int max)=0;
+public:
+ Signal1<void, int> tableReady;
+ eGTable();
+ RESULT start(iDVBSectionReader *reader, const eDVBTableSpec &table);
+ RESULT start(iDVBDemux *reader, const eDVBTableSpec &table);
+ RESULT getSpec(eDVBTableSpec &spec) { spec = m_table; return 0; }
+ virtual ~eGTable();
+ int error;
+ int ready;
+};
+
+template <class Section>
+class eTable: public eGTable
+{
+private:
+ std::vector<Section*> sections;
+ std::set<int> avail;
+protected:
+ int createTable(int nr, const __u8 *data, unsigned int max)
+ {
+ 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("+");
+ else
+ printf("-");
+
+ printf(" %d/%d\n", avail.size(), max);
+
+ if (avail.size() == max)
+ return 1;
+ else
+ return 0;
+ }
+public:
+ std::vector<Section*> &getSections() { return sections; }
+ eTable(): eGTable()
+ {
+ }
+ ~eTable()
+ {
+ for (typename std::vector<Section*>::iterator i(sections.begin()); i != sections.end(); ++i)
+ delete *i;
+ }
+};
+
+class eAUGTable: public Object
+{
+protected:
+ void slotTableReady(int);
+public:
+ Signal1<void, int> tableReady;
+ virtual void getNext(int err)=0;
+};
+
+template <class Table>
+class eAUTable: public eAUGTable
+{
+ ePtr<Table> current, next; // current is READY AND ERRORFREE, next is not yet ready
+ int first;
+ ePtr<iDVBDemux> m_demux;
+ eMainloop *ml;
+public:
+
+ eAUTable()
+ {
+ }
+
+ ~eAUTable()
+ {
+ current=next=0;
+ }
+
+ int begin(eMainloop *m, const eDVBTableSpec &spec, ePtr<iDVBDemux> demux)
+ {
+ ml = m;
+ m_demux = demux;
+ first= 1;
+ current = 0;
+ next = new Table();
+ CONNECT(next->tableReady, eAUTable::slotTableReady);
+ next->start(demux, spec);
+ return 0;
+ }
+
+ int get()
+ {
+ if (current)
+ {
+ /*emit*/ tableReady(0);
+ return 0;
+ } else if (!next)
+ {
+ /*emit*/ tableReady(-1);
+ return 0;
+ } else
+ return 1;
+ }
+
+ RESULT getCurrent(ePtr<Table> &ptr)
+ {
+ if (!current)
+ return -1;
+ ptr = current;
+ return 0;
+ }
+
+#if 0
+ void abort()
+ {
+ eDebug("eAUTable: aborted!");
+ if (next)
+ next->abort();
+ delete next;
+ next=0;
+ }
+#endif
+
+ int ready()
+ {
+ return !!current;
+ }
+
+ void inject(Table *t)
+ {
+ next=t;
+ getNext(0);
+ }
+
+ void getNext(int error)
+ {
+ current = 0;
+ if (error)
+ {
+ next=0;
+ if (first)
+ /*emit*/ tableReady(error);
+ first=0;
+ return;
+ } else
+ current=next;
+
+ next=0;
+ first=0;
+
+ assert(current->ready);
+
+ /*emit*/ tableReady(0);
+
+ eDVBTableSpec spec;
+
+ if (current && (!current->getSpec(spec)))
+ {
+ next = new Table();
+ CONNECT(next->tableReady, eAUTable::slotTableReady);
+ spec.flags &= ~(eDVBTableSpec::tfAnyVersion|eDVBTableSpec::tfThisVersion|eDVBTableSpec::tfHaveTimeout);
+ next->eGTable::start(m_demux, spec);
+ }
+ }
+};
+
+#endif