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 <array>
31#include <cstdint>
32#include <cstdio>
33#include <vector>
34
35#include <pthread.h>
36#include <sys/types.h>
37#include <sys/socket.h>
38#include <netinet/in.h>
39#include <sys/un.h>
40#include <sys/stat.h>
41#include <sys/uio.h>
42
44
45using dvbca_vector = std::vector<uint16_t>;
46
47class cMutex {
48 friend class cCondVar;
49private:
50 pthread_mutex_t m_mutex {};
51 pid_t m_lockingPid {0};
52 int m_locked {0};
53public:
54 cMutex(void) { pthread_mutex_init(&m_mutex, nullptr); }
55 ~cMutex() { pthread_mutex_destroy(&m_mutex); }
56 void Lock(void);
57 void Unlock(void);
58 };
59
61private:
62 cMutex *m_mutex {nullptr};
63 bool m_locked {false};
64public:
65 explicit cMutexLock(cMutex *Mutex = nullptr) { Lock(Mutex); }
67 bool Lock(cMutex *Mutex);
68 };
69
70
71class cCiMMI;
72
73class cCiMenu {
74 friend class cCiMMI;
75private:
76 static constexpr int kMAX_CIMENU_ENTRIES { 64 };
77 cCiMMI *m_mmi {nullptr};
79 std::string m_titleText;
80 std::string m_subTitleText;
81 std::string m_bottomText;
82 std::vector<std::string> m_entries;
83 cCiMenu(cCiMMI *MMI, bool Selectable);
84public:
85 std::string TitleText(void) { return m_titleText; }
86 std::string SubTitleText(void) { return m_subTitleText; }
87 std::string BottomText(void) { return m_bottomText; }
88 std::string Entry(int n)
89 { if (n < static_cast<int>(m_entries.size())) return m_entries[n]; return {}; }
90 int NumEntries(void) const { return m_entries.size(); }
91 bool Selectable(void) const { return m_selectable; }
92 bool Select(int Index);
93 bool Cancel(void);
94 };
95
97 friend class cCiMMI;
98private:
99 cCiMMI *m_mmi {nullptr};
100 std::string m_text;
101 bool m_blind {false};
103 explicit cCiEnquiry(cCiMMI *MMI) : m_mmi(MMI) {}
104public:
105 std::string Text(void) { return m_text; }
106 bool Blind(void) const { return m_blind; }
107 int ExpectedLength(void) const { return m_expectedLength; }
108 bool Reply(const char *s);
109 bool Cancel(void);
110 };
111
112// Ca Pmt List Management:
113
114enum CPLM : uint8_t {
115 CPLM_MORE = 0x00,
117 CPLM_LAST = 0x02,
118 CPLM_ONLY = 0x03,
119 CPLM_ADD = 0x04,
121};
122
123class cCiCaPmt {
125 friend class cHlCiHandler;
126private:
127 int m_length {0};
129 std::array<uint8_t,2048> m_capmt {0};
130public:
131 explicit cCiCaPmt(int ProgramNumber, uint8_t cplm = CPLM_ONLY);
132 void AddElementaryStream(int type, int pid);
133 void AddCaDescriptor(int ca_system_id, int ca_pid, int data_len,
134 const uint8_t *data);
135 };
136
137static constexpr int8_t MAX_CI_SESSION {16}; //XXX
138
139class cCiSession;
142
144public:
145 virtual ~cCiHandler() = default;
146 static cCiHandler *CreateCiHandler(const char *FileName);
147 virtual int NumSlots(void) = 0;
148 virtual bool Process(void) = 0;
149 virtual bool HasUserIO(void) = 0;
150 virtual bool NeedCaPmt(void) = 0;
151 virtual bool EnterMenu(int Slot) = 0;
152 virtual cCiMenu *GetMenu(void) = 0;
153 virtual cCiEnquiry *GetEnquiry(void) = 0;
154 virtual dvbca_vector GetCaSystemIds(int Slot) = 0;
155 virtual bool SetCaPmt(cCiCaPmt &CaPmt, int Slot) = 0;
156 virtual void SetTimeOffset(double /*offset_in_seconds*/) { }
157 };
158
159class cLlCiHandler : public cCiHandler {
160 friend class cCiHandler;
161private:
165 bool m_newCaSupport {false};
166 bool m_hasUserIO {false};
167 bool m_needCaPmt {false};
168 std::array<cCiSession*,MAX_CI_SESSION> m_sessions {};
171 static int ResourceIdToInt(const uint8_t *Data);
172 bool Send(uint8_t Tag, int SessionId, int ResourceId = 0, int Status = -1);
173 cCiSession *GetSessionBySessionId(int SessionId);
174 cCiSession *GetSessionByResourceId(int ResourceId, int Slot);
175 cCiSession *CreateSession(int ResourceId);
176 bool OpenSession(int Length, const uint8_t *Data);
177 bool CloseSession(int SessionId);
178 int CloseAllSessions(int Slot);
179 cLlCiHandler(int Fd, int NumSlots);
180public:
181 ~cLlCiHandler() override;
182 cLlCiHandler(const cLlCiHandler &) = delete; // not copyable
183 cLlCiHandler &operator=(const cLlCiHandler &) = delete; // not copyable
184 int NumSlots(void) override // cCiHandler
185 { return m_numSlots; }
186 bool Process(void) override; // cCiHandler
187 bool HasUserIO(void) override // cCiHandler
188 { return m_hasUserIO; }
189 bool NeedCaPmt(void) override // cCiHandler
190 { return m_needCaPmt; }
191 bool EnterMenu(int Slot) override; // cCiHandler
192 cCiMenu *GetMenu(void) override; // cCiHandler
193 cCiEnquiry *GetEnquiry(void) override; // cCiHandler
194 bool SetCaPmt(cCiCaPmt &CaPmt);
195 dvbca_vector GetCaSystemIds(int Slot) override; // cCiHandler
196 bool SetCaPmt(cCiCaPmt &CaPmt, int Slot) override; // cCiHandler
197 void SetTimeOffset(double offset_in_seconds) override; // cCiHandler
198 bool Reset(int Slot);
199 static bool connected();
200 };
201
202class cHlCiHandler : public cCiHandler {
203 friend class cCiHandler;
204 private:
208 int m_state {0};
211 cHlCiHandler(int Fd, int NumSlots);
212 int CommHL(unsigned tag, unsigned function, struct ca_msg *msg) const;
213 int GetData(unsigned tag, struct ca_msg *msg);
214 int SendData(unsigned tag, struct ca_msg *msg);
215 public:
216 ~cHlCiHandler() override;
217 int NumSlots(void) override // cCiHandler
218 { return m_numSlots; }
219 bool Process(void) override; // cCiHandler
220 bool HasUserIO(void) override { return false; } // cCiHandler
221 bool NeedCaPmt(void) override; // cCiHandler
222 bool EnterMenu(int Slot) override; // cCiHandler
223 cCiMenu *GetMenu(void) override; // cCiHandler
224 cCiEnquiry *GetEnquiry(void) override; // cCiHandler
225 bool SetCaPmt(cCiCaPmt &CaPmt);
226 dvbca_vector GetCaSystemIds(int Slot) override; // cCiHandler
227 bool SetCaPmt(cCiCaPmt &CaPmt, int Slot) override; // cCiHandler
228 bool Reset(int Slot) const;
229 bool connected() const;
230};
231
232int tcp_listen(struct sockaddr_in *name,int sckt,unsigned long address=INADDR_ANY);
233int accept_tcp(int ip_sock,struct sockaddr_in *ip_name);
234int udp_listen(struct sockaddr_un *name,char const * filename);
235int accept_udp(int ip_sock,struct sockaddr_un *ip_name);
236
237#endif // DVBCI_H
void AddCaDescriptor(int ca_system_id, int ca_pid, int data_len, const uint8_t *data)
Definition: dvbci.cpp:1524
int m_length
Definition: dvbci.h:127
std::array< uint8_t, 2048 > m_capmt
XXX is there a specified maximum?
Definition: dvbci.h:129
int m_infoLengthPos
Definition: dvbci.h:128
void AddElementaryStream(int type, int pid)
Definition: dvbci.cpp:1489
cCiCaPmt(int ProgramNumber, uint8_t cplm=CPLM_ONLY)
Definition: dvbci.cpp:1476
std::string Text(void)
Definition: dvbci.h:105
bool Reply(const char *s)
Definition: dvbci.cpp:1455
int m_expectedLength
Definition: dvbci.h:102
int ExpectedLength(void) const
Definition: dvbci.h:107
cCiEnquiry(cCiMMI *MMI)
Definition: dvbci.h:103
bool Blind(void) const
Definition: dvbci.h:106
bool Cancel(void)
Definition: dvbci.cpp:1460
bool m_blind
Definition: dvbci.h:101
cCiMMI * m_mmi
Definition: dvbci.h:99
std::string m_text
Definition: dvbci.h:100
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:156
virtual dvbca_vector GetCaSystemIds(int Slot)=0
Definition: dvbci.h:73
bool m_selectable
Definition: dvbci.h:78
std::string BottomText(void)
Definition: dvbci.h:87
bool Selectable(void) const
Definition: dvbci.h:91
static constexpr int kMAX_CIMENU_ENTRIES
XXX is there a specified maximum?
Definition: dvbci.h:76
bool Select(int Index)
Definition: dvbci.cpp:1441
std::string TitleText(void)
Definition: dvbci.h:85
cCiMenu(cCiMMI *MMI, bool Selectable)
Definition: dvbci.cpp:1434
std::string m_subTitleText
Definition: dvbci.h:80
cCiMMI * m_mmi
Definition: dvbci.h:77
std::string Entry(int n)
Definition: dvbci.h:88
std::vector< std::string > m_entries
Definition: dvbci.h:82
int NumEntries(void) const
Definition: dvbci.h:90
std::string m_bottomText
Definition: dvbci.h:81
std::string m_titleText
Definition: dvbci.h:79
bool Cancel(void)
Definition: dvbci.cpp:1448
std::string SubTitleText(void)
Definition: dvbci.h:86
bool NeedCaPmt(void) override
Definition: dvbci.cpp:2029
int m_state
Definition: dvbci.h:208
int SendData(unsigned tag, struct ca_msg *msg)
Definition: dvbci.cpp:1923
int m_numCaSystemIds
Definition: dvbci.h:209
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:207
bool HasUserIO(void) override
Definition: dvbci.h:220
bool SetCaPmt(cCiCaPmt &CaPmt)
bool connected() const
dvbca_vector m_caSystemIds
Definition: dvbci.h:210
int m_fdCa
Definition: dvbci.h:206
cMutex m_mutex
Definition: dvbci.h:205
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:217
~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
std::array< cCiSession *, MAX_CI_SESSION > m_sessions
Definition: dvbci.h:168
bool Send(uint8_t Tag, int SessionId, int ResourceId=0, int Status=-1)
Definition: dvbci.cpp:1618
bool m_needCaPmt
Definition: dvbci.h:167
cCiMenu * GetMenu(void) override
Definition: dvbci.cpp:1828
bool m_hasUserIO
Definition: dvbci.h:166
~cLlCiHandler() override
Definition: dvbci.cpp:1572
bool m_newCaSupport
Definition: dvbci.h:165
cMutex m_mutex
Definition: dvbci.h:162
cLlCiHandler & operator=(const cLlCiHandler &)=delete
bool HasUserIO(void) override
Definition: dvbci.h:187
cCiEnquiry * GetEnquiry(void) override
Definition: dvbci.cpp:1839
bool Process(void) override
Definition: dvbci.cpp:1731
int NumSlots(void) override
Definition: dvbci.h:184
bool NeedCaPmt(void) override
Definition: dvbci.h:189
cCiTransportLayer * m_tpl
Definition: dvbci.h:169
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:163
cCiSession * GetSessionByResourceId(int ResourceId, int Slot)
Definition: dvbci.cpp:1644
int m_numSlots
Definition: dvbci.h:164
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:170
bool m_locked
Definition: dvbci.h:63
cMutexLock(cMutex *Mutex=nullptr)
Definition: dvbci.h:65
bool Lock(cMutex *Mutex)
Definition: dvbci.cpp:230
~cMutexLock()
Definition: dvbci.cpp:224
cMutex * m_mutex
Definition: dvbci.h:62
Definition: dvbci.h:47
void Lock(void)
Definition: dvbci.cpp:202
int m_locked
Definition: dvbci.h:52
pid_t m_lockingPid
Definition: dvbci.h:51
cMutex(void)
Definition: dvbci.h:54
pthread_mutex_t m_mutex
Definition: dvbci.h:50
~cMutex()
Definition: dvbci.h:55
friend class cCondVar
Definition: dvbci.h:48
void Unlock(void)
Definition: dvbci.cpp:211
int accept_tcp(int ip_sock, struct sockaddr_in *ip_name)
int accept_udp(int ip_sock, struct sockaddr_un *ip_name)
CPLM
Definition: dvbci.h:114
@ CPLM_FIRST
Definition: dvbci.h:116
@ CPLM_UPDATE
Definition: dvbci.h:120
@ CPLM_ADD
Definition: dvbci.h:119
@ CPLM_LAST
Definition: dvbci.h:117
@ CPLM_ONLY
Definition: dvbci.h:118
@ CPLM_MORE
Definition: dvbci.h:115
int tcp_listen(struct sockaddr_in *name, int sckt, unsigned long address=INADDR_ANY)
static constexpr int8_t MAX_CI_SESSION
Definition: dvbci.h:137
std::vector< uint16_t > dvbca_vector
Definition: dvbci.h:45
int udp_listen(struct sockaddr_un *name, char const *filename)