+class eDVBChannel;
+
+ /* we do NOT handle resource conflicts here. instead, the allocateChannel
+ fails, and the application has to see why the channel is allocated
+ (and how to deallocate it). */
+class iDVBAdapter;
+
+class eDVBRegisteredFrontend: public iObject
+{
+DECLARE_REF(eDVBRegisteredFrontend);
+public:
+ iDVBAdapter *m_adapter;
+ ePtr<eDVBFrontend> m_frontend;
+ int m_inuse;
+ eDVBRegisteredFrontend(eDVBFrontend *fe, iDVBAdapter *adap): m_adapter(adap), m_frontend(fe), m_inuse(0) { }
+};
+
+struct eDVBRegisteredDemux
+{
+DECLARE_REF(eDVBRegisteredDemux);
+public:
+ iDVBAdapter *m_adapter;
+ ePtr<eDVBDemux> m_demux;
+ int m_inuse;
+ eDVBRegisteredDemux(eDVBDemux *demux, iDVBAdapter *adap): m_adapter(adap), m_demux(demux), m_inuse(0) { }
+};
+
+class eDVBAllocatedFrontend
+{
+DECLARE_REF(eDVBAllocatedFrontend);
+public:
+
+ eDVBAllocatedFrontend(eDVBRegisteredFrontend *fe);
+ ~eDVBAllocatedFrontend();
+ eDVBFrontend &get() { return *m_fe->m_frontend; }
+ operator eDVBRegisteredFrontend*() { return m_fe; }
+ operator eDVBFrontend*() { return m_fe->m_frontend; }