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