X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/98652711568f9545526722e0090c05ae91b87e15..9f36196559617d4acec16d8ef54a452768e553c1:/lib/dvb_ci/dvbci.cpp diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 6f532bed..632ab348 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -6,6 +6,7 @@ #include #include +#include // access to python config #include #include #include @@ -66,6 +67,16 @@ eDVBCISlot *eDVBCIInterfaces::getSlot(int slotid) return 0; } +int eDVBCIInterfaces::getSlotState(int slotid) +{ + eDVBCISlot *slot; + + if( (slot = getSlot(slotid)) == 0 ) + return eDVBCISlot::stateInvalid; + + return slot->getState(); +} + int eDVBCIInterfaces::reset(int slotid) { eDVBCISlot *slot; @@ -207,6 +218,23 @@ void eDVBCIInterfaces::ciRemoved(eDVBCISlot *slot) } } +static bool canDescrambleMultipleServices(int slotid) +{ + char configStr[255]; + snprintf(configStr, 255, "config.ci%d.canDescrambleMultipleServices", slotid); + std::string str; + ePythonConfigQuery::getConfigValue(configStr, str); + if ( str == "auto" ) + { + std::string appname = eDVBCI_UI::getInstance()->getAppName(slotid); + if (appname.find("AlphaCrypt") != std::string::npos) + return true; + } + else if (str == "yes") + return true; + return false; +} + void eDVBCIInterfaces::recheckPMTHandlers() { // eDebug("recheckPMTHAndlers()"); @@ -240,9 +268,6 @@ void eDVBCIInterfaces::recheckPMTHandlers() { for (eSmartPtrList::iterator ci_it(m_slots.begin()); ci_it != m_slots.end(); ++ci_it) { - if (ci_it->getState() == eDVBCISlot::stateInvalid) - ci_it->reset(); - bool useThis=false; eDVBCICAManagerSession *ca_manager = ci_it->getCAManager(); if (ca_manager) @@ -271,7 +296,6 @@ void eDVBCIInterfaces::recheckPMTHandlers() { if ( tmp->cislot ) { - bool canHandleMultipleServices=false; eServiceReferenceDVB ref2; tmp->pmthandler->getServiceReference(ref2); eDVBChannelID s1, s2; @@ -279,15 +303,8 @@ void eDVBCIInterfaces::recheckPMTHandlers() { ref.getChannelID(s1); ref2.getChannelID(s2); - // FIXME .. build a "ci can handle multiple services" config entry - // Yes / No / Auto - if ( eDVBCI_UI::getInstance()->getAppName(ci_it->getSlotID()) == "AlphaCrypt" ) - { - canHandleMultipleServices = true; - eDebug("Alphacrypt can handle multiple services"); - } } - if (ref == ref2 || (s1 == s2 && canHandleMultipleServices) ) + if (ref == ref2 || (s1 == s2 && canDescrambleMultipleServices(ci_it->getSlotID()))) { it->cislot = tmp->cislot; ++it->cislot->use_count; @@ -348,12 +365,15 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) bool sameServiceExist=false; for (PMTHandlerList::iterator i=m_pmt_handlers.begin(); i != m_pmt_handlers.end(); ++i) { - eServiceReferenceDVB ref; - i->pmthandler->getServiceReference(ref); - if ( ref == service_to_remove ) + if (i->cislot) { - sameServiceExist=true; - break; + eServiceReferenceDVB ref; + i->pmthandler->getServiceReference(ref); + if ( ref == service_to_remove ) + { + sameServiceExist=true; + break; + } } } @@ -423,8 +443,6 @@ int eDVBCISlot::send(const unsigned char *data, size_t len) void eDVBCISlot::data(int what) { - if (state == stateInvalid) - return; if(what == eSocketNotifier::Priority) { if(state != stateRemoved) { state = stateRemoved; @@ -442,6 +460,9 @@ void eDVBCISlot::data(int what) return; } + if (state == stateInvalid) + reset(); + if(state != stateInserted) { eDebug("ci inserted"); state = stateInserted;