9cb9a0b62e0b55bdf7cf5905a963dd48ad2cdbe4
[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, PVR, PVR_NONE
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         eSmartPtrList<eDVBECMParser> m_ecms;
71 public:
72         enum {stateRemoved, stateInserted, stateInvalid, stateResetted};
73         eDVBCISlot(eMainloop *context, int nr);
74         ~eDVBCISlot();
75         
76         int send(const unsigned char *data, size_t len);
77
78         void setAppManager( eDVBCIApplicationManagerSession *session );
79         void setMMIManager( eDVBCIMMISession *session );
80         void setCAManager( eDVBCICAManagerSession *session );
81
82         eDVBCIApplicationManagerSession *getAppManager() { return application_manager; }
83         eDVBCIMMISession *getMMIManager() { return mmi_session; }
84         eDVBCICAManagerSession *getCAManager() { return ca_manager; }
85
86         int getState() { return state; }
87         int getSlotID();
88         int reset();
89         int startMMI();
90         int stopMMI();
91         int answerText(int answer);
92         int answerEnq(char *value);
93         int cancelEnq();
94         int getMMIState();
95         int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector<uint16_t> &caids=std::vector<uint16_t>());
96         void removeService(uint16_t program_number=0xFFFF);
97         int getNumOfServices() { return running_services.size(); }
98         int setSource(data_source source);
99         int setClockRate(int);
100         void addVtunerPid(eDVBServicePMTHandler *pmthandler);
101         void removeVtunerPid(void);
102 };
103
104 struct CIPmtHandler
105 {
106         eDVBServicePMTHandler *pmthandler;
107         eDVBCISlot *cislot;
108         CIPmtHandler()
109                 :pmthandler(NULL), cislot(NULL)
110         {}
111         CIPmtHandler( const CIPmtHandler &x )
112                 :pmthandler(x.pmthandler), cislot(x.cislot)
113         {}
114         CIPmtHandler( eDVBServicePMTHandler *ptr )
115                 :pmthandler(ptr), cislot(NULL)
116         {}
117         bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; }
118 };
119
120 typedef std::list<CIPmtHandler> PMTHandlerList;
121
122 #endif // SWIG
123
124 class eDVBCIInterfaces
125 {
126         DECLARE_REF(eDVBCIInterfaces);
127         static eDVBCIInterfaces *instance;
128         eSmartPtrList<eDVBCISlot> m_slots;
129         eDVBCISlot *getSlot(int slotid);
130         PMTHandlerList m_pmt_handlers; 
131 #ifndef SWIG
132 public:
133 #endif
134         eDVBCIInterfaces();
135         ~eDVBCIInterfaces();
136
137         void addPMTHandler(eDVBServicePMTHandler *pmthandler);
138         void removePMTHandler(eDVBServicePMTHandler *pmthandler);
139         void recheckPMTHandlers();
140         void gotPMT(eDVBServicePMTHandler *pmthandler);
141         bool isCiConnected(eDVBServicePMTHandler *pmthandler);
142         void ciRemoved(eDVBCISlot *slot);
143         int getSlotState(int slot);
144
145         int reset(int slot);
146         int initialize(int slot);
147         int startMMI(int slot);
148         int stopMMI(int slot);
149         int answerText(int slot, int answer);
150         int answerEnq(int slot, char *value);
151         int cancelEnq(int slot);
152         int getMMIState(int slot);
153         int sendCAPMT(int slot);
154         int setInputSource(int tunerno, data_source source);
155         int setCIClockRate(int slot, int rate);
156 #ifdef SWIG
157 public:
158 #endif
159         static eDVBCIInterfaces *getInstance();
160         int getNumOfSlots() { return m_slots.size(); }
161         PyObject *getDescrambleRules(int slotid);
162         RESULT setDescrambleRules(int slotid, SWIG_PYOBJECT(ePyObject) );
163         PyObject *readCICaIds(int slotid);
164 };
165
166 #endif