X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/98652711568f9545526722e0090c05ae91b87e15..7265acc377e49beaed3f3c43f36267c9fced53e7:/lib/dvb_ci/dvbci.cpp diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 6f532bed..d95f6832 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 @@ -61,11 +62,21 @@ eDVBCISlot *eDVBCIInterfaces::getSlot(int slotid) if(i->getSlotID() == slotid) return i; - printf("FIXME: request for unknown slot\n"); + eDebug("FIXME: request for unknown slot"); 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; + } } } @@ -402,10 +422,10 @@ int eDVBCISlot::send(const unsigned char *data, size_t len) { int res=0; //int i; - //printf("< "); + //eDebugNoNewLine("< "); //for(i=0;i 0) { // int i; -// printf("> "); +// eDebugNoNewLine("> "); // for(i=0;istartMMI(); @@ -571,7 +592,7 @@ int eDVBCISlot::startMMI() int eDVBCISlot::stopMMI() { - printf("edvbcislot: stopMMI()\n"); + eDebug("edvbcislot: stopMMI()"); if(mmi_session) mmi_session->stopMMI(); @@ -581,7 +602,7 @@ int eDVBCISlot::stopMMI() int eDVBCISlot::answerText(int answer) { - printf("edvbcislot: answerText(%d)\n", answer); + eDebug("edvbcislot: answerText(%d)", answer); if(mmi_session) mmi_session->answerText(answer); @@ -599,7 +620,7 @@ int eDVBCISlot::getMMIState() int eDVBCISlot::answerEnq(char *value) { - printf("edvbcislot: answerENQ(%s)\n", value); + eDebug("edvbcislot: answerENQ(%s)", value); if(mmi_session) mmi_session->answerEnq(value); @@ -609,7 +630,7 @@ int eDVBCISlot::answerEnq(char *value) int eDVBCISlot::cancelEnq() { - printf("edvbcislot: cancelENQ\n"); + eDebug("edvbcislot: cancelENQ"); if(mmi_session) mmi_session->cancelEnq(); @@ -719,20 +740,20 @@ void eDVBCISlot::removeService(uint16_t program_number) int eDVBCISlot::enableTS(int enable, int tuner) { -// printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); -// printf("eDVBCISlot::enableTS(%d %d)\n", enable, tuner); +// eDebug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); +// eDebug("eDVBCISlot::enableTS(%d %d)", enable, tuner); FILE *input0, *input1, *ci; if((input0 = fopen("/proc/stb/tsmux/input0", "wb")) == NULL) { - printf("cannot open /proc/stb/tsmux/input0\n"); + eDebug("cannot open /proc/stb/tsmux/input0"); return 0; } if((input1 = fopen("/proc/stb/tsmux/input1", "wb")) == NULL) { - printf("cannot open /proc/stb/tsmux/input1\n"); + eDebug("cannot open /proc/stb/tsmux/input1"); return 0; } if((ci = fopen("/proc/stb/tsmux/input2", "wb")) == NULL) { - printf("cannot open /proc/stb/tsmux/input2\n"); + eDebug("cannot open /proc/stb/tsmux/input2"); return 0; }