1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
|
#pragma once
/*
* Copyright (C) 2012-2013 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC; see the file COPYING. If not, see
* <http://www.gnu.org/licenses/>.
*
*/
#include "XBDateTime.h"
#include "FileItem.h"
#include "addons/include/xbmc_pvr_types.h"
#include "utils/Observer.h"
#include "threads/CriticalSection.h"
#include "utils/ISerializable.h"
#include <boost/shared_ptr.hpp>
namespace EPG
{
class CEpg;
}
namespace PVR
{
class CPVRDatabase;
class CPVRChannelGroupInternal;
class CPVRChannel;
typedef boost::shared_ptr<PVR::CPVRChannel> CPVRChannelPtr;
typedef struct
{
unsigned int channel;
unsigned int subchannel;
} pvr_channel_num;
/** PVR Channel class */
class CPVRChannel : public Observable, public ISerializable, public ISortable
{
friend class CPVRDatabase;
friend class CPVRChannelGroupInternal;
public:
/*! @brief Create a new channel */
CPVRChannel(bool bRadio = false);
CPVRChannel(const PVR_CHANNEL &channel, unsigned int iClientId);
CPVRChannel(const CPVRChannel &channel);
bool operator ==(const CPVRChannel &right) const;
bool operator !=(const CPVRChannel &right) const;
CPVRChannel &operator=(const CPVRChannel &channel);
virtual void Serialize(CVariant& value) const;
/*! @name XBMC related channel methods
*/
//@{
/*!
* @brief Delete this channel from the database and delete the corresponding EPG table if it exists.
* @return True if it was deleted successfully, false otherwise.
*/
bool Delete(void);
/*!
* @brief Update this channel tag with the data of the given channel tag.
* @param channel The new channel data.
* @return True if something changed, false otherwise.
*/
bool UpdateFromClient(const CPVRChannel &channel);
/*!
* @brief Persists the changes in the database.
* @param bQueueWrite Queue the change and write changes later.
* @return True if the changes were saved succesfully, false otherwise.
*/
bool Persist(bool bQueueWrite = false);
/*!
* @return The identifier given to this channel by the TV database.
*/
int ChannelID(void) const;
/*!
* @return True when not persisted yet, false otherwise.
*/
bool IsNew(void) const;
/*!
* @brief Set the identifier for this channel.
* @param iDatabaseId The new channel ID
* @return True if the something changed, false otherwise.
*/
bool SetChannelID(int iDatabaseId);
/*!
* @return The channel number used by XBMC by the currently active group.
*/
int ChannelNumber(void) const;
/*!
* @return The sub channel number used by XBMC by the currently active group.
*/
int SubChannelNumber(void) const;
/*!
* @return True if this channel is a radio channel, false if not.
*/
bool IsRadio(void) const { return m_bIsRadio; }
/*!
* @return True if this channel is hidden. False if not.
*/
bool IsHidden(void) const;
/**
* @return True when this is a sub channel, false if it's a main channel
*/
bool IsSubChannel(void) const;
/**
* @return the channel number, formatted as [channel] or [channel].[subchannel]
*/
std::string FormattedChannelNumber(void) const;
/**
* @return True when this channel is marked as sub channel by the add-on, false if it's marked as main channel
*/
bool IsClientSubChannel(void) const;
/*!
* @brief Set to true to hide this channel. Set to false to unhide it.
*
* Set to true to hide this channel. Set to false to unhide it.
* The EPG of hidden channels won't be updated.
* @param bIsHidden The new setting.
* @return True if the something changed, false otherwise.
*/
bool SetHidden(bool bIsHidden);
/*!
* @return True if this channel is locked. False if not.
*/
bool IsLocked(void) const;
/*!
* @brief Set to true to lock this channel. Set to false to unlock it.
*
* Set to true to lock this channel. Set to false to unlock it.
* Locked channels need can only be viewed if parental PIN entered.
* @param bIsLocked The new setting.
* @return True if the something changed, false otherwise.
*/
bool SetLocked(bool bIsLocked);
/*!
* @return True if a recording is currently running on this channel. False if not.
*/
bool IsRecording(void) const;
/*!
* @return The path to the icon for this channel.
*/
std::string IconPath(void) const;
/*!
* @return True if this user changed icon via GUI. False if not.
*/
bool IsUserSetIcon(void) const;
/*!
* @return True if the channel icon path exists
*/
bool IsIconExists(void) const;
/*!
* @return whether the user has changed the channel name through the GUI
*/
bool IsUserSetName(void) const;
/*!
* @brief Set the path to the icon for this channel.
* @param strIconPath The new path.
* @param bIsUserSetIcon true if user changed the icon via GUI, false otherwise.
* @return True if the something changed, false otherwise.
*/
bool SetIconPath(const std::string &strIconPath, bool bIsUserSetIcon = false);
/*!
* @return The name for this channel used by XBMC.
*/
std::string ChannelName(void) const;
/*!
* @brief Set the name for this channel used by XBMC.
* @param strChannelName The new channel name.
* @param bIsUserSetName whether the change was triggered by the user directly
* @return True if the something changed, false otherwise.
*/
bool SetChannelName(const std::string &strChannelName, bool bIsUserSetName = false);
/*!
* @return True if this channel is marked as virtual. False if not.
*/
bool IsVirtual(void) const;
/*!
* @brief True if this channel is marked as virtual. False if not.
* @param bIsVirtual The new value.
* @return True if the something changed, false otherwise.
*/
bool SetVirtual(bool bIsVirtual);
/*!
* @return Time channel has been watched last.
*/
time_t LastWatched() const;
/*!
* @brief Last time channel has been watched
* @param iLastWatched The new value.
* @return True if the something changed, false otherwise.
*/
bool SetLastWatched(time_t iLastWatched);
/*!
* @brief True if this channel has no file or stream name
* @return True if this channel has no file or stream name
*/
bool IsEmpty() const;
bool IsChanged() const;
//@}
/*! @name Client related channel methods
*/
//@{
/*!
* @brief A unique identifier for this channel.
*
* A unique identifier for this channel.
* It can be used to find the same channel on different providers
*
* @return The Unique ID.
*/
int UniqueID(void) const;
/*!
* @brief Change the unique identifier for this channel.
* @param iUniqueId The new unique ID.
* @return True if the something changed, false otherwise.
*/
bool SetUniqueID(int iUniqueId);
/*!
* @return The identifier of the client that serves this channel.
*/
int ClientID(void) const;
/*!
* @brief Set the identifier of the client that serves this channel.
* @param iClientId The new ID.
* @return True if the something changed, false otherwise.
*/
bool SetClientID(int iClientId);
/*!
* @return The channel number on the client.
*/
unsigned int ClientChannelNumber(void) const;
/*!
* @return The sub channel number on the client (ATSC).
*/
unsigned int ClientSubChannelNumber(void) const;
/*!
* @return The name of this channel on the client.
*/
std::string ClientChannelName(void) const;
/*!
* @brief The stream input type
*
* The stream input type
* If it is empty, ffmpeg will try to scan the stream to find the right input format.
* See "src/cores/dvdplayer/Codecs/ffmpeg/libavformat/allformats.c" for a
* list of the input formats.
*
* @return The stream input type
*/
std::string InputFormat(void) const;
/*!
* @brief The stream URL to access this channel.
*
* The stream URL to access this channel.
* If this is empty, then the client should be used to read from the channel.
*
* @return The stream URL to access this channel.
*/
std::string StreamURL(void) const;
/*!
* @brief Set the stream URL to access this channel.
*
* Set the stream URL to access this channel.
* If this is empty, then the client should be used to read from the channel.
*
* @param strStreamURL The new stream URL.
* @return True if the something changed, false otherwise.
*/
bool SetStreamURL(const std::string &strStreamURL);
/*!
* @brief The path in the XBMC VFS to be used by PVRManager to open and read the stream.
* @return The path in the XBMC VFS to be used by PVRManager to open and read the stream.
*/
std::string Path(void) const;
virtual void ToSortable(SortItem& sortable, Field field) const;
/*!
* @brief Update the path after the channel number in the internal group changed.
* @param group The internal group that contains this channel
* @param iNewChannelGroupPosition The new channel number in the group
*/
void UpdatePath(CPVRChannelGroupInternal* group, unsigned int iNewChannelGroupPosition);
/*!
* @brief Return true if this channel is encrypted.
*
* Return true if this channel is encrypted. Does not inform whether XBMC can play the file.
* Decryption should be done by the client.
*
* @return Return true if this channel is encrypted.
*/
bool IsEncrypted(void) const;
/*!
* @brief Return the encryption system ID for this channel. 0 for FTA.
*
* Return the encryption system ID for this channel. 0 for FTA.
* The values are documented on: http://www.dvb.org/index.php?id=174.
*
* @return Return the encryption system ID for this channel.
*/
int EncryptionSystem(void) const;
/*!
* @return A friendly name for the used encryption system.
*/
std::string EncryptionName(void) const;
//@}
/*! @name EPG methods
*/
//@{
/*!
* @return The ID of the EPG table to use for this channel or -1 if it isn't set.
*/
int EpgID(void) const;
/*!
* @brief Change the id of the epg that is linked to this channel
* @param iEpgId The new epg id
*/
void SetEpgID(int iEpgId);
/*!
* @brief Get the EPG table for this channel.
* @return The EPG for this channel.
*/
EPG::CEpg *GetEPG(void) const;
/*!
* @brief Get the EPG table for this channel.
* @param results The file list to store the results in.
* @return The number of tables that were added.
*/
int GetEPG(CFileItemList &results) const;
/*!
* @brief Clear the EPG for this channel.
* @return True if it was cleared, false if not.
*/
bool ClearEPG(void) const;
/*!
* @brief Get the EPG tag that is active on this channel now.
*
* Get the EPG tag that is active on this channel now.
* Will return an empty tag if there is none.
*
* @return The EPG tag that is active on this channel now.
*/
bool GetEPGNow(EPG::CEpgInfoTag &tag) const;
/*!
* @brief Get the EPG tag that is active on this channel next.
*
* Get the EPG tag that is active on this channel next.
* Will return an empty tag if there is none.
*
* @return The EPG tag that is active on this channel next.
*/
bool GetEPGNext(EPG::CEpgInfoTag &tag) const;
/*!
* @return Don't use an EPG for this channel if set to false.
*/
bool EPGEnabled(void) const;
/*!
* @brief Set to true if an EPG should be used for this channel. Set to false otherwise.
* @param bEPGEnabled The new value.
* @return True if the something changed, false otherwise.
*/
bool SetEPGEnabled(bool bEPGEnabled);
/*!
* @brief Get the name of the scraper to be used for this channel.
*
* Get the name of the scraper to be used for this channel.
* The default is 'client', which means the EPG should be loaded from the backend.
*
* @return The name of the scraper to be used for this channel.
*/
std::string EPGScraper(void) const;
/*!
* @brief Set the name of the scraper to be used for this channel.
*
* Set the name of the scraper to be used for this channel.
* Set to "client" to load the EPG from the backend
*
* @param strScraper The new scraper name.
* @return True if the something changed, false otherwise.
*/
bool SetEPGScraper(const std::string &strScraper);
void SetCachedChannelNumber(unsigned int iChannelNumber);
void SetCachedSubChannelNumber(unsigned int iSubChannelNumber);
bool CanRecord(void) const;
//@}
private:
/*!
* @brief Update the encryption name after SetEncryptionSystem() has been called.
*/
void UpdateEncryptionName(void);
/*! @name XBMC related channel data
*/
//@{
int m_iChannelId; /*!< the identifier given to this channel by the TV database */
bool m_bIsRadio; /*!< true if this channel is a radio channel, false if not */
bool m_bIsHidden; /*!< true if this channel is hidden, false if not */
bool m_bIsUserSetName; /*!< true if user set the channel name via GUI, false if not */
bool m_bIsUserSetIcon; /*!< true if user set the icon via GUI, false if not */
bool m_bIsLocked; /*!< true if channel is locked, false if not */
std::string m_strIconPath; /*!< the path to the icon for this channel */
std::string m_strChannelName; /*!< the name for this channel used by XBMC */
bool m_bIsVirtual; /*!< true if this channel is marked as virtual, false if not */
time_t m_iLastWatched; /*!< last time channel has been watched */
bool m_bChanged; /*!< true if anything in this entry was changed that needs to be persisted */
unsigned int m_iCachedChannelNumber; /*!< the cached channel number in the selected group */
unsigned int m_iCachedSubChannelNumber; /*!< the cached sub channel number in the selected group */
//@}
/*! @name EPG related channel data
*/
//@{
int m_iEpgId; /*!< the id of the EPG for this channel */
bool m_bEPGCreated; /*!< true if an EPG has been created for this channel */
bool m_bEPGEnabled; /*!< don't use an EPG for this channel if set to false */
std::string m_strEPGScraper; /*!< the name of the scraper to be used for this channel */
//@}
/*! @name Client related channel data
*/
//@{
int m_iUniqueId; /*!< the unique identifier for this channel */
int m_iClientId; /*!< the identifier of the client that serves this channel */
pvr_channel_num m_iClientChannelNumber; /*!< the channel number on the client */
std::string m_strClientChannelName; /*!< the name of this channel on the client */
std::string m_strInputFormat; /*!< the stream input type based on ffmpeg/libavformat/allformats.c */
std::string m_strStreamURL; /*!< URL of the stream. Use the client to read stream if this is empty */
std::string m_strFileNameAndPath; /*!< the filename to be used by PVRManager to open and read the stream */
int m_iClientEncryptionSystem; /*!< the encryption system used by this channel. 0 for FreeToAir, -1 for unknown */
std::string m_strClientEncryptionName; /*!< the name of the encryption system used by this channel */
//@}
CCriticalSection m_critSection;
};
}
|