2ef70b0e83eab137e1609e72467670819e32dec8
[enigma2.git] / lib / dvb_ci / dvbci.h
1 #ifndef __dvbci_dvbci_h
2 #define __dvbci_dvbci_h
3
4 #include <lib/base/ebase.h>
5
6 #include <set>
7 #include <queue>
8
9 class eDVBCISession;
10 class eDVBCIApplicationManagerSession;
11 class eDVBCICAManagerSession;
12 class eDVBCIMMISession;
13 class eDVBServicePMTHandler;
14 class eDVBCISlot;
15
16 struct queueData
17 {
18         __u8 prio;
19         unsigned char *data;
20         unsigned int len;
21         queueData( unsigned char *data, unsigned int len, __u8 prio = 0 )
22                 :prio(prio), data(data), len(len)
23         {
24
25         }
26         bool operator < ( const struct queueData &a ) const
27         {
28                 return prio < a.prio;
29         }
30 };
31
32 class eDVBCISlot: public iObject, public Object
33 {
34 DECLARE_REF(eDVBCISlot);
35 private:
36         int slotid;
37         int fd;
38         void data(int);
39         eSocketNotifier *notifier;
40
41         int state;
42         std::map<uint16_t, uint8_t> running_services;
43         eDVBCIApplicationManagerSession *application_manager;
44         eDVBCICAManagerSession *ca_manager;
45         eDVBCIMMISession *mmi_session;
46         std::priority_queue<queueData> sendqueue;
47 public:
48         enum {stateRemoved, stateInserted, stateInvalid, stateResetted};
49         int use_count;
50
51         eDVBCISlot(eMainloop *context, int nr);
52         ~eDVBCISlot();
53         
54         int send(const unsigned char *data, size_t len);
55
56         void setAppManager( eDVBCIApplicationManagerSession *session );
57         void setMMIManager( eDVBCIMMISession *session );
58         void setCAManager( eDVBCICAManagerSession *session );
59
60         eDVBCIApplicationManagerSession *getAppManager() { return application_manager; }
61         eDVBCIMMISession *getMMIManager() { return mmi_session; }
62         eDVBCICAManagerSession *getCAManager() { return ca_manager; }
63
64         int getState() { return state; }
65         int getSlotID();
66         int reset();
67         int startMMI();
68         int stopMMI();
69         int answerText(int answer);
70         int answerEnq(char *value);
71         int cancelEnq();
72         int getMMIState();
73         int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector<uint16_t> &caids=std::vector<uint16_t>());
74         void removeService(uint16_t program_number=0xFFFF);
75         int getNumOfServices() { return running_services.size(); }
76         
77         int enableTS(int enable, int tuner=0);
78
79 };
80
81 struct CIPmtHandler
82 {
83         eDVBServicePMTHandler *pmthandler;
84         eDVBCISlot *cislot;
85         CIPmtHandler()
86                 :pmthandler(NULL), cislot(NULL)
87         {}
88         CIPmtHandler( const CIPmtHandler &x )
89                 :pmthandler(x.pmthandler), cislot(x.cislot)
90         {}
91         CIPmtHandler( eDVBServicePMTHandler *ptr )
92                 :pmthandler(ptr), cislot(NULL)
93         {}
94         bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; }
95 };
96
97 typedef std::list<CIPmtHandler> PMTHandlerList;
98
99 class eDVBCIInterfaces
100 {
101 DECLARE_REF(eDVBCIInterfaces);
102         static eDVBCIInterfaces *instance;
103 private:
104         eSmartPtrList<eDVBCISlot> m_slots;
105         eDVBCISlot *getSlot(int slotid);
106
107         PMTHandlerList m_pmt_handlers; 
108 public:
109         eDVBCIInterfaces();
110         ~eDVBCIInterfaces();
111
112         void addPMTHandler(eDVBServicePMTHandler *pmthandler);
113         void removePMTHandler(eDVBServicePMTHandler *pmthandler);
114         void recheckPMTHandlers();
115         void gotPMT(eDVBServicePMTHandler *pmthandler);
116         void ciRemoved(eDVBCISlot *slot);
117
118         static eDVBCIInterfaces *getInstance();
119         
120         int reset(int slot);
121         int initialize(int slot);
122         int startMMI(int slot);
123         int stopMMI(int slot);
124         int answerText(int slot, int answer);
125         int answerEnq(int slot, char *value);
126         int cancelEnq(int slot);
127         int getMMIState(int slot);
128         int enableTS(int slot, int enable);
129         int sendCAPMT(int slot);
130 };
131
132 #endif