From: Andreas Monzner Date: Tue, 29 Nov 2005 23:32:01 +0000 (+0000) Subject: fix resend capmt when ci is plugged into the slot X-Git-Tag: 2.6.0~4883 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/d290a6895aaba9660184b2ac9c1bb90d81ae494c fix resend capmt when ci is plugged into the slot --- diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 9a551df0..b15fcce3 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -83,22 +83,32 @@ int eDVBCIInterfaces::enableTS(int slotid, int enable) if( (slot = getSlot(slotid)) == 0 ) return -1; - if (enable) + return slot->enableTS(enable); +} + +int eDVBCIInterfaces::initialize(int slotid) +{ + eDVBCISlot *slot; + + if( (slot = getSlot(slotid)) == 0 ) + return -1; + + slot->resetPrevSentCAPMTVersion(); + PMTHandlerList::iterator it = m_pmt_handlers.begin(); + while (it != m_pmt_handlers.end()) { - slot->resetPrevSentCAPMTVersion(); - PMTHandlerList::iterator it = m_pmt_handlers.begin(); - while (it != m_pmt_handlers.end()) + if ( it->cislot == slot ) { - if ( it->cislot == slot ) - slot->sendCAPMT(it->pmthandler); // send capmt - ++it; + slot->sendCAPMT(it->pmthandler); // send capmt + break; } + ++it; } - return slot->enableTS(enable); + return slot->initialize(); } -int eDVBCIInterfaces::initialize(int slotid) +int eDVBCIInterfaces::sendCAPMT(int slotid) { eDVBCISlot *slot; @@ -110,11 +120,14 @@ int eDVBCIInterfaces::initialize(int slotid) while (it != m_pmt_handlers.end()) { if ( it->cislot == slot ) + { slot->sendCAPMT(it->pmthandler); // send capmt + return 0; + } ++it; } - return slot->initialize(); + return -1; } int eDVBCIInterfaces::startMMI(int slotid) @@ -213,7 +226,7 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) if (it != m_pmt_handlers.end()) { eDVBCISlot *slot = it->cislot; - eDVBServicePMTHandler *pmthandler = it->pmthandler; +// eDVBServicePMTHandler *pmthandler = it->pmthandler; m_pmt_handlers.erase(it); if (slot && !--slot->use_count) { @@ -362,6 +375,21 @@ eDVBCISlot::~eDVBCISlot() enableTS(0); } +void eDVBCISlot::setAppManager( eDVBCIApplicationManagerSession *session ) +{ + application_manager=session; +} + +void eDVBCISlot::setMMIManager( eDVBCIMMISession *session ) +{ + mmi_session = session; +} + +void eDVBCISlot::setCAManager( eDVBCICAManagerSession *session ) +{ + ca_manager = session; +} + int eDVBCISlot::getSlotID() { return slotid; @@ -445,7 +473,7 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vector &caids = ids.empty() && ca_manager ? ca_manager->getCAIDs() : ids; + const std::vector &caids = ids.empty() ? ca_manager->getCAIDs() : ids; ePtr > ptr; if (pmthandler->getPMT(ptr)) return -1; @@ -523,5 +551,9 @@ int eDVBCISlot::enableTS(int enable) return 0; } +void eDVBCISlot::resendCAPMT() +{ + eDVBCIInterfaces::getInstance()->sendCAPMT(slotid); +} eAutoInitP0 init_eDVBCIInterfaces(eAutoInitNumbers::dvb, "CI Slots"); diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h index a0e832c1..fc6323e8 100644 --- a/lib/dvb_ci/dvbci.h +++ b/lib/dvb_ci/dvbci.h @@ -24,6 +24,9 @@ private: int state; enum {stateRemoved, stateInserted}; uint8_t prev_sent_capmt_version; + eDVBCIApplicationManagerSession *application_manager; + eDVBCICAManagerSession *ca_manager; + eDVBCIMMISession *mmi_session; public: int use_count; @@ -31,11 +34,15 @@ public: ~eDVBCISlot(); int send(const unsigned char *data, size_t len); - - eDVBCIApplicationManagerSession *application_manager; - eDVBCICAManagerSession *ca_manager; - eDVBCIMMISession *mmi_session; - + + void setAppManager( eDVBCIApplicationManagerSession *session ); + void setMMIManager( eDVBCIMMISession *session ); + void setCAManager( eDVBCICAManagerSession *session ); + + eDVBCIApplicationManagerSession *getAppManager() { return application_manager; } + eDVBCIMMISession *getMMIManager() { return mmi_session; } + eDVBCICAManagerSession *getCAManager() { return ca_manager; } + int getSlotID(); int reset(); int initialize(); @@ -45,6 +52,7 @@ public: int answerEnq(char *value); int cancelEnq(); int getMMIState(); + void resendCAPMT(); int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector &caids=std::vector()); uint8_t getPrevSentCAPMTVersion() const { return prev_sent_capmt_version; } void resetPrevSentCAPMTVersion() { prev_sent_capmt_version = 0xFF; } @@ -99,6 +107,7 @@ public: int cancelEnq(int slot); int getMMIState(int slot); int enableTS(int slot, int enable); + int sendCAPMT(int slot); }; #endif diff --git a/lib/dvb_ci/dvbci_appmgr.cpp b/lib/dvb_ci/dvbci_appmgr.cpp index 7843554d..f5231fce 100644 --- a/lib/dvb_ci/dvbci_appmgr.cpp +++ b/lib/dvb_ci/dvbci_appmgr.cpp @@ -6,12 +6,12 @@ eDVBCIApplicationManagerSession::eDVBCIApplicationManagerSession(eDVBCISlot *tslot) { slot = tslot; - slot->application_manager = this; + slot->setAppManager(this); } eDVBCIApplicationManagerSession::~eDVBCIApplicationManagerSession() { - slot = 0; + slot->setAppManager(NULL); } int eDVBCIApplicationManagerSession::receivedAPDU(const unsigned char *tag,const void *data, int len) diff --git a/lib/dvb_ci/dvbci_camgr.cpp b/lib/dvb_ci/dvbci_camgr.cpp index 1d172b1c..cd10ae33 100644 --- a/lib/dvb_ci/dvbci_camgr.cpp +++ b/lib/dvb_ci/dvbci_camgr.cpp @@ -5,12 +5,12 @@ eDVBCICAManagerSession::eDVBCICAManagerSession(eDVBCISlot *tslot) { slot = tslot; - slot->ca_manager = this; + slot->setCAManager(this); } eDVBCICAManagerSession::~eDVBCICAManagerSession() { - slot->ca_manager = 0; + slot->setCAManager(NULL); } int eDVBCICAManagerSession::receivedAPDU(const unsigned char *tag, const void *data, int len) @@ -31,6 +31,7 @@ int eDVBCICAManagerSession::receivedAPDU(const unsigned char *tag, const void *d printf("%04x ", (((const unsigned char*)data)[i]<<8)|(((const unsigned char*)data)[i+1])); caids.push_back((((const unsigned char*)data)[i]<<8)|(((const unsigned char*)data)[i+1])); } + slot->resendCAPMT(); printf("\n"); break; default: diff --git a/lib/dvb_ci/dvbci_mmi.cpp b/lib/dvb_ci/dvbci_mmi.cpp index 8ac4748c..5ef7ebbc 100644 --- a/lib/dvb_ci/dvbci_mmi.cpp +++ b/lib/dvb_ci/dvbci_mmi.cpp @@ -19,12 +19,12 @@ return list; eDVBCIMMISession::eDVBCIMMISession(eDVBCISlot *tslot) { slot = tslot; - slot->mmi_session = this; + slot->setMMIManager(this); } eDVBCIMMISession::~eDVBCIMMISession() { - slot->mmi_session = 0; + slot->setMMIManager(NULL); } int eDVBCIMMISession::receivedAPDU(const unsigned char *tag, const void *data, int len) diff --git a/lib/dvb_ci/dvbci_session.cpp b/lib/dvb_ci/dvbci_session.cpp index 1bd3d18b..4b2a8d72 100644 --- a/lib/dvb_ci/dvbci_session.cpp +++ b/lib/dvb_ci/dvbci_session.cpp @@ -136,7 +136,7 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha printf("session: %p\n",session); break; case 0x00020041: - session=slot->application_manager = new eDVBCIApplicationManagerSession(slot); + session=new eDVBCIApplicationManagerSession(slot); printf("APPLICATION MANAGER\n"); break; case 0x00030041: