+int eDVBCIInterfaces::stopMMI(int slotid)
+{
+ eDVBCISlot *slot;
+
+ if( (slot = getSlot(slotid)) == 0 )
+ return -1;
+
+ return slot->stopMMI();
+}
+
+int eDVBCIInterfaces::answerText(int slotid, int answer)
+{
+ eDVBCISlot *slot;
+
+ if( (slot = getSlot(slotid)) == 0 )
+ return -1;
+
+ return slot->answerText(answer);
+}
+
+int eDVBCIInterfaces::answerEnq(int slotid, char *value)
+{
+ eDVBCISlot *slot;
+
+ if( (slot = getSlot(slotid)) == 0 )
+ return -1;
+
+ return slot->answerEnq(value);
+}
+
+int eDVBCIInterfaces::cancelEnq(int slotid)
+{
+ eDVBCISlot *slot;
+
+ if( (slot = getSlot(slotid)) == 0 )
+ return -1;
+
+ return slot->cancelEnq();
+}
+
+void eDVBCIInterfaces::addPMTHandler(eDVBServicePMTHandler *pmthandler)
+{
+ CIPmtHandler new_handler(pmthandler);
+
+ eServiceReferenceDVB service;
+ pmthandler->getService(service);
+
+ PMTHandlerSet::iterator it = m_pmt_handlers.begin();
+ while (it != m_pmt_handlers.end())
+ {
+ eServiceReferenceDVB ref;
+ it->pmthandler->getService(ref);
+ if ( service == ref && it->usedby )
+ new_handler.usedby = it->usedby;
+ break;
+ }
+ m_pmt_handlers.insert(new_handler);
+}
+
+void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler)
+{
+ PMTHandlerSet::iterator it=m_pmt_handlers.find(pmthandler);
+ if (it != m_pmt_handlers.end())
+ {
+ eDVBCISlot *slot = it->usedby;
+ eDVBServicePMTHandler *pmthandler = it->pmthandler;
+ m_pmt_handlers.erase(it);
+ if (slot)
+ {
+ eServiceReferenceDVB removed_service;
+ pmthandler->getService(removed_service);
+ PMTHandlerSet::iterator it=m_pmt_handlers.begin();
+ while (it != m_pmt_handlers.end())
+ {
+ eServiceReferenceDVB ref;
+ it->pmthandler->getService(ref);
+ if (ref == removed_service)
+ break;
+ ++it;
+ }
+ if ( it == m_pmt_handlers.end() && slot->getPrevSentCAPMTVersion() != 0xFF )
+ {
+ std::vector<uint16_t> caids;
+ caids.push_back(0xFFFF);
+ slot->sendCAPMT(pmthandler, caids);
+ }
+ }
+ }
+}
+
+void eDVBCIInterfaces::gotPMT(eDVBServicePMTHandler *pmthandler)
+{
+ eDebug("[eDVBCIInterfaces] gotPMT");
+ PMTHandlerSet::iterator it=m_pmt_handlers.find(pmthandler);
+ eServiceReferenceDVB service;
+ if ( it != m_pmt_handlers.end() )
+ {
+ eDebug("[eDVBCIInterfaces] usedby %p", it->usedby);
+ if (!it->usedby)
+ {
+ // HACK this assigns ALL RUNNING SERVICES to the first free CI !!!
+ for (eSmartPtrList<eDVBCISlot>::iterator ci_it(m_slots.begin()); ci_it != m_slots.end(); ++ci_it)
+ {
+/* eDVBCISlot **usedby = &it->usedby;
+ *usedby = ci_it;
+ (*usedby)->resetPrevSentCAPMTVersion();
+ break;
+ */
+ }
+ }
+ if (it->usedby)
+ it->usedby->sendCAPMT(pmthandler);
+ }
+}
+
+int eDVBCIInterfaces::getMMIState(int slotid)