add PyObject refcount debugging code
[vuplus_dvbapp] / lib / dvb_ci / dvbci.cpp
index 9c4e0ac..b074342 100644 (file)
@@ -6,6 +6,7 @@
 #include <lib/base/ebase.h>
 
 #include <lib/base/eerror.h>
+#include <lib/base/nconfig.h> // access to python config
 #include <lib/dvb/pmt.h>
 #include <lib/dvb_ci/dvbci.h>
 #include <lib/dvb_ci/dvbci_session.h>
@@ -61,7 +62,7 @@ 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;
 }
@@ -217,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()");
@@ -278,7 +296,6 @@ void eDVBCIInterfaces::recheckPMTHandlers()
                                                {
                                                        if ( tmp->cislot )
                                                        {
-                                                               bool canHandleMultipleServices=false;
                                                                eServiceReferenceDVB ref2;
                                                                tmp->pmthandler->getServiceReference(ref2);
                                                                eDVBChannelID s1, s2;
@@ -286,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;
@@ -412,10 +422,10 @@ int eDVBCISlot::send(const unsigned char *data, size_t len)
 {
        int res=0;
        //int i;
-       //printf("< ");
+       //eDebugNoNewLine("< ");
        //for(i=0;i<len;i++)
-       //      printf("%02x ",data[i]);
-       //printf("\n");
+       //      eDebugNoNewLine("%02x ",data[i]);
+       //eDebug("");
 
        if (sendqueue.empty())
                res = ::write(fd, data, len);
@@ -436,7 +446,7 @@ void eDVBCISlot::data(int what)
        if(what == eSocketNotifier::Priority) {
                if(state != stateRemoved) {
                        state = stateRemoved;
-                       printf("ci removed\n");
+                       eDebug("ci removed");
                        while(sendqueue.size())
                        {
                                delete [] sendqueue.top().data;
@@ -467,10 +477,10 @@ void eDVBCISlot::data(int what)
                r = ::read(fd, data, 4096);
                if(r > 0) {
 //                     int i;
-//                     printf("> ");
+//                     eDebugNoNewLine("> ");
 //                     for(i=0;i<r;i++)
-//                             printf("%02x ",data[i]);
-//                     printf("\n");
+//                             eDebugNoNewLine("%02x ",data[i]);
+//                     eDebug("");
                        eDVBCISession::receiveData(this, data, r);
                        eDVBCISession::pollAll();
                        return;
@@ -549,7 +559,7 @@ int eDVBCISlot::getSlotID()
 
 int eDVBCISlot::reset()
 {
-       printf("edvbcislot: reset requested\n");
+       eDebug("edvbcislot: reset requested");
 
        if (state == stateInvalid)
        {
@@ -572,7 +582,7 @@ int eDVBCISlot::reset()
 
 int eDVBCISlot::startMMI()
 {
-       printf("edvbcislot: startMMI()\n");
+       eDebug("edvbcislot: startMMI()");
        
        if(application_manager)
                application_manager->startMMI();
@@ -582,7 +592,7 @@ int eDVBCISlot::startMMI()
 
 int eDVBCISlot::stopMMI()
 {
-       printf("edvbcislot: stopMMI()\n");
+       eDebug("edvbcislot: stopMMI()");
 
        if(mmi_session)
                mmi_session->stopMMI();
@@ -592,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);
@@ -610,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);
@@ -620,7 +630,7 @@ int eDVBCISlot::answerEnq(char *value)
 
 int eDVBCISlot::cancelEnq()
 {
-       printf("edvbcislot: cancelENQ\n");
+       eDebug("edvbcislot: cancelENQ");
 
        if(mmi_session)
                mmi_session->cancelEnq();
@@ -730,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;
        }