X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/c4bab36eed7b9ce0ba0b16775a9d429c71c5eed7..b4e3826885934af8be03e30855ba34bb33812a52:/lib/dvb_ci/dvbci_session.cpp diff --git a/lib/dvb_ci/dvbci_session.cpp b/lib/dvb_ci/dvbci_session.cpp index b0bef25c..7971650f 100644 --- a/lib/dvb_ci/dvbci_session.cpp +++ b/lib/dvb_ci/dvbci_session.cpp @@ -2,6 +2,12 @@ #include #include +#include +#include +#include +#include + +eDVBCISession *eDVBCISession::sessions[SLMS]; int eDVBCISession::buildLengthField(unsigned char *pkt, int len) { @@ -54,6 +60,11 @@ void eDVBCISession::sendAPDU(const unsigned char *tag, const void *data, int len sendSPDU(0x90, 0, 0, pkt, len+3+l); } +void eDVBCISession::sendSPDU(unsigned char tag, const void *data, int len, const void *apdu, int alen) +{ + sendSPDU(slot, tag, data, len, session_nb, apdu, alen); +} + void eDVBCISession::sendSPDU(eDVBCISlot *slot, unsigned char tag, const void *data, int len, unsigned short session_nb, const void *apdu,int alen) { unsigned char pkt[4096]; @@ -70,7 +81,7 @@ void eDVBCISession::sendSPDU(eDVBCISlot *slot, unsigned char tag, const void *da memcpy(ptr, apdu, alen); ptr+=alen; - slot->write(pkt, ptr - pkt); + slot->send(pkt, ptr - pkt); } void eDVBCISession::sendOpenSessionResponse(eDVBCISlot *slot, unsigned char session_status, const unsigned char *resource_identifier, unsigned short session_nb) @@ -102,6 +113,7 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha eDVBCISession *session; unsigned long tag; unsigned short session_nb; + for (session_nb=1; session_nb < SLMS; ++session_nb) if (!sessions[session_nb-1]) break; @@ -121,21 +133,22 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha case 0x00010041: session=new eDVBCIResourceManagerSession; printf("RESOURCE MANAGER\n"); + printf("session: %p\n",session); break; case 0x00020041: -// session=eDVBCIModule::getInstance()->application_manager = new eDVBCIApplicationManagerSession; + session=slot->application_manager = new eDVBCIApplicationManagerSession; printf("APPLICATION MANAGER\n"); break; case 0x00030041: -// session=eDVBCIModule::getInstance()->ca_manager=new eDVBCICAManagerSession; + session=slot->ca_manager=new eDVBCICAManagerSession; printf("CA MANAGER\n"); break; case 0x00240041: -// session=new eDVBCIDateTimeSession; + session=new eDVBCIDateTimeSession; printf("DATE-TIME\n"); break; case 0x00400041: -// session=new eDVBCIMMISession; + session=new eDVBCIMMISession; printf("MMI\n"); break; case 0x00100041: @@ -156,27 +169,59 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha } printf("new session_nb: %d\n", session_nb); session->session_nb = session_nb; + if (session) { - printf("session ok, status %02x\n", session->status); - status = session->getStatus(); - if (status) - { - delete session; - session = 0; - } sessions[session_nb - 1] = session; session->slot = slot; + status = 0; } session->state = stateInCreation; + return session; } +void eDVBCISession::handleClose() +{ + unsigned char data[1]={0x00}; + sendSPDU(0x96, data, 1, 0, 0); +} + +int eDVBCISession::pollAll() +{ + for (int session_nb=1; session_nb < SLMS; ++session_nb) + if (sessions[session_nb-1]) + { + int r; + + if (sessions[session_nb-1]->state == stateInDeletion) + { + sessions[session_nb-1]->handleClose(); + delete sessions[session_nb-1]; + sessions[session_nb-1]=0; + r=1; + } else + r=sessions[session_nb-1]->poll(); + + if (r) + return 1; + } + return 0; +} + void eDVBCISession::receiveData(eDVBCISlot *slot, const unsigned char *ptr, size_t len) { const unsigned char *pkt = (const unsigned char*)ptr; unsigned char tag = *pkt++; int llen, hlen; + + printf("slot: %p\n",slot); + + int i; + + for(i=0;isession_nb:0); - + if (session) { session->state=stateStarted;