more CI fixes (i.e. fix segfault on e2 shutdown)
[enigma2.git] / lib / dvb_ci / dvbci.h
1 #ifndef __dvbci_dvbci_h
2 #define __dvbci_dvbci_h
3
4 #ifndef SWIG
5
6 #include <lib/base/ebase.h>
7 #include <lib/service/iservice.h>
8 #include <lib/python/python.h>
9 #include <set>
10 #include <queue>
11
12 class eDVBCISession;
13 class eDVBCIApplicationManagerSession;
14 class eDVBCICAManagerSession;
15 class eDVBCIMMISession;
16 class eDVBServicePMTHandler;
17 class eDVBCISlot;
18 class eDVBCIInterfaces;
19
20 struct queueData
21 {
22         __u8 prio;
23         unsigned char *data;
24         unsigned int len;
25         queueData( unsigned char *data, unsigned int len, __u8 prio = 0 )
26                 :prio(prio), data(data), len(len)
27         {
28
29         }
30         bool operator < ( const struct queueData &a ) const
31         {
32                 return prio < a.prio;
33         }
34 };
35
36 enum data_source
37 {
38         TUNER_A, TUNER_B, TUNER_C, TUNER_D, CI_A, CI_B, CI_C, CI_D
39 };
40
41 typedef std::pair<std::string, uint32_t> providerPair;
42 typedef std::set<providerPair> providerSet;
43 typedef std::set<uint16_t> caidSet;
44 typedef std::set<eServiceReference> serviceSet;
45
46 class eDVBCISlot: public iObject, public Object
47 {
48         friend class eDVBCIInterfaces;
49         DECLARE_REF(eDVBCISlot);
50         int slotid;
51         int fd;
52         ePtr<eSocketNotifier> notifier;
53         int state;
54         std::map<uint16_t, uint8_t> running_services;
55         eDVBCIApplicationManagerSession *application_manager;
56         eDVBCICAManagerSession *ca_manager;
57         eDVBCIMMISession *mmi_session;
58         std::priority_queue<queueData> sendqueue;
59         caidSet possible_caids;
60         serviceSet possible_services;
61         providerSet possible_providers;
62         int use_count;
63         eDVBCISlot *linked_next; // needed for linked CI handling
64         data_source current_source;
65         int current_tuner;
66         bool user_mapped;
67         void data(int);
68         bool first_plugged;
69 public:
70         enum {stateRemoved, stateInserted, stateInvalid, stateResetted};
71         eDVBCISlot(eMainloop *context, int nr);
72         ~eDVBCISlot();
73         
74         int send(const unsigned char *data, size_t len);
75
76         void setAppManager( eDVBCIApplicationManagerSession *session );
77         void setMMIManager( eDVBCIMMISession *session );
78         void setCAManager( eDVBCICAManagerSession *session );
79
80         eDVBCIApplicationManagerSession *getAppManager() { return application_manager; }
81         eDVBCIMMISession *getMMIManager() { return mmi_session; }
82         eDVBCICAManagerSession *getCAManager() { return ca_manager; }
83
84         int getState() { return state; }
85         int getSlotID();
86         int reset();
87         int startMMI();
88         int stopMMI();
89         int answerText(int answer);
90         int answerEnq(char *value);
91         int cancelEnq();
92         int getMMIState();
93         int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector<uint16_t> &caids=std::vector<uint16_t>());
94         void removeService(uint16_t program_number=0xFFFF);
95         int getNumOfServices() { return running_services.size(); }
96         int setSource(data_source source);
97 };
98
99 struct CIPmtHandler
100 {
101         eDVBServicePMTHandler *pmthandler;
102         eDVBCISlot *cislot;
103         CIPmtHandler()
104                 :pmthandler(NULL), cislot(NULL)
105         {}
106         CIPmtHandler( const CIPmtHandler &x )
107                 :pmthandler(x.pmthandler), cislot(x.cislot)
108         {}
109         CIPmtHandler( eDVBServicePMTHandler *ptr )
110                 :pmthandler(ptr), cislot(NULL)
111         {}
112         bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; }
113 };
114
115 typedef std::list<CIPmtHandler> PMTHandlerList;
116
117 #endif // SWIG
118
119 class eDVBCIInterfaces
120 {
121         DECLARE_REF(eDVBCIInterfaces);
122         static eDVBCIInterfaces *instance;
123         eSmartPtrList<eDVBCISlot> m_slots;
124         eDVBCISlot *getSlot(int slotid);
125         PMTHandlerList m_pmt_handlers; 
126 #ifndef SWIG
127 public:
128 #endif
129         eDVBCIInterfaces();
130         ~eDVBCIInterfaces();
131
132         void addPMTHandler(eDVBServicePMTHandler *pmthandler);
133         void removePMTHandler(eDVBServicePMTHandler *pmthandler);
134         void recheckPMTHandlers();
135         void gotPMT(eDVBServicePMTHandler *pmthandler);
136         void ciRemoved(eDVBCISlot *slot);
137         int getSlotState(int slot);
138
139         int reset(int slot);
140         int initialize(int slot);
141         int startMMI(int slot);
142         int stopMMI(int slot);
143         int answerText(int slot, int answer);
144         int answerEnq(int slot, char *value);
145         int cancelEnq(int slot);
146         int getMMIState(int slot);
147         int sendCAPMT(int slot);
148         int setInputSource(int tunerno, data_source source);
149 #ifdef SWIG
150 public:
151 #endif
152         static eDVBCIInterfaces *getInstance();
153         int getNumOfSlots() { return m_slots.size(); }
154         PyObject *getDescrambleRules(int slotid);
155         RESULT setDescrambleRules(int slotid, SWIG_PYOBJECT(ePyObject) );
156 };
157
158 #endif