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 char *m_titleText {nullptr};
79 char *m_subTitleText {nullptr};
80 char *m_bottomText {nullptr};
82 int m_numEntries {0};
83 bool AddEntry(char *s);
84 cCiMenu(cCiMMI *MMI, bool Selectable);
85public:
86 ~cCiMenu();
87 const char *TitleText(void) { return m_titleText; }
88 const char *SubTitleText(void) { return m_subTitleText; }
89 const char *BottomText(void) { return m_bottomText; }
90 const char *Entry(int n) { return n < m_numEntries ? m_entries[n] : nullptr; }
91 int NumEntries(void) const { return m_numEntries; }
92 bool Selectable(void) const { return m_selectable; }
93 bool Select(int Index);
94 bool Cancel(void);
95 };
96
98 friend class cCiMMI;
99private:
100 cCiMMI *m_mmi {nullptr};
101 char *m_text {nullptr};
102 bool m_blind {false};
104 explicit cCiEnquiry(cCiMMI *MMI) : m_mmi(MMI) {}
105public:
106 ~cCiEnquiry();
107 const char *Text(void) { return m_text; }
108 bool Blind(void) const { return m_blind; }
109 int ExpectedLength(void) const { return m_expectedLength; }
110 bool Reply(const char *s);
111 bool Cancel(void);
112 };
113
114// Ca Pmt List Management:
115
116#define CPLM_MORE 0x00
117#define CPLM_FIRST 0x01
118#define CPLM_LAST 0x02
119#define CPLM_ONLY 0x03
120#define CPLM_ADD 0x04
121#define CPLM_UPDATE 0x05
122
123class cCiCaPmt {
125 friend class cHlCiHandler;
126private:
127 int m_length {0};
129 uint8_t m_capmt[2048] {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
137#define 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};
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:1551
uint8_t m_capmt[2048]
XXX is there a specified maximum?
Definition: dvbci.h:129
int m_length
Definition: dvbci.h:127
int m_infoLengthPos
Definition: dvbci.h:128
void AddElementaryStream(int type, int pid)
Definition: dvbci.cpp:1516
cCiCaPmt(int ProgramNumber, uint8_t cplm=CPLM_ONLY)
Definition: dvbci.cpp:1503
bool Reply(const char *s)
Definition: dvbci.cpp:1482
int m_expectedLength
Definition: dvbci.h:103
int ExpectedLength(void) const
Definition: dvbci.h:109
cCiEnquiry(cCiMMI *MMI)
Definition: dvbci.h:104
~cCiEnquiry()
Definition: dvbci.cpp:1477
bool Blind(void) const
Definition: dvbci.h:108
const char * Text(void)
Definition: dvbci.h:107
bool Cancel(void)
Definition: dvbci.cpp:1487
bool m_blind
Definition: dvbci.h:102
cCiMMI * m_mmi
Definition: dvbci.h:100
char * m_text
Definition: dvbci.h:101
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:1608
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:72
bool m_selectable
Definition: dvbci.h:77
int m_numEntries
Definition: dvbci.h:82
const char * TitleText(void)
Definition: dvbci.h:87
const char * BottomText(void)
Definition: dvbci.h:89
@ MAX_CIMENU_ENTRIES
Definition: dvbci.h:75
bool Selectable(void) const
Definition: dvbci.h:92
bool Select(int Index)
Definition: dvbci.cpp:1463
bool AddEntry(char *s)
Definition: dvbci.cpp:1454
const char * SubTitleText(void)
Definition: dvbci.h:88
cCiMenu(cCiMMI *MMI, bool Selectable)
Definition: dvbci.cpp:1439
char * m_bottomText
Definition: dvbci.h:80
~cCiMenu()
Definition: dvbci.cpp:1445
cCiMMI * m_mmi
Definition: dvbci.h:76
int NumEntries(void) const
Definition: dvbci.h:91
char * m_entries[MAX_CIMENU_ENTRIES]
Definition: dvbci.h:81
const char * Entry(int n)
Definition: dvbci.h:90
char * m_titleText
Definition: dvbci.h:78
char * m_subTitleText
Definition: dvbci.h:79
bool Cancel(void)
Definition: dvbci.cpp:1470
bool NeedCaPmt(void) override
Definition: dvbci.cpp:2056
int m_state
Definition: dvbci.h:208
int SendData(unsigned tag, struct ca_msg *msg)
Definition: dvbci.cpp:1950
int m_numCaSystemIds
Definition: dvbci.h:209
bool EnterMenu(int Slot) override
Definition: dvbci.cpp:2001
cHlCiHandler(int Fd, int NumSlots)
Definition: dvbci.cpp:1919
cCiMenu * GetMenu(void) override
Definition: dvbci.cpp:2006
cCiEnquiry * GetEnquiry(void) override
Definition: dvbci.cpp:2011
dvbca_vector GetCaSystemIds(int Slot) override
Definition: dvbci.cpp:2016
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:1955
int GetData(unsigned tag, struct ca_msg *msg)
Definition: dvbci.cpp:1945
int NumSlots(void) override
Definition: dvbci.h:217
~cHlCiHandler() override
Definition: dvbci.cpp:1926
int CommHL(unsigned tag, unsigned function, struct ca_msg *msg) const
Definition: dvbci.cpp:1932
bool Reset(int Slot) const
Definition: dvbci.cpp:2047
bool CloseSession(int SessionId)
Definition: dvbci.cpp:1730
bool OpenSession(int Length, const uint8_t *Data)
Definition: dvbci.cpp:1700
int CloseAllSessions(int Slot)
Definition: dvbci.cpp:1746
bool Send(uint8_t Tag, int SessionId, int ResourceId=0, int Status=-1)
Definition: dvbci.cpp:1645
bool m_needCaPmt
Definition: dvbci.h:167
cCiMenu * GetMenu(void) override
Definition: dvbci.cpp:1855
bool m_hasUserIO
Definition: dvbci.h:166
~cLlCiHandler() override
Definition: dvbci.cpp:1599
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
cCiSession * m_sessions[MAX_CI_SESSION]
Definition: dvbci.h:168
cCiEnquiry * GetEnquiry(void) override
Definition: dvbci.cpp:1866
bool Process(void) override
Definition: dvbci.cpp:1758
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:1892
cLlCiHandler(int Fd, int NumSlots)
Definition: dvbci.cpp:1592
cCiSession * CreateSession(int ResourceId)
Definition: dvbci.cpp:1680
bool EnterMenu(int Slot) override
Definition: dvbci.cpp:1848
static int ResourceIdToInt(const uint8_t *Data)
Definition: dvbci.cpp:1640
static bool connected()
Definition: dvbci.cpp:1912
cLlCiHandler(const cLlCiHandler &)=delete
int m_fdCa
Definition: dvbci.h:163
cCiSession * GetSessionByResourceId(int ResourceId, int Slot)
Definition: dvbci.cpp:1671
int m_numSlots
Definition: dvbci.h:164
dvbca_vector GetCaSystemIds(int Slot) override
Definition: dvbci.cpp:1877
bool Reset(int Slot)
Definition: dvbci.cpp:1905
cCiSession * GetSessionBySessionId(int SessionId)
Definition: dvbci.cpp:1662
bool SetCaPmt(cCiCaPmt &CaPmt)
cCiTransportConnection * m_tc
Definition: dvbci.h:170
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:119
int accept_udp(int ip_sock, struct sockaddr_un *ip_name)
#define MAX_CI_SESSION
Definition: dvbci.h:137
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)