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