aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb_ci
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-11-22 22:18:50 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-11-22 22:18:50 +0000
commite6fc6c4c345bee12b57a76392abf95c92b29aa3b (patch)
tree153169a8ef29c5fd7be3b4b218d3ac20e0089733 /lib/dvb_ci
parent76fe69e113637a200aafdc2d6dede772706e4b09 (diff)
downloadenigma2-e6fc6c4c345bee12b57a76392abf95c92b29aa3b.tar.gz
enigma2-e6fc6c4c345bee12b57a76392abf95c92b29aa3b.zip
make MMI code more reusable
Diffstat (limited to 'lib/dvb_ci')
-rw-r--r--lib/dvb_ci/dvbci_mmi.cpp108
-rw-r--r--lib/dvb_ci/dvbci_ui.cpp206
-rw-r--r--lib/dvb_ci/dvbci_ui.h43
3 files changed, 12 insertions, 345 deletions
diff --git a/lib/dvb_ci/dvbci_mmi.cpp b/lib/dvb_ci/dvbci_mmi.cpp
index c39d0edd..f266e5da 100644
--- a/lib/dvb_ci/dvbci_mmi.cpp
+++ b/lib/dvb_ci/dvbci_mmi.cpp
@@ -2,7 +2,8 @@
#include <lib/dvb_ci/dvbci_mmi.h>
#include <lib/dvb_ci/dvbci_ui.h>
-#include <lib/base/estring.h>
+
+#include <string>
/*
PyObject *list = PyList_New(len);
@@ -36,113 +37,12 @@ int eDVBCIMMISession::receivedAPDU(const unsigned char *tag, const void *data, i
eDebug("");
if ((tag[0]==0x9f) && (tag[1]==0x88))
- {
- switch (tag[2])
- {
- case 0x00: //Tmmi_close
+ if (eDVBCI_UI::getInstance()->processMMIData(slot->getSlotID(), tag, data, len) == 1)
{
- unsigned char *d=(unsigned char*)data;
- int timeout=0;
- if (d[3] == 1)
- {
- if (len > 4)
- timeout = d[4];
- else
- {
- eDebug("mmi close tag incorrect.. no timeout given.. assume 5 seconds");
- timeout = 5;
- }
- }
- else if (d[3] > 1)
- eDebug("mmi close tag incorrect.. byte 4 should be 0 or 1");
- eDVBCI_UI::getInstance()->mmiScreenClose(slot->getSlotID(), timeout);
- break;
- }
- case 0x01:
- eDebug("MMI display control");
- if (((unsigned char*)data)[0] != 1)
- eDebug("kann ich nicht. aber das sag ich dem modul nicht.");
state=stateDisplayReply;
return 1;
- case 0x07: //Tmenu_enq
- {
- unsigned char *d=(unsigned char*)data;
- unsigned char *max=((unsigned char*)d) + len;
- int textlen = len - 2;
-
- eDebug("in enq");
-
- if ((d+2) > max)
- break;
-
- int blind = *d++ & 1;
- int alen = *d++;
-
- eDebug("%d bytes text", textlen);
- if ((d+textlen) > max)
- break;
-
- char str[textlen + 1];
- memcpy(str, ((char*)d), textlen);
- str[textlen] = '\0';
-
- eDebug("enq-text: %s",str);
-
- eDVBCI_UI::getInstance()->mmiScreenEnq(slot->getSlotID(), blind, alen, (char*)convertDVBUTF8(str).c_str());
-
- break;
}
- case 0x09: //Tmenu_last
- case 0x0c: //Tlist_last
- {
- unsigned char *d=(unsigned char*)data;
- unsigned char *max=((unsigned char*)d) + len;
- int pos = 0;
- eDebug("Tmenu_last");
- if (d > max)
- break;
- int n=*d++;
-
- if(tag[2] == 0x09) //menu
- eDVBCI_UI::getInstance()->mmiScreenBegin(slot->getSlotID(), 0);
- else //list
- eDVBCI_UI::getInstance()->mmiScreenBegin(slot->getSlotID(), 1);
-
- if (n == 0xFF)
- n=0;
- else
- n++;
- eDebug("%d texts", n);
- for (int i=0; i < (n+3); ++i)
- {
- int textlen;
- if ((d+3) > max)
- break;
- eDebug("text tag: %02x %02x %02x", d[0], d[1], d[2]);
- d+=3;
- d+=parseLengthField(d, textlen);
- eDebug("%d bytes text", textlen);
- if ((d+textlen) > max)
- break;
-
- char str[textlen + 1];
- memcpy(str, ((char*)d), textlen);
- str[textlen] = '\0';
-
- eDVBCI_UI::getInstance()->mmiScreenAddText(slot->getSlotID(), pos++, (char*)convertDVBUTF8(str).c_str());
-
- while (textlen--)
- eDebugNoNewLine("%c", *d++);
- eDebug("");
- }
- eDVBCI_UI::getInstance()->mmiScreenFinish(slot->getSlotID());
- break;
- }
- default:
- eDebug("unknown APDU tag 9F 88 %02x", tag[2]);
- break;
- }
- }
+
return 0;
}
diff --git a/lib/dvb_ci/dvbci_ui.cpp b/lib/dvb_ci/dvbci_ui.cpp
index 47eb13d2..af613c43 100644
--- a/lib/dvb_ci/dvbci_ui.cpp
+++ b/lib/dvb_ci/dvbci_ui.cpp
@@ -5,33 +5,20 @@
#include <fcntl.h>
#include <sys/ioctl.h>
-#include <string>
-
#include <lib/base/init.h>
#include <lib/base/init_num.h>
#include <lib/base/eerror.h>
+#include <lib/base/estring.h>
+
+#define MAX_SLOTS 4
eDVBCI_UI *eDVBCI_UI::instance;
eDVBCI_UI::eDVBCI_UI()
+ :eMMI_UI(MAX_SLOTS)
{
ASSERT(!instance);
instance = this;
- for(int i=0;i<MAX_SLOTS;++i)
- {
- slotdata[i].mmiScreenReady=0;
- slotdata[i].mmiTuplePos=0;
- slotdata[i].state=-1;
- }
-}
-
-eDVBCI_UI::~eDVBCI_UI()
-{
- for(int i=0;i<MAX_SLOTS;++i)
- {
- if (slotdata[i].mmiScreen)
- Py_DECREF(slotdata[i].mmiScreen);
- }
}
eDVBCI_UI *eDVBCI_UI::getInstance()
@@ -39,35 +26,6 @@ eDVBCI_UI *eDVBCI_UI::getInstance()
return instance;
}
-int eDVBCI_UI::getState(int slot)
-{
- if (slot < MAX_SLOTS)
- return slotdata[slot].state;
- return 0;
-}
-
-void eDVBCI_UI::setState(int slot, int newState)
-{
- if (slot < MAX_SLOTS)
- {
- slotdata[slot].state = newState;
- /*emit*/ ciStateChanged(slot);
- }
-}
-
-std::string eDVBCI_UI::getAppName(int slot)
-{
- if (slot < MAX_SLOTS)
- return slotdata[slot].appName;
- return "";
-}
-
-void eDVBCI_UI::setAppName(int slot, const char *name)
-{
- if (slot < MAX_SLOTS)
- slotdata[slot].appName = name;
-}
-
void eDVBCI_UI::setInit(int slot)
{
eDVBCIInterfaces::getInstance()->initialize(slot);
@@ -108,166 +66,10 @@ int eDVBCI_UI::cancelEnq(int slot)
return 0;
}
-int eDVBCI_UI::availableMMI(int slot)
-{
- if (slot < MAX_SLOTS)
- return slotdata[slot].mmiScreenReady;
- return false;
-}
-
-int eDVBCI_UI::mmiScreenClose(int slot, int timeout)
-{
- if (slot >= MAX_SLOTS)
- return 0;
-
- slot_ui_data &data = slotdata[slot];
-
- data.mmiScreenReady = 0;
-
- if (data.mmiScreen)
- Py_DECREF(data.mmiScreen);
- data.mmiScreen = PyList_New(1);
-
- ePyObject tuple = PyTuple_New(2);
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("CLOSE"));
- PyTuple_SET_ITEM(tuple, 1, PyLong_FromLong(timeout));
- PyList_SET_ITEM(data.mmiScreen, 0, tuple);
- data.mmiScreenReady = 1;
- /*emit*/ ciStateChanged(slot);
- return 0;
-}
-
-int eDVBCI_UI::mmiScreenEnq(int slot, int blind, int answerLen, char *text)
-{
- if (slot >= MAX_SLOTS)
- return 0;
-
- slot_ui_data &data = slotdata[slot];
-
- data.mmiScreenReady = 0;
-
- if (data.mmiScreen)
- Py_DECREF(data.mmiScreen);
- data.mmiScreen = PyList_New(2);
-
- ePyObject tuple = PyTuple_New(1);
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("ENQ"));
- PyList_SET_ITEM(data.mmiScreen, 0, tuple);
-
- tuple = PyTuple_New(4);
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("PIN"));
- PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(answerLen));
- PyTuple_SET_ITEM(tuple, 2, PyString_FromString(text));
- PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(blind));
-
- PyList_SET_ITEM(data.mmiScreen, 1, tuple);
-
- data.mmiScreenReady = 1;
-
- /*emit*/ ciStateChanged(slot);
-
- return 0;
-}
-
-int eDVBCI_UI::mmiScreenBegin(int slot, int listmenu)
-{
- if (slot >= MAX_SLOTS)
- return 0;
-
- eDebug("eDVBCI_UI::mmiScreenBegin");
-
- slot_ui_data &data = slotdata[slot];
-
- data.mmiScreenReady = 0;
-
- if (data.mmiScreen)
- Py_DECREF(data.mmiScreen);
-
- data.mmiScreen = PyList_New(1);
-
- ePyObject tuple = PyTuple_New(1);
- if (listmenu == 0) //menu
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("MENU"));
- else //list
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("LIST"));
-
- PyList_SET_ITEM(data.mmiScreen, 0, tuple);
-
- data.mmiTuplePos = 1;
-
- return 0;
-}
-
-int eDVBCI_UI::mmiScreenAddText(int slot, int type, char *value)
-{
- if (slot >= MAX_SLOTS)
- return 0;
-
- eDebug("eDVBCI_UI::mmiScreenAddText(%s)",value ? value : "");
-
- slot_ui_data &data = slotdata[slot];
-
- ePyObject tuple = PyTuple_New(3);
-
- if (type == 0) //title
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("TITLE"));
- else if (type == 1) //subtitle
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("SUBTITLE"));
- else if (type == 2) //bottom
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("BOTTOM"));
- else
- PyTuple_SET_ITEM(tuple, 0, PyString_FromString("TEXT"));
-
- eDebug("addText %s with id %d", value, type);
-
- PyTuple_SET_ITEM(tuple, 1, PyString_FromString(value));
-
- if (type > 2)
- PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(type-2));
- else
- PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(-1));
-
- PyList_Append(data.mmiScreen, tuple);
- Py_DECREF(tuple);
-
- return 0;
-}
-
-int eDVBCI_UI::mmiScreenFinish(int slot)
-{
- if (slot < MAX_SLOTS)
- {
- eDebug("eDVBCI_UI::mmiScreenFinish");
- slotdata[slot].mmiScreenReady = 1;
- /*emit*/ ciStateChanged(slot);
- }
- return 0;
-}
-
-void eDVBCI_UI::mmiSessionDestroyed(int slot)
-{
- /*emit*/ ciStateChanged(slot);
-}
-
int eDVBCI_UI::getMMIState(int slot)
{
return eDVBCIInterfaces::getInstance()->getMMIState(slot);
}
-PyObject *eDVBCI_UI::getMMIScreen(int slot)
-{
- if (slot < MAX_SLOTS)
- {
- slot_ui_data &data = slotdata[slot];
- if (data.mmiScreenReady)
- {
- data.mmiScreenReady = 0;
- Py_INCREF(data.mmiScreen);
- return data.mmiScreen;
- }
- }
- Py_RETURN_NONE;
-}
-
//FIXME: correct "run/startlevel"
eAutoInitP0<eDVBCI_UI> init_dvbciui(eAutoInitNumbers::rc, "DVB-CI UI");
diff --git a/lib/dvb_ci/dvbci_ui.h b/lib/dvb_ci/dvbci_ui.h
index 8018e894..b53ab02d 100644
--- a/lib/dvb_ci/dvbci_ui.h
+++ b/lib/dvb_ci/dvbci_ui.h
@@ -2,65 +2,30 @@
#define __dvbci_ui_h
#include <string>
- /* avoid warnigs :) */
-#undef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 200112L
-#include <lib/python/python.h>
+#include <lib/mmi/mmi_ui.h>
#include <lib/python/connections.h>
-#define MAX_SLOTS 4
-
-#ifndef SWIG
-struct slot_ui_data
-{
- std::string appName;
- int state;
- ePyObject mmiScreen;
- int mmiTuplePos;
- int mmiScreenReady;
-};
-#endif
-
-class eDVBCI_UI
+class eDVBCI_UI: public eMMI_UI
{
static eDVBCI_UI *instance;
-#ifndef SWIG
- slot_ui_data slotdata[MAX_SLOTS];
-#else
+#ifdef SWIG
eDVBCI_UI();
- ~eDVBCI_UI();
#endif
+ void stateChanged(int val) { ciStateChanged(val); }
public:
PSignal1<void,int> ciStateChanged;
#ifndef SWIG
eDVBCI_UI();
- ~eDVBCI_UI();
#endif
static eDVBCI_UI *getInstance();
-
- int getState(int slot);
- void setState(int slot, int state);
- std::string getAppName(int slot);
- void setAppName(int slot, const char *name);
void setInit(int slot);
void setReset(int slot);
int startMMI(int slot);
int stopMMI(int slot);
- int availableMMI(int slot);
int getMMIState(int slot);
int answerMenu(int slot, int answer);
int answerEnq(int slot, char *val);
int cancelEnq(int slot);
-
- PyObject *getMMIScreen(int slot);
-#ifndef SWIG
- int mmiScreenClose(int slot, int timeout);
- int mmiScreenEnq(int slot, int blind, int answerLen, char *text);
- int mmiScreenBegin(int slot, int listmenu);
- int mmiScreenAddText(int slot, int type, char *value);
- int mmiScreenFinish(int slot);
- void mmiSessionDestroyed(int slot);
-#endif
};
#endif