diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-01-12 15:34:09 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-01-12 15:34:09 +0000 |
| commit | 5472356361bab323ec1f3ef0db586c2402aeaaaa (patch) | |
| tree | bff54011862c17fb4a7b4bd1cf93f94067e3ac68 /lib/dvb_ci/dvbci_session.cpp | |
| parent | 54aa4eba0f97cfb1aa4d2c23cda7271520d14f5d (diff) | |
| download | enigma2-5472356361bab323ec1f3ef0db586c2402aeaaaa.tar.gz enigma2-5472356361bab323ec1f3ef0db586c2402aeaaaa.zip | |
fix memleaks (use smartpointers)
Diffstat (limited to 'lib/dvb_ci/dvbci_session.cpp')
| -rw-r--r-- | lib/dvb_ci/dvbci_session.cpp | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/lib/dvb_ci/dvbci_session.cpp b/lib/dvb_ci/dvbci_session.cpp index 9b5cd875..7156811d 100644 --- a/lib/dvb_ci/dvbci_session.cpp +++ b/lib/dvb_ci/dvbci_session.cpp @@ -7,7 +7,9 @@ #include <lib/dvb_ci/dvbci_datetimemgr.h> #include <lib/dvb_ci/dvbci_mmi.h> -eDVBCISession *eDVBCISession::sessions[SLMS]; +DEFINE_REF(eDVBCISession); + +ePtr<eDVBCISession> eDVBCISession::sessions[SLMS]; int eDVBCISession::buildLengthField(unsigned char *pkt, int len) { @@ -108,9 +110,19 @@ 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<eDVBCISession> 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<eDVBCISession> &session) { - eDVBCISession *session; unsigned long tag; unsigned short session_nb; @@ -120,7 +132,7 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha if (session_nb == SLMS) { status=0xF3; - return 0; + return; } tag = resource_identifier[0] << 24; @@ -133,7 +145,6 @@ 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=new eDVBCIApplicationManagerSession(slot); @@ -165,9 +176,10 @@ 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) @@ -177,8 +189,6 @@ eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned cha status = 0; } session->state = stateInCreation; - - return session; } void eDVBCISession::handleClose() @@ -197,7 +207,6 @@ int eDVBCISession::pollAll() 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 @@ -216,22 +225,20 @@ void eDVBCISession::receiveData(eDVBCISlot *slot, const unsigned char *ptr, size int llen, hlen; printf("slot: %p\n",slot); - - int i; - - for(i=0;i<len;i++) + + for(unsigned int i=0;i<len;i++) printf("%02x ",ptr[i]); printf("\n"); llen = parseLengthField(pkt, hlen); pkt += llen; - eDVBCISession *session = NULL; + ePtr<eDVBCISession> 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) @@ -312,5 +319,6 @@ void eDVBCISession::receiveData(eDVBCISlot *slot, const unsigned char *ptr, size eDVBCISession::~eDVBCISession() { + printf("destroy %p\n", this); } |
