#ifndef __dvbci_dvbci_h
#define __dvbci_dvbci_h
+#ifndef SWIG
+
#include <lib/base/ebase.h>
+#include <lib/service/iservice.h>
+#include <lib/python/python.h>
+#include <set>
+#include <queue>
class eDVBCISession;
+class eDVBCIApplicationManagerSession;
+class eDVBCICAManagerSession;
+class eDVBCIMMISession;
+class eDVBServicePMTHandler;
+class eDVBCISlot;
+class eDVBCIInterfaces;
+
+struct queueData
+{
+ __u8 prio;
+ unsigned char *data;
+ unsigned int len;
+ queueData( unsigned char *data, unsigned int len, __u8 prio = 0 )
+ :prio(prio), data(data), len(len)
+ {
-class eDVBCISlot: public Object
+ }
+ bool operator < ( const struct queueData &a ) const
+ {
+ return prio < a.prio;
+ }
+};
+
+enum data_source
{
-DECLARE_REF(eDVBCISlot);
-private:
+ TUNER_A, TUNER_B, TUNER_C, TUNER_D, CI_A, CI_B, CI_C, CI_D
+};
+
+class eDVBCISlot: public iObject, public Object
+{
+ friend class eDVBCIInterfaces;
+ DECLARE_REF(eDVBCISlot);
+ int slotid;
int fd;
+ eSocketNotifier *notifier;
+ int state;
+ std::map<uint16_t, uint8_t> running_services;
+ eDVBCIApplicationManagerSession *application_manager;
+ eDVBCICAManagerSession *ca_manager;
+ eDVBCIMMISession *mmi_session;
+ std::priority_queue<queueData> sendqueue;
+ std::set<uint16_t> possible_caids;
+ std::set<eServiceReference> possible_services;
+ std::set<std::string> possible_providers;
+ int use_count;
+ eDVBCISlot *linked_next; // needed for linked CI handling
+ data_source current_source;
+ int current_tuner;
void data(int);
- eSocketNotifier *notifier_data;
- void event(int);
- eSocketNotifier *notifier_event;
-
- eDVBCISession *se;
public:
+ enum {stateRemoved, stateInserted, stateInvalid, stateResetted};
eDVBCISlot(eMainloop *context, int nr);
- virtual ~eDVBCISlot();
+ ~eDVBCISlot();
- int eDVBCISlot::write(const unsigned char *data, size_t len);
+ int send(const unsigned char *data, size_t len);
+
+ void setAppManager( eDVBCIApplicationManagerSession *session );
+ void setMMIManager( eDVBCIMMISession *session );
+ void setCAManager( eDVBCICAManagerSession *session );
+
+ eDVBCIApplicationManagerSession *getAppManager() { return application_manager; }
+ eDVBCIMMISession *getMMIManager() { return mmi_session; }
+ eDVBCICAManagerSession *getCAManager() { return ca_manager; }
+
+ int getState() { return state; }
+ int getSlotID();
+ int reset();
+ int startMMI();
+ int stopMMI();
+ int answerText(int answer);
+ int answerEnq(char *value);
+ int cancelEnq();
+ int getMMIState();
+ int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector<uint16_t> &caids=std::vector<uint16_t>());
+ void removeService(uint16_t program_number=0xFFFF);
+ int getNumOfServices() { return running_services.size(); }
+ int setSource(data_source source);
+};
+
+struct CIPmtHandler
+{
+ eDVBServicePMTHandler *pmthandler;
+ eDVBCISlot *cislot;
+ CIPmtHandler()
+ :pmthandler(NULL), cislot(NULL)
+ {}
+ CIPmtHandler( const CIPmtHandler &x )
+ :pmthandler(x.pmthandler), cislot(x.cislot)
+ {}
+ CIPmtHandler( eDVBServicePMTHandler *ptr )
+ :pmthandler(ptr), cislot(NULL)
+ {}
+ bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; }
};
+typedef std::list<CIPmtHandler> PMTHandlerList;
+
+#endif // SWIG
+
class eDVBCIInterfaces
{
-private:
- eSmartPtrList<eDVBCISlot> m_slots;
+ DECLARE_REF(eDVBCIInterfaces);
+ static eDVBCIInterfaces *instance;
+ eSmartPtrList<eDVBCISlot> m_slots;
+ eDVBCISlot *getSlot(int slotid);
+ PMTHandlerList m_pmt_handlers;
+#ifndef SWIG
public:
+#endif
eDVBCIInterfaces();
- virtual ~eDVBCIInterfaces();
+ ~eDVBCIInterfaces();
+
+ void addPMTHandler(eDVBServicePMTHandler *pmthandler);
+ void removePMTHandler(eDVBServicePMTHandler *pmthandler);
+ void recheckPMTHandlers();
+ void gotPMT(eDVBServicePMTHandler *pmthandler);
+ void ciRemoved(eDVBCISlot *slot);
+ int getSlotState(int slot);
+
+ int reset(int slot);
+ int initialize(int slot);
+ int startMMI(int slot);
+ int stopMMI(int slot);
+ int answerText(int slot, int answer);
+ int answerEnq(int slot, char *value);
+ int cancelEnq(int slot);
+ int getMMIState(int slot);
+ int sendCAPMT(int slot);
+ int setInputSource(int tunerno, data_source source);
+#ifdef SWIG
+public:
+#endif
+ static eDVBCIInterfaces *getInstance();
+ int getNumOfSlots() { return m_slots.size(); }
+ PyObject *getDescrambleRules(int slotid);
+ RESULT setDescrambleRules(int slotid, SWIG_PYOBJECT(ePyObject) );
};
#endif