aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-01-12 15:34:09 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-01-12 15:34:09 +0000
commit5472356361bab323ec1f3ef0db586c2402aeaaaa (patch)
treebff54011862c17fb4a7b4bd1cf93f94067e3ac68
parent54aa4eba0f97cfb1aa4d2c23cda7271520d14f5d (diff)
downloadenigma2-5472356361bab323ec1f3ef0db586c2402aeaaaa.tar.gz
enigma2-5472356361bab323ec1f3ef0db586c2402aeaaaa.zip
fix memleaks (use smartpointers)
-rw-r--r--lib/dvb_ci/dvbci.cpp3
-rw-r--r--lib/dvb_ci/dvbci_appmgr.cpp1
-rw-r--r--lib/dvb_ci/dvbci_resmgr.cpp3
-rw-r--r--lib/dvb_ci/dvbci_session.cpp40
-rw-r--r--lib/dvb_ci/dvbci_session.h7
5 files changed, 35 insertions, 19 deletions
diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp
index 80573e89..c3f91482 100644
--- a/lib/dvb_ci/dvbci.cpp
+++ b/lib/dvb_ci/dvbci.cpp
@@ -73,6 +73,8 @@ int eDVBCIInterfaces::reset(int slotid)
if( (slot = getSlot(slotid)) == 0 )
return -1;
+ eDVBCISession::deleteSessions(slot);
+
return slot->reset();
}
@@ -299,6 +301,7 @@ void eDVBCISlot::data(int what)
state = stateRemoved;
enableTS(0);
printf("ci removed\n");
+ eDVBCISession::deleteSessions(this);
notifier->setRequested(eSocketNotifier::Read);
//HACK
eDVBCI_UI::getInstance()->setState(0,0);
diff --git a/lib/dvb_ci/dvbci_appmgr.cpp b/lib/dvb_ci/dvbci_appmgr.cpp
index f5231fce..28e0659d 100644
--- a/lib/dvb_ci/dvbci_appmgr.cpp
+++ b/lib/dvb_ci/dvbci_appmgr.cpp
@@ -92,5 +92,6 @@ int eDVBCIApplicationManagerSession::startMMI()
printf("in appmanager -> startmmi()\n");
const unsigned char tag[3]={0x9F, 0x80, 0x22}; // Tenter_menu
sendAPDU(tag);
+ return 0;
}
diff --git a/lib/dvb_ci/dvbci_resmgr.cpp b/lib/dvb_ci/dvbci_resmgr.cpp
index 7f716d61..69ff611c 100644
--- a/lib/dvb_ci/dvbci_resmgr.cpp
+++ b/lib/dvb_ci/dvbci_resmgr.cpp
@@ -83,6 +83,7 @@ int eDVBCIResourceManagerSession::doAction()
case stateFinal:
printf("stateFinal und action! kann doch garnicht sein ;)\n");
default:
- return 0;
+ break;
}
+ return 0;
}
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);
}
diff --git a/lib/dvb_ci/dvbci_session.h b/lib/dvb_ci/dvbci_session.h
index 1705d765..cf69ca9a 100644
--- a/lib/dvb_ci/dvbci_session.h
+++ b/lib/dvb_ci/dvbci_session.h
@@ -2,14 +2,17 @@
#define __dvbci_dvbci_tc_h
#include <lib/base/ebase.h>
+#include <lib/base/object.h>
#include <lib/dvb_ci/dvbci.h>
#define SLMS 256
class eDVBCISession
{
- static eDVBCISession *sessions[SLMS];
- static eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned char *resource_identifier, unsigned char &status);
+ DECLARE_REF(eDVBCISession);
+ static ePtr<eDVBCISession> sessions[SLMS];
+ static void eDVBCISession::deleteSessions(const eDVBCISlot *slot);
+ static void eDVBCISession::createSession(eDVBCISlot *slot, const unsigned char *resource_identifier, unsigned char &status, ePtr<eDVBCISession> &ptr);
static void eDVBCISession::sendSPDU(eDVBCISlot *slot, unsigned char tag,const void *data, int len, unsigned short session_nb, const void *apdu=0,int alen=0);
static void sendOpenSessionResponse(eDVBCISlot *slot,unsigned char session_status, const unsigned char *resource_identifier,unsigned short session_nb);
void recvCreateSessionResponse(const unsigned char *data);