aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dvb_ci/dvbci.cpp48
-rw-r--r--lib/dvb_ci/dvbci.h10
2 files changed, 58 insertions, 0 deletions
diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp
index 014d51a5..bbea1211 100644
--- a/lib/dvb_ci/dvbci.cpp
+++ b/lib/dvb_ci/dvbci.cpp
@@ -1,7 +1,9 @@
#include <fcntl.h>
+#include <sys/ioctl.h>
#include <lib/base/init.h>
#include <lib/base/init_num.h>
+#include <lib/base/ebase.h>
#include <lib/base/eerror.h>
#include <lib/dvb_ci/dvbci.h>
@@ -9,10 +11,14 @@
#include <lib/dvb_ci/dvbci_ui.h>
+eDVBCIInterfaces *eDVBCIInterfaces::instance = 0;
+
eDVBCIInterfaces::eDVBCIInterfaces()
{
int num_ci = 0;
+ instance = this;
+
eDebug("scanning for common interfaces..");
while (1)
@@ -39,6 +45,32 @@ eDVBCIInterfaces::~eDVBCIInterfaces()
{
}
+eDVBCIInterfaces *eDVBCIInterfaces::getInstance()
+{
+ return instance;
+}
+
+eDVBCISlot *eDVBCIInterfaces::getSlot(int slotid)
+{
+ for(eSmartPtrList<eDVBCISlot>::iterator i(m_slots.begin()); i != m_slots.end(); ++i)
+ if(i->getSlotID() == slotid)
+ return i;
+
+ return 0;
+}
+
+int eDVBCIInterfaces::reset(int slotid)
+{
+ eDVBCISlot *slot;
+
+ if( (slot = getSlot(slotid)) == 0 ) {
+ printf("FIXME: request for unknown slot\n");
+ return 0;
+ }
+
+ return slot->reset();
+}
+
int eDVBCISlot::send(const unsigned char *data, size_t len)
{
int res;
@@ -109,6 +141,8 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr)
{
char filename[128];
+ slotid = nr;
+
sprintf(filename, "/dev/ci%d", nr);
fd = ::open(filename, O_RDWR | O_NONBLOCK);
@@ -131,4 +165,18 @@ eDVBCISlot::~eDVBCISlot()
{
}
+int eDVBCISlot::getSlotID()
+{
+ return slotid;
+}
+
+int eDVBCISlot::reset()
+{
+ printf("edvbcislot: reset requested\n");
+
+ ioctl(fd, 0);
+
+ return 0;
+}
+
eAutoInitP0<eDVBCIInterfaces> init_eDVBCIInterfaces(eAutoInitNumbers::dvb, "CI Slots");
diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h
index eb4b6b04..43952c2f 100644
--- a/lib/dvb_ci/dvbci.h
+++ b/lib/dvb_ci/dvbci.h
@@ -11,6 +11,7 @@ class eDVBCISlot: public iObject, public Object
{
DECLARE_REF(eDVBCISlot);
private:
+ int slotid;
int fd;
void data(int);
eSocketNotifier *notifier;
@@ -25,16 +26,25 @@ public:
eDVBCIApplicationManagerSession *application_manager;
eDVBCICAManagerSession *ca_manager;
+
+ int getSlotID();
+ int reset();
};
class eDVBCIInterfaces
{
DECLARE_REF(eDVBCIInterfaces);
+ static eDVBCIInterfaces *instance;
private:
eSmartPtrList<eDVBCISlot> m_slots;
+ eDVBCISlot *getSlot(int slotid);
public:
eDVBCIInterfaces();
~eDVBCIInterfaces();
+
+ static eDVBCIInterfaces *getInstance();
+
+ int reset(int slot);
};
#endif