Merge branch 'master' of fraxinas@git.opendreambox.org:/git/enigma2
[vuplus_dvbapp] / lib / dvb_ci / dvbci.h
index 1df87ea..c11a120 100644 (file)
 #ifndef __dvbci_dvbci_h
 #define __dvbci_dvbci_h
 
-#include <lib/base/ebase.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)
+       {
+
+       }
+       bool operator < ( const struct queueData &a ) const
+       {
+               return prio < a.prio;
+       }
+};
+
+enum data_source
+{
+       TUNER_A, TUNER_B, TUNER_C, TUNER_D, CI_A, CI_B, CI_C, CI_D
+};
+
+typedef std::pair<std::string, uint32_t> providerPair;
+typedef std::set<providerPair> providerSet;
+typedef std::set<uint16_t> caidSet;
+typedef std::set<eServiceReference> serviceSet;
 
 class eDVBCISlot: public iObject, public Object
 {
-DECLARE_REF(eDVBCISlot);
-private:
+       friend class eDVBCIInterfaces;
+       DECLARE_REF(eDVBCISlot);
        int slotid;
        int fd;
-       void data(int);
-       eSocketNotifier *notifier;
-
+       ePtr<eSocketNotifier> notifier;
        int state;
-       enum {stateRemoved, stateInserted};
-       uint8_t prev_sent_capmt_version;
+       std::map<uint16_t, uint8_t> running_services;
+       eDVBCIApplicationManagerSession *application_manager;
+       eDVBCICAManagerSession *ca_manager;
+       eDVBCIMMISession *mmi_session;
+       std::priority_queue<queueData> sendqueue;
+       caidSet possible_caids;
+       serviceSet possible_services;
+       providerSet possible_providers;
+       int use_count;
+       eDVBCISlot *linked_next; // needed for linked CI handling
+       data_source current_source;
+       int current_tuner;
+       bool user_mapped;
+       void data(int);
+       bool first_plugged;
 public:
+       enum {stateRemoved, stateInserted, stateInvalid, stateResetted};
        eDVBCISlot(eMainloop *context, int nr);
        ~eDVBCISlot();
        
        int send(const unsigned char *data, size_t len);
-       
-       eDVBCIApplicationManagerSession *application_manager;
-       eDVBCICAManagerSession *ca_manager;
-       eDVBCIMMISession *mmi_session;
-       
+
+       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 initialize();
        int startMMI();
        int stopMMI();
        int answerText(int answer);
-       int answerEnq(int answer, char *value);
+       int answerEnq(char *value);
+       int cancelEnq();
        int getMMIState();
        int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector<uint16_t> &caids=std::vector<uint16_t>());
-       uint8_t getPrevSentCAPMTVersion() const { return prev_sent_capmt_version; }
-       void resetPrevSentCAPMTVersion() { prev_sent_capmt_version = 0xFF; }
+       void removeService(uint16_t program_number=0xFFFF);
+       int getNumOfServices() { return running_services.size(); }
+       int setSource(data_source source);
 };
 
 struct CIPmtHandler
 {
        eDVBServicePMTHandler *pmthandler;
-       eDVBCISlot *usedby;
+       eDVBCISlot *cislot;
        CIPmtHandler()
-               :pmthandler(NULL), usedby(NULL)
+               :pmthandler(NULL), cislot(NULL)
        {}
        CIPmtHandler( const CIPmtHandler &x )
-               :pmthandler(x.pmthandler), usedby(x.usedby)
+               :pmthandler(x.pmthandler), cislot(x.cislot)
        {}
        CIPmtHandler( eDVBServicePMTHandler *ptr )
-               :pmthandler(ptr), usedby(NULL)
+               :pmthandler(ptr), cislot(NULL)
        {}
-       bool operator<(const CIPmtHandler &x) const { return x.pmthandler < pmthandler; }
+       bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; }
 };
 
-typedef std::set<CIPmtHandler> PMTHandlerSet;
+typedef std::list<CIPmtHandler> PMTHandlerList;
+
+#endif // SWIG
 
 class eDVBCIInterfaces
 {
-DECLARE_REF(eDVBCIInterfaces);
+       DECLARE_REF(eDVBCIInterfaces);
        static eDVBCIInterfaces *instance;
-private:
-       eSmartPtrList<eDVBCISlot>       m_slots;
+       eSmartPtrList<eDVBCISlot> m_slots;
        eDVBCISlot *getSlot(int slotid);
-
-       PMTHandlerSet m_pmt_handlers; 
+       PMTHandlerList m_pmt_handlers; 
+#ifndef SWIG
 public:
+#endif
        eDVBCIInterfaces();
        ~eDVBCIInterfaces();
 
        void addPMTHandler(eDVBServicePMTHandler *pmthandler);
        void removePMTHandler(eDVBServicePMTHandler *pmthandler);
+       void recheckPMTHandlers();
        void gotPMT(eDVBServicePMTHandler *pmthandler);
+       void ciRemoved(eDVBCISlot *slot);
+       int getSlotState(int slot);
 
-       static eDVBCIInterfaces *getInstance();
-       
        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, int answer, char *value);
+       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) );
+       PyObject *readCICaIds(int slotid);
 };
 
 #endif