send capmt to ci
authorRonny Strutz <ronny.strutz@multimedia-labs.de>
Tue, 22 Nov 2005 22:33:54 +0000 (22:33 +0000)
committerRonny Strutz <ronny.strutz@multimedia-labs.de>
Tue, 22 Nov 2005 22:33:54 +0000 (22:33 +0000)
lib/dvb_ci/dvbci.cpp
lib/dvb_ci/dvbci_camgr.cpp
lib/dvb_ci/dvbci_camgr.h
lib/dvb_ci/dvbci_session.cpp

index 82d3349d7d46f2f658f898e0de20b6a90371a32e..efd6925ce6f789d104961355343b9ec31fa1d6b6 100644 (file)
@@ -404,6 +404,7 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vector<u
 #if 1
 // begin calc capmt length
                        int wp=0;
 #if 1
 // begin calc capmt length
                        int wp=0;
+                       int hlen;
                        if ( raw_data[3] & 0x80 )
                        {
                                int i=0;
                        if ( raw_data[3] & 0x80 )
                        {
                                int i=0;
@@ -412,11 +413,13 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vector<u
                                        wp |= (raw_data[4+i] << (8 * i++));
                                wp+=4;
                                wp+=lenbytes;
                                        wp |= (raw_data[4+i] << (8 * i++));
                                wp+=4;
                                wp+=lenbytes;
+                               hlen = 4 + lenbytes;
                        }
                        else
                        {
                                wp = raw_data[3];
                                wp+=4;
                        }
                        else
                        {
                                wp = raw_data[3];
                                wp+=4;
+                               hlen = 4;
                        }
 // end calc capmt length
                        if (!ca_manager)
                        }
 // end calc capmt length
                        if (!ca_manager)
@@ -429,7 +432,8 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vector<u
 #endif
                        if (ca_manager)
                        {
 #endif
                        if (ca_manager)
                        {
-                               // TODO SEND buffer to CI ( add session number, add tag )
+                               //dont need tag and lenfield
+                               ca_manager->sendCAPMT(raw_data + hlen, wp - hlen);
                                prev_sent_capmt_version = pmt_version;
                        }
                }
                                prev_sent_capmt_version = pmt_version;
                        }
                }
index d700b0a1e10162b6b5d065b2f28f8ccab093bacc..b76514649a8c5f6ae692a4106b85af71a226ef90 100644 (file)
@@ -2,6 +2,17 @@
 
 #include <lib/dvb_ci/dvbci_camgr.h>
 
 
 #include <lib/dvb_ci/dvbci_camgr.h>
 
+eDVBCICAManagerSession::eDVBCICAManagerSession(eDVBCISlot *tslot)
+{
+       slot = tslot;
+       slot->ca_manager = this;
+}
+
+eDVBCICAManagerSession::~eDVBCICAManagerSession()
+{
+       slot->ca_manager = 0;
+}
+
 int eDVBCICAManagerSession::receivedAPDU(const unsigned char *tag, const void *data, int len)
 {
        printf("SESSION(%d)/CA %02x %02x %02x: ", session_nb, tag[0], tag[1],tag[2]);
 int eDVBCICAManagerSession::receivedAPDU(const unsigned char *tag, const void *data, int len)
 {
        printf("SESSION(%d)/CA %02x %02x %02x: ", session_nb, tag[0], tag[1],tag[2]);
@@ -47,3 +58,12 @@ int eDVBCICAManagerSession::doAction()
                return 0;
        }
 }
                return 0;
        }
 }
+
+int eDVBCICAManagerSession::sendCAPMT(unsigned char *data, int len)
+{
+       int i;
+       const unsigned char tag[3]={0x9F, 0x80, 0x32}; // ca_pmt
+
+  sendAPDU(tag, data, len);
+}
+
index c09997c25e67faf408b4d9601e746cf0a19753c1..91d3eef6960c14cacc028e453e5f02e02baf19ff 100644 (file)
@@ -14,7 +14,11 @@ class eDVBCICAManagerSession: public eDVBCISession
        int receivedAPDU(const unsigned char *tag, const void *data, int len);
        int doAction();
 public:
        int receivedAPDU(const unsigned char *tag, const void *data, int len);
        int doAction();
 public:
+       eDVBCICAManagerSession(eDVBCISlot *tslot);
+       ~eDVBCICAManagerSession();
+
        const std::vector<uint16_t> &getCAIDs() const { return caids; }
        const std::vector<uint16_t> &getCAIDs() const { return caids; }
+       int sendCAPMT(unsigned char *pmt, int len);
 };
 
 #endif
 };
 
 #endif
index afe9e97e820619fb36be3232627ba46fdb917cb7..1bd3d18b96ba16de6454f3e283a0730eb70524a6 100644 (file)
@@ -140,7 +140,7 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha
                printf("APPLICATION MANAGER\n");
                break;
        case 0x00030041:
                printf("APPLICATION MANAGER\n");
                break;
        case 0x00030041:
-               session=slot->ca_manager=new eDVBCICAManagerSession;
+               session = new eDVBCICAManagerSession(slot);
                printf("CA MANAGER\n");
                break;
        case 0x00240041:
                printf("CA MANAGER\n");
                break;
        case 0x00240041: