X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb_ci%2Fdvbci_session.cpp;h=7156811d96bee5abad0f617ea03747995825850e;hp=a9c26d16c6d980f6848cdc3961c2f65f7a74b571;hb=75db34c299094d2ae87941ed464e8efa79848e16;hpb=5c66de23e71d94ddba590c67e4751e046a095e68 diff --git a/lib/dvb_ci/dvbci_session.cpp b/lib/dvb_ci/dvbci_session.cpp index a9c26d1..7156811 100644 --- a/lib/dvb_ci/dvbci_session.cpp +++ b/lib/dvb_ci/dvbci_session.cpp @@ -5,6 +5,11 @@ #include #include #include +#include + +DEFINE_REF(eDVBCISession); + +ePtr eDVBCISession::sessions[SLMS]; int eDVBCISession::buildLengthField(unsigned char *pkt, int len) { @@ -78,7 +83,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) @@ -105,18 +110,29 @@ void eDVBCISession::recvCloseSessionRequest(const unsigned char *data) printf("close Session Request\n"); } -eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned char *resource_identifier, unsigned char &status) +void eDVBCISession::deleteSessions(const eDVBCISlot *slot) +{ + ePtr ptr; + for (unsigned short session_nb=0; session_nb < SLMS; ++session_nb) + { + ptr = sessions[session_nb]; + if (ptr && ptr->slot == slot) + sessions[session_nb]=0; + } +} + +void eDVBCISession::createSession(eDVBCISlot *slot, const unsigned char *resource_identifier, unsigned char &status, ePtr &session) { - eDVBCISession *session; unsigned long tag; unsigned short session_nb; + for (session_nb=1; session_nb < SLMS; ++session_nb) if (!sessions[session_nb-1]) break; if (session_nb == SLMS) { status=0xF3; - return 0; + return; } tag = resource_identifier[0] << 24; @@ -131,11 +147,11 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha printf("RESOURCE MANAGER\n"); break; case 0x00020041: - session=slot->application_manager = new eDVBCIApplicationManagerSession; + session=new eDVBCIApplicationManagerSession(slot); printf("APPLICATION MANAGER\n"); break; case 0x00030041: - session=slot->ca_manager=new eDVBCICAManagerSession; + session = new eDVBCICAManagerSession(slot); printf("CA MANAGER\n"); break; case 0x00240041: @@ -143,13 +159,13 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha printf("DATE-TIME\n"); break; case 0x00400041: -// session=new eDVBCIMMISession; - printf("MMI\n"); + session = new eDVBCIMMISession(slot); + printf("MMI - create session\n"); break; case 0x00100041: // session=new eDVBCIAuthSession; printf("AuthSession\n"); - break; +// break; case 0x00200041: default: printf("unknown resource type %02x %02x %02x %02x\n", resource_identifier[0], resource_identifier[1], resource_identifier[2],resource_identifier[3]); @@ -160,24 +176,46 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha if (!session) { printf("unknown session.. expect crash\n"); - return 0; + return; } - printf("new session_nb: %d\n", session_nb); + + printf("new session nb %d %p\n", session_nb, &(*session)); 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(); + 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) @@ -185,18 +223,24 @@ void eDVBCISession::receiveData(eDVBCISlot *slot, const unsigned char *ptr, size const unsigned char *pkt = (const unsigned char*)ptr; unsigned char tag = *pkt++; int llen, hlen; + + printf("slot: %p\n",slot); + + for(unsigned int i=0;i session; if(tag == 0x91) { unsigned char status; - session = createSession(slot, pkt, status); + createSession(slot, pkt, status, session); sendOpenSessionResponse(slot, status, pkt, session?session->session_nb:0); - + if (session) { session->state=stateStarted; @@ -256,13 +300,13 @@ void eDVBCISession::receiveData(eDVBCISlot *slot, const unsigned char *ptr, size len-=hlen; //if (eDVBCIModule::getInstance()->workarounds_active & eDVBCIModule::workaroundMagicAPDULength) - //{ - // if (((len-alen) > 0) && ((len - alen) < 3)) - // { - // printf("WORKAROUND: applying work around MagicAPDULength\n"); - // alen=len; - // } - //} + { + if (((len-alen) > 0) && ((len - alen) < 3)) + { + printf("WORKAROUND: applying work around MagicAPDULength\n"); + alen=len; + } + } if (session->receivedAPDU(tag, pkt, alen)) session->action = 1; pkt+=alen; @@ -272,3 +316,9 @@ void eDVBCISession::receiveData(eDVBCISlot *slot, const unsigned char *ptr, size if (len) printf("PROTOCOL: warning, TL-Data has invalid length\n"); } + +eDVBCISession::~eDVBCISession() +{ + printf("destroy %p\n", this); +} +