MythTV master
dvbci.h
Go to the documentation of this file.
1/*
2 * ci.hh: Common Interface
3 *
4 * Copyright (C) 2000 Klaus Schmidinger
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
20 *
21 * The author can be reached at kls@cadsoft.de
22 *
23 * The project's page is at http://www.cadsoft.de/people/kls/vdr
24 *
25 */
26
27#ifndef DVBCI_H
28#define DVBCI_H
29
30#include <cstdint>
31#include <cstdio>
32#include <vector>
33
34#include <pthread.h>
35#include <sys/types.h>
36#include <sys/socket.h>
37#include <netinet/in.h>
38#include <sys/un.h>
39#include <sys/stat.h>
40#include <sys/uio.h>
41
43
44using dvbca_vector = std::vector<uint16_t>;
45
46class cMutex {
47 friend class cCondVar;
48private:
49 pthread_mutex_t m_mutex {};
50 pid_t m_lockingPid {0};
51 int m_locked {0};
52public:
53 cMutex(void) { pthread_mutex_init(&m_mutex, nullptr); }
54 ~cMutex() { pthread_mutex_destroy(&m_mutex); }
55 void Lock(void);
56 void Unlock(void);
57 };
58
60private:
61 cMutex *m_mutex {nullptr};
62 bool m_locked {false};
63public:
64 explicit cMutexLock(cMutex *Mutex = nullptr) { Lock(Mutex); }
66 bool Lock(cMutex *Mutex);
67 };
68
69
70class cCiMMI;
71
72class cCiMenu {
73 friend class cCiMMI;
74private:
75 enum { MAX_CIMENU_ENTRIES = 64 };
76 cCiMMI *m_mmi {nullptr};
78 std::string m_titleText;
79 std::string m_subTitleText;
80 std::string m_bottomText;
81 std::vector<std::string> m_entries;
82 cCiMenu(cCiMMI *MMI, bool Selectable);
83public:
84 const std::string TitleText(void) { return m_titleText; }
85 const std::string SubTitleText(void) { return m_subTitleText; }
86 const std::string BottomText(void) { return m_bottomText; }
87 const std::string Entry(int n)
88 { if (n < static_cast<int>(m_entries.size())) return m_entries[n]; return {}; }
89 int NumEntries(void) const { return m_entries.size(); }
90 bool Selectable(void) const { return m_selectable; }
91 bool Select(int Index);
92 bool Cancel(void);
93 };
94
96 friend class cCiMMI;
97private:
98 cCiMMI *m_mmi {nullptr};
99 std::string m_text;
100 bool m_blind {false};
102 explicit cCiEnquiry(cCiMMI *MMI) : m_mmi(MMI) {}
103public:
104 const std::string Text(void) { return m_text; }
105 bool Blind(void) const { return m_blind; }
106 int ExpectedLength(void) const { return m_expectedLength; }
107 bool Reply(const char *s);
108 bool Cancel(void);
109 };
110
111// Ca Pmt List Management:
112
113#define CPLM_MORE 0x00
114#define CPLM_FIRST 0x01
115#define CPLM_LAST 0x02
116#define CPLM_ONLY 0x03
117#define CPLM_ADD 0x04
118#define CPLM_UPDATE 0x05
119
120class cCiCaPmt {
122 friend class cHlCiHandler;
123private:
124 int m_length {0};
126 uint8_t m_capmt[2048] {0};
127public:
128 explicit cCiCaPmt(int ProgramNumber, uint8_t cplm = CPLM_ONLY);
129 void AddElementaryStream(int type, int pid);
130 void AddCaDescriptor(int ca_system_id, int ca_pid, int data_len,
131 const uint8_t *data);
132 };
133
134#define MAX_CI_SESSION 16 //XXX
135
136class cCiSession;
139
141public:
142 virtual ~cCiHandler() = default;
143 static cCiHandler *CreateCiHandler(const char *FileName);
144 virtual int NumSlots(void) = 0;
145 virtual bool Process(void) = 0;
146 virtual bool HasUserIO(void) = 0;
147 virtual bool NeedCaPmt(void) = 0;
148 virtual bool EnterMenu(int Slot) = 0;
149 virtual cCiMenu *GetMenu(void) = 0;
150 virtual cCiEnquiry *GetEnquiry(void) = 0;
151 virtual dvbca_vector GetCaSystemIds(int Slot) = 0;
152 virtual bool SetCaPmt(cCiCaPmt &CaPmt, int Slot) = 0;
153 virtual void SetTimeOffset(double /*offset_in_seconds*/) { }
154 };
155
156class cLlCiHandler : public cCiHandler {
157 friend class cCiHandler;
158private:
162 bool m_newCaSupport {false};
163 bool m_hasUserIO {false};
164 bool m_needCaPmt {false};
168 static int ResourceIdToInt(const uint8_t *Data);
169 bool Send(uint8_t Tag, int SessionId, int ResourceId = 0, int Status = -1);
170 cCiSession *GetSessionBySessionId(int SessionId);
171 cCiSession *GetSessionByResourceId(int ResourceId, int Slot);
172 cCiSession *CreateSession(int ResourceId);
173 bool OpenSession(int Length, const uint8_t *Data);
174 bool CloseSession(int SessionId);
175 int CloseAllSessions(int Slot);
176 cLlCiHandler(int Fd, int NumSlots);
177public:
178 ~cLlCiHandler() override;
179 cLlCiHandler(const cLlCiHandler &) = delete; // not copyable
180 cLlCiHandler &operator=(const cLlCiHandler &) = delete; // not copyable
181 int NumSlots(void) override // cCiHandler
182 { return m_numSlots; }
183 bool Process(void) override; // cCiHandler
184 bool HasUserIO(void) override // cCiHandler
185 { return m_hasUserIO; }
186 bool NeedCaPmt(void) override // cCiHandler
187 { return m_needCaPmt; }
188 bool EnterMenu(int Slot) override; // cCiHandler
189 cCiMenu *GetMenu(void) override; // cCiHandler
190 cCiEnquiry *GetEnquiry(void) override; // cCiHandler
191 bool SetCaPmt(cCiCaPmt &CaPmt);
192 dvbca_vector GetCaSystemIds(int Slot) override; // cCiHandler
193 bool SetCaPmt(cCiCaPmt &CaPmt, int Slot) override; // cCiHandler
194 void SetTimeOffset(double offset_in_seconds) override; // cCiHandler
195 bool Reset(int Slot);
196 static bool connected();
197 };
198
199class cHlCiHandler : public cCiHandler {
200 friend class cCiHandler;
201 private:
205 int m_state {0};
208 cHlCiHandler(int Fd, int NumSlots);
209 int CommHL(unsigned tag, unsigned function, struct ca_msg *msg) const;
210 int GetData(unsigned tag, struct ca_msg *msg);
211 int SendData(unsigned tag, struct ca_msg *msg);
212 public:
213 ~cHlCiHandler() override;
214 int NumSlots(void) override // cCiHandler
215 { return m_numSlots; }
216 bool Process(void) override; // cCiHandler
217 bool HasUserIO(void) override { return false; } // cCiHandler
218 bool NeedCaPmt(void) override; // cCiHandler
219 bool EnterMenu(int Slot) override; // cCiHandler
220 cCiMenu *GetMenu(void) override; // cCiHandler
221 cCiEnquiry *GetEnquiry(void) override; // cCiHandler
222 bool SetCaPmt(cCiCaPmt &CaPmt);
223 dvbca_vector GetCaSystemIds(int Slot) override; // cCiHandler
224 bool SetCaPmt(cCiCaPmt &CaPmt, int Slot) override; // cCiHandler
225 bool Reset(int Slot) const;
226 bool connected() const;
227};
228
229int tcp_listen(struct sockaddr_in *name,int sckt,unsigned long address=INADDR_ANY);
230int accept_tcp(int ip_sock,struct sockaddr_in *ip_name);
231int udp_listen(struct sockaddr_un *name,char const * filename);
232int accept_udp(int ip_sock,struct sockaddr_un *ip_name);
233
234#endif // DVBCI_H
void AddCaDescriptor(int ca_system_id, int ca_pid, int data_len, const uint8_t *data)
Definition: dvbci.cpp:1524
uint8_t m_capmt[2048]
XXX is there a specified maximum?
Definition: dvbci.h:126
int m_length
Definition: dvbci.h:124
int m_infoLengthPos
Definition: dvbci.h:125
void AddElementaryStream(int type, int pid)
Definition: dvbci.cpp:1489
cCiCaPmt(int ProgramNumber, uint8_t cplm=CPLM_ONLY)
Definition: dvbci.cpp:1476
bool Reply(const char *s)
Definition: dvbci.cpp:1455
int m_expectedLength
Definition: dvbci.h:101
int ExpectedLength(void) const
Definition: dvbci.h:106
const std::string Text(void)
Definition: dvbci.h:104
cCiEnquiry(cCiMMI *MMI)
Definition: dvbci.h:102
bool Blind(void) const
Definition: dvbci.h:105
bool Cancel(void)
Definition: dvbci.cpp:1460
bool m_blind
Definition: dvbci.h:100
cCiMMI * m_mmi
Definition: dvbci.h:98
std::string m_text
Definition: dvbci.h:99
virtual bool Process(void)=0
virtual bool HasUserIO(void)=0
virtual int NumSlots(void)=0
virtual cCiMenu * GetMenu(void)=0
static cCiHandler * CreateCiHandler(const char *FileName)
Definition: dvbci.cpp:1581
virtual bool NeedCaPmt(void)=0
virtual bool SetCaPmt(cCiCaPmt &CaPmt, int Slot)=0
virtual ~cCiHandler()=default
virtual bool EnterMenu(int Slot)=0
virtual cCiEnquiry * GetEnquiry(void)=0
virtual void SetTimeOffset(double)
Definition: dvbci.h:153
virtual dvbca_vector GetCaSystemIds(int Slot)=0
Definition: dvbci.h:72
bool m_selectable
Definition: dvbci.h:77
@ MAX_CIMENU_ENTRIES
Definition: dvbci.h:75
bool Selectable(void) const
Definition: dvbci.h:90
const std::string SubTitleText(void)
Definition: dvbci.h:85
bool Select(int Index)
Definition: dvbci.cpp:1441
const std::string Entry(int n)
Definition: dvbci.h:87
cCiMenu(cCiMMI *MMI, bool Selectable)
Definition: dvbci.cpp:1434
std::string m_subTitleText
Definition: dvbci.h:79
const std::string TitleText(void)
Definition: dvbci.h:84
cCiMMI * m_mmi
Definition: dvbci.h:76
std::vector< std::string > m_entries
Definition: dvbci.h:81
int NumEntries(void) const
Definition: dvbci.h:89
std::string m_bottomText
Definition: dvbci.h:80
std::string m_titleText
Definition: dvbci.h:78
const std::string BottomText(void)
Definition: dvbci.h:86
bool Cancel(void)
Definition: dvbci.cpp:1448
bool NeedCaPmt(void) override
Definition: dvbci.cpp:2029
int m_state
Definition: dvbci.h:205
int SendData(unsigned tag, struct ca_msg *msg)
Definition: dvbci.cpp:1923
int m_numCaSystemIds
Definition: dvbci.h:206
bool EnterMenu(int Slot) override
Definition: dvbci.cpp:1974
cHlCiHandler(int Fd, int NumSlots)
Definition: dvbci.cpp:1892
cCiMenu * GetMenu(void) override
Definition: dvbci.cpp:1979
cCiEnquiry * GetEnquiry(void) override
Definition: dvbci.cpp:1984
dvbca_vector GetCaSystemIds(int Slot) override
Definition: dvbci.cpp:1989
int m_numSlots
Definition: dvbci.h:204
bool HasUserIO(void) override
Definition: dvbci.h:217
bool SetCaPmt(cCiCaPmt &CaPmt)
bool connected() const
dvbca_vector m_caSystemIds
Definition: dvbci.h:207
int m_fdCa
Definition: dvbci.h:203
cMutex m_mutex
Definition: dvbci.h:202
bool Process(void) override
Definition: dvbci.cpp:1928
int GetData(unsigned tag, struct ca_msg *msg)
Definition: dvbci.cpp:1918
int NumSlots(void) override
Definition: dvbci.h:214
~cHlCiHandler() override
Definition: dvbci.cpp:1899
int CommHL(unsigned tag, unsigned function, struct ca_msg *msg) const
Definition: dvbci.cpp:1905
bool Reset(int Slot) const
Definition: dvbci.cpp:2020
bool CloseSession(int SessionId)
Definition: dvbci.cpp:1703
bool OpenSession(int Length, const uint8_t *Data)
Definition: dvbci.cpp:1673
int CloseAllSessions(int Slot)
Definition: dvbci.cpp:1719
bool Send(uint8_t Tag, int SessionId, int ResourceId=0, int Status=-1)
Definition: dvbci.cpp:1618
bool m_needCaPmt
Definition: dvbci.h:164
cCiMenu * GetMenu(void) override
Definition: dvbci.cpp:1828
bool m_hasUserIO
Definition: dvbci.h:163
~cLlCiHandler() override
Definition: dvbci.cpp:1572
bool m_newCaSupport
Definition: dvbci.h:162
cMutex m_mutex
Definition: dvbci.h:159
cLlCiHandler & operator=(const cLlCiHandler &)=delete
bool HasUserIO(void) override
Definition: dvbci.h:184
cCiSession * m_sessions[MAX_CI_SESSION]
Definition: dvbci.h:165
cCiEnquiry * GetEnquiry(void) override
Definition: dvbci.cpp:1839
bool Process(void) override
Definition: dvbci.cpp:1731
int NumSlots(void) override
Definition: dvbci.h:181
bool NeedCaPmt(void) override
Definition: dvbci.h:186
cCiTransportLayer * m_tpl
Definition: dvbci.h:166
void SetTimeOffset(double offset_in_seconds) override
Definition: dvbci.cpp:1865
cLlCiHandler(int Fd, int NumSlots)
Definition: dvbci.cpp:1565
cCiSession * CreateSession(int ResourceId)
Definition: dvbci.cpp:1653
bool EnterMenu(int Slot) override
Definition: dvbci.cpp:1821
static int ResourceIdToInt(const uint8_t *Data)
Definition: dvbci.cpp:1613
static bool connected()
Definition: dvbci.cpp:1885
cLlCiHandler(const cLlCiHandler &)=delete
int m_fdCa
Definition: dvbci.h:160
cCiSession * GetSessionByResourceId(int ResourceId, int Slot)
Definition: dvbci.cpp:1644
int m_numSlots
Definition: dvbci.h:161
dvbca_vector GetCaSystemIds(int Slot) override
Definition: dvbci.cpp:1850
bool Reset(int Slot)
Definition: dvbci.cpp:1878
cCiSession * GetSessionBySessionId(int SessionId)
Definition: dvbci.cpp:1635
bool SetCaPmt(cCiCaPmt &CaPmt)
cCiTransportConnection * m_tc
Definition: dvbci.h:167
bool m_locked
Definition: dvbci.h:62
cMutexLock(cMutex *Mutex=nullptr)
Definition: dvbci.h:64
bool Lock(cMutex *Mutex)
Definition: dvbci.cpp:230
~cMutexLock()
Definition: dvbci.cpp:224
cMutex * m_mutex
Definition: dvbci.h:61
Definition: dvbci.h:46
void Lock(void)
Definition: dvbci.cpp:202
int m_locked
Definition: dvbci.h:51
pid_t m_lockingPid
Definition: dvbci.h:50
cMutex(void)
Definition: dvbci.h:53
pthread_mutex_t m_mutex
Definition: dvbci.h:49
~cMutex()
Definition: dvbci.h:54
friend class cCondVar
Definition: dvbci.h:47
void Unlock(void)
Definition: dvbci.cpp:211
int accept_tcp(int ip_sock, struct sockaddr_in *ip_name)
#define CPLM_ONLY
Definition: dvbci.h:116
int accept_udp(int ip_sock, struct sockaddr_un *ip_name)
#define MAX_CI_SESSION
Definition: dvbci.h:134
int tcp_listen(struct sockaddr_in *name, int sckt, unsigned long address=INADDR_ANY)
std::vector< uint16_t > dvbca_vector
Definition: dvbci.h:44
int udp_listen(struct sockaddr_un *name, char const *filename)