summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <Klaus (dot) Schmidinger (at) tvdr (dot) de>2017-06-30 12:40:02 (GMT)
committerManuel Reimer <manuel.reimer@gmx.de>2018-03-26 15:50:41 (GMT)
commit3bfd5c028e3685a103c969d3753f5f937dcb95a4 (patch)
tree8beea04dcee2ae45a854c971af21df9231cdbe69
parenteb83af06acaa94f2c49d33d744cffa0ddf6a4385 (diff)
downloadvdr-3bfd5c028e3685a103c969d3753f5f937dcb95a4.tar.gz
vdr-3bfd5c028e3685a103c969d3753f5f937dcb95a4.tar.bz2
Version 2.3.8vdr-2.3.8
VDR developer version 2.3.8 is now available at ftp://ftp.tvdr.de/vdr/Developer/vdr-2.3.8.tar.bz2 A 'diff' against the previous version is available at ftp://ftp.tvdr.de/vdr/Developer/vdr-2.3.7-2.3.8.diff MD5 checksums: 2afe8b899b3af1967320c216c1315f3e vdr-2.3.8.tar.bz2 d6ef77c644432dde9a01a05280ca5228 vdr-2.3.7-2.3.8.diff WARNING: ======== This is a *developer* version. Even though *I* use it in my productive environment, I strongly recommend that you only use it under controlled conditions and for testing and debugging. Note: This is a "holiday release" ;-) ----- I'm going on vacation and just wanted to make the current source available before that. There will be at least one more developer version before the final stable version 2.4.0. The changes since version 2.3.7: - Updated links in the INSTALL file (thanks to Chris Mayo). - Fixed detecting whether a CAM replies to queries, which didn't work on some systems since the implementation of RI_HOST_CONTROL (reported by Daniel Scheller). - Added some missing locks when calling functions from cStatus or cSkin*, and added some text to status.h and skins.h, explaining the locking situation when such functions are called. - Fixed a possible crash in cStateLockLog. - Updated the Italian OSD texts (thanks to Diego Pierotto). - Now skipping a leading '/' in AddDirectory(), to avoid double slashes (reported by Chris Mayo). - Fixed drawing very long menu titles in the LCARS skin (reported by Matthias Senzel). - Timers are now linked to EPG events even if they are inactive. By default Events that are linked to inactive timers are marked with 'I' and 'i', depending on whether the timer would record the entire Event or only part of it. The function cSkinDisplayMenu::SetItemEvent() now has an additional parameter named TimerActive, which indicates whether the timer that would record this event (if any) is active. A plugin may react on this when displaying a menu line for an event. The old version of cSkinDisplayMenu::SetItemEvent() (without the TimerActive parameter) is still there for backwards compatibility. It may be removed in a future version, so plugin authors should switch to the new one. - Now using readdir() instead of readdir_r(), if GLIBC version 2.24 or newer is used (suggested by Frank Neumann). - Added a note to the log, indicating that no further invalid lock sequences will be reported until VDR is restarted. - Whenever a change is made to the recordings in the video directory, the SVDRP command UPDR is now sent to all peer VDRs, so that they will update their recordings list. This is especially useful if one VDR mounts the video directory of an other one into a subdirectory. - SVDRP peering can now be limited to the default SVDRP host (see MANUAL for details).
-rw-r--r--CONTRIBUTORS11
-rw-r--r--HISTORY32
-rw-r--r--INSTALL6
-rw-r--r--MANUAL12
-rw-r--r--ci.c30
-rw-r--r--config.h10
-rw-r--r--menu.c137
-rw-r--r--po/ar.po8
-rw-r--r--po/ca_ES.po8
-rw-r--r--po/cs_CZ.po8
-rw-r--r--po/da_DK.po8
-rw-r--r--po/de_DE.po8
-rw-r--r--po/el_GR.po8
-rw-r--r--po/es_ES.po8
-rw-r--r--po/et_EE.po8
-rw-r--r--po/fi_FI.po8
-rw-r--r--po/fr_FR.po8
-rw-r--r--po/hr_HR.po8
-rw-r--r--po/hu_HU.po8
-rw-r--r--po/it_IT.po14
-rw-r--r--po/lt_LT.po8
-rw-r--r--po/mk_MK.po8
-rw-r--r--po/nl_NL.po8
-rw-r--r--po/nn_NO.po8
-rw-r--r--po/pl_PL.po8
-rw-r--r--po/pt_PT.po8
-rw-r--r--po/ro_RO.po8
-rw-r--r--po/ru_RU.po8
-rw-r--r--po/sk_SK.po8
-rw-r--r--po/sl_SI.po8
-rw-r--r--po/sr_RS.po8
-rw-r--r--po/sv_SE.po8
-rw-r--r--po/tr_TR.po8
-rw-r--r--po/uk_UA.po8
-rw-r--r--po/zh_CN.po8
-rw-r--r--recording.c4
-rw-r--r--skinlcars.c4
-rw-r--r--skins.h25
-rw-r--r--status.h15
-rw-r--r--svdrp.c21
-rw-r--r--svdrp.h10
-rw-r--r--thread.c33
-rw-r--r--timers.c4
-rw-r--r--tools.c8
-rw-r--r--tools.h4
45 files changed, 462 insertions, 134 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 27b0bbb..04487a6 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -2117,7 +2117,7 @@ Martin Wache <M.Wache@gmx.net>
for suggesting to speed up anti-aliased font rendering by caching the blend indexes
for extending the option "Setup/Miscellaneous/Show channel names with source" to
"type" or "full"
- for making the "Channels" menu indicates whether a channel is encrypted or a radio
+ for making the "Channels" menu indicate whether a channel is encrypted or a radio
channel
Matthias Lenk <matthias.lenk@amd.com>
@@ -3037,6 +3037,8 @@ Frank Neumann <fnu@yavdr.org>
for reporting a problem with the default return value of cEpgHandler::BeginSegmentTransfer()
in derived classes that don't implement this function
for reporting uninitialized variable SdWatchdog in vdr.c
+ for suggesting to use readdir() instead of readdir_r(), if GLIBC version 2.24 or
+ newer is used
Gerald Dachs <vdr@dachsweb.de>
for reporting a problem with checking for minimum line length of 21 characters in
@@ -3102,6 +3104,8 @@ Frank Niederwipper <f.niederwipper@gmail.com>
Chris Mayo <aklhfex@gmail.com>
for reporting a problem with detecting frames on radio channels
for fixing the link to "svdrpsend (1)" in the vdr.1 man page
+ for updating links in the INSTALL file
+ for reporting double slashes in file names processed with AddDirectory()
Dominic Evans <oldmanuk@gmail.com>
for making the SVDRP command LSTC accepts channel IDs
@@ -3272,6 +3276,7 @@ Matthias Senzel <matthias.senzel@t-online.de>
for reporting a bug in switching channels in the Schedule menu after going through
various Now and Schedule menus for different channels
for the "jumpingseconds" patch
+ for reporting a bug in drawing very long menu titles in the LCARS skin
Marek Nazarko <mnazarko@gmail.com>
for translating OSD texts to the Polish language
@@ -3502,3 +3507,7 @@ Sergey Chernyavskiy <glenvt18@gmail.com>
Frank Richter <kulpstur@t-online.de>
for adding 'S3W ABS-3A' to sources.conf
+
+Daniel Scheller <d.scheller@gmx.net>
+ for reporting a problem with detecting whether a CAM replies to queries, which didn't
+ work on some systems since the implementation of RI_HOST_CONTROL
diff --git a/HISTORY b/HISTORY
index 45b7221..f5fea54 100644
--- a/HISTORY
+++ b/HISTORY
@@ -9129,3 +9129,35 @@ Video Disk Recorder Revision History
- Introduced the new macro DISABLE_TEMPLATES_COLLIDING_WITH_STL, which can be defined
before including tools.h in case some plugin needs to use the STL and gets error
messages regarding one of the template functions defined in tools.h.
+
+2017-06-30: Version 2.3.8
+
+- Updated links in the INSTALL file (thanks to Chris Mayo).
+- Fixed detecting whether a CAM replies to queries, which didn't work on some systems
+ since the implementation of RI_HOST_CONTROL (reported by Daniel Scheller).
+- Added some missing locks when calling functions from cStatus or cSkin*, and added
+ some text to status.h and skins.h, explaining the locking situation when such
+ functions are called.
+- Fixed a possible crash in cStateLockLog.
+- Updated the Italian OSD texts (thanks to Diego Pierotto).
+- Now skipping a leading '/' in AddDirectory(), to avoid double slashes (reported by
+ Chris Mayo).
+- Fixed drawing very long menu titles in the LCARS skin (reported by Matthias Senzel).
+- Timers are now linked to EPG events even if they are inactive. By default Events that
+ are linked to inactive timers are marked with 'I' and 'i', depending on whether the
+ timer would record the entire Event or only part of it.
+ The function cSkinDisplayMenu::SetItemEvent() now has an additional parameter named
+ TimerActive, which indicates whether the timer that would record this event (if any)
+ is active. A plugin may react on this when displaying a menu line for an event.
+ The old version of cSkinDisplayMenu::SetItemEvent() (without the TimerActive parameter)
+ is still there for backwards compatibility. It may be removed in a future version,
+ so plugin authors should switch to the new one.
+- Now using readdir() instead of readdir_r(), if GLIBC version 2.24 or newer is used
+ (suggested by Frank Neumann).
+- Added a note to the log, indicating that no further invalid lock sequences will be
+ reported until VDR is restarted.
+- Whenever a change is made to the recordings in the video directory, the SVDRP command
+ UPDR is now sent to all peer VDRs, so that they will update their recordings list.
+ This is especially useful if one VDR mounts the video directory of an other one into
+ a subdirectory.
+- SVDRP peering can now be limited to the default SVDRP host (see MANUAL for details).
diff --git a/INSTALL b/INSTALL
index f2218d1..74caf30 100644
--- a/INSTALL
+++ b/INSTALL
@@ -104,13 +104,13 @@ hardware in your system, for instance:
Plugin: Device:
dvbsddevice Full-Featured SD DVB cards (Fujitsu-Siemens Design)
- (comes with the VDR source)
+ ftp://ftp.tvdr.de/vdr/Plugins
dvbhddevice Full-featured HD DVB cards (Technotrend TT S2-6400)
https://bitbucket.org/powARman/dvbhddevice
rpihddevice Raspberry Pi
- http://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
+ https://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
-See http://linuxtv.org/vdrwiki/index.php/Output_devices for more.
+See https://linuxtv.org/vdrwiki/index.php/Output_devices for more.
Standard compliance
-------------------
diff --git a/MANUAL b/MANUAL
index 0234f77..47b2fdd 100644
--- a/MANUAL
+++ b/MANUAL
@@ -1085,8 +1085,16 @@ Version 2.2
connection after which the connection is automatically
closed. Default is 300, a value of 0 means no timeout.
- SVDRP peering = no Activates automatic connections between VDRs in the same
- network.
+ SVDRP peering = off Activates automatic connections between VDRs in the same
+ network. If set to "any hosts" this VDR will establish
+ connections with any available hosts. If set to "only
+ default host" this VDR will only connect to the VDR with
+ the name defined in "SVDRP default host". If no default
+ host has been defined, the behavior is the same as with
+ "any hosts". To switch from "off" to "only default host",
+ you may need to select "any hosts" first and confirm the
+ dialog by pressing "Ok" in order to be able to select a
+ default host.
SVDRP host name The name of this VDR, which is used when connecting VDRs
via SVDRP. By default, the machine's host name is used.
diff --git a/ci.c b/ci.c
index edb801b..b6ea326 100644
--- a/ci.c
+++ b/ci.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ci.c 4.17 2017/06/10 10:57:31 kls Exp $
+ * $Id: ci.c 4.18 2017/06/19 12:13:38 kls Exp $
*/
#include "ci.h"
@@ -1041,8 +1041,9 @@ void cCiCaPmt::MtdMapPids(cMtdMapper *MtdMapper)
#define CA_ENABLE(x) (((x) & CA_ENABLE_FLAG) ? (x) & ~CA_ENABLE_FLAG : 0)
-#define QUERY_WAIT_TIME 1000 // ms to wait before sending a query
+#define QUERY_WAIT_TIME 500 // ms to wait before sending a query
#define QUERY_REPLY_TIMEOUT 2000 // ms to wait for a reply to a query
+#define QUERY_RETRIES 6 // max. number of retries to check if there is a reply to a query
class cCiConditionalAccessSupport : public cCiSession {
private:
@@ -1051,6 +1052,7 @@ private:
int caSystemIds[MAXCASYSTEMIDS + 1]; // list is zero terminated!
bool repliesToQuery;
cTimeMs timer;
+ int numRetries;
public:
cCiConditionalAccessSupport(uint16_t SessionId, cCiTransportConnection *Tc);
virtual void Process(int Length = 0, const uint8_t *Data = NULL);
@@ -1069,6 +1071,7 @@ cCiConditionalAccessSupport::cCiConditionalAccessSupport(uint16_t SessionId, cCi
state = 0; // inactive
caSystemIds[numCaSystemIds = 0] = 0;
repliesToQuery = false;
+ numRetries = 0;
}
void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
@@ -1098,7 +1101,8 @@ void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
caSystemIds[numCaSystemIds] = 0;
dbgprotocol("\n");
if (state == 1) {
- timer.Set(QUERY_WAIT_TIME); // WORKAROUND: Alphacrypt 3.09 doesn't reply to QUERY immediately after reset
+ timer.Set(0);
+ numRetries = QUERY_RETRIES;
state = 2; // got ca info
}
dsyslog("CAM %d: system ids:%s", CamSlot()->SlotNumber(), *Ids ? *Ids : " none");
@@ -1171,15 +1175,17 @@ void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
SendData(AOT_CA_INFO_ENQ);
state = 1; // enquired ca info
}
- else if (state == 2 && timer.TimedOut()) {
- cCiCaPmt CaPmt(CPCI_QUERY, 0, 0, 0, NULL);
- SendPMT(&CaPmt);
- timer.Set(QUERY_REPLY_TIMEOUT);
- state = 3; // waiting for reply
- }
- else if (state == 3 && timer.TimedOut()) {
- dsyslog("CAM %d: doesn't reply to QUERY - only a single channel can be decrypted", CamSlot()->SlotNumber());
- state = 4; // normal operation
+ else if ((state == 2 || state == 3) && timer.TimedOut()) {
+ if (numRetries-- > 0) {
+ cCiCaPmt CaPmt(CPCI_QUERY, 0, 0, 0, NULL);
+ SendPMT(&CaPmt);
+ timer.Set(QUERY_WAIT_TIME);
+ state = 3; // waiting for reply
+ }
+ else {
+ dsyslog("CAM %d: doesn't reply to QUERY - only a single channel can be decrypted", CamSlot()->SlotNumber());
+ state = 4; // normal operation
+ }
}
}
diff --git a/config.h b/config.h
index 4da4ae7..93488be 100644
--- a/config.h
+++ b/config.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: config.h 4.11 2017/06/05 11:15:37 kls Exp $
+ * $Id: config.h 4.12 2017/06/12 08:58:26 kls Exp $
*/
#ifndef __CONFIG_H
@@ -22,13 +22,13 @@
// VDR's own version number:
-#define VDRVERSION "2.3.7"
-#define VDRVERSNUM 20307 // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION "2.3.8"
+#define VDRVERSNUM 20308 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
-#define APIVERSION "2.3.7"
-#define APIVERSNUM 20307 // Version * 10000 + Major * 100 + Minor
+#define APIVERSION "2.3.8"
+#define APIVERSNUM 20308 // Version * 10000 + Major * 100 + Minor
// When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to
diff --git a/menu.c b/menu.c
index 2d84194..c2c12dd 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 4.37 2017/06/10 19:19:51 kls Exp $
+ * $Id: menu.c 4.41 2017/06/30 09:49:39 kls Exp $
*/
#include "menu.h"
@@ -1477,6 +1477,7 @@ public:
const cChannel *channel;
bool withDate;
eTimerMatch timerMatch;
+ bool timerActive;
cMenuScheduleItem(const cTimers *Timers, const cEvent *Event, const cChannel *Channel = NULL, bool WithDate = false);
static void SetSortMode(eScheduleSortMode SortMode) { sortMode = SortMode; }
static void IncSortMode(void) { sortMode = eScheduleSortMode((sortMode == ssmAllAll) ? ssmAllThis : sortMode + 1); }
@@ -1494,6 +1495,7 @@ cMenuScheduleItem::cMenuScheduleItem(const cTimers *Timers, const cEvent *Event,
channel = Channel;
withDate = WithDate;
timerMatch = tmNone;
+ timerActive = false;
Update(Timers, true);
}
@@ -1508,15 +1510,17 @@ int cMenuScheduleItem::Compare(const cListObject &ListObject) const
return r;
}
-static const char *TimerMatchChars = " tT";
+static const char *TimerMatchChars = " tT iI";
bool cMenuScheduleItem::Update(const cTimers *Timers, bool Force)
{
eTimerMatch OldTimerMatch = timerMatch;
- Timers->GetMatch(event, &timerMatch);
- if (Force || timerMatch != OldTimerMatch) {
+ bool OldTimerActive = timerActive;
+ const cTimer *Timer = Timers->GetMatch(event, &timerMatch);
+ timerActive = Timer && Timer->HasFlags(tfActive);
+ if (Force || timerMatch != OldTimerMatch || timerActive != OldTimerActive) {
cString buffer;
- char t = TimerMatchChars[timerMatch];
+ char t = TimerMatchChars[timerMatch + (timerActive ? 0 : 3)];
char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' ';
char r = event->SeenWithin(30) && event->IsRunning() ? '*' : ' ';
const char *csn = channel ? channel->ShortName(true) : NULL;
@@ -1535,7 +1539,7 @@ bool cMenuScheduleItem::Update(const cTimers *Timers, bool Force)
void cMenuScheduleItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
- if (!DisplayMenu->SetItemEvent(event, Index, Current, Selectable, channel, withDate, timerMatch))
+ if (!DisplayMenu->SetItemEvent(event, Index, Current, Selectable, channel, withDate, timerMatch, timerActive))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
@@ -1652,30 +1656,30 @@ eOSState cMenuWhatsOn::Switch(void)
eOSState cMenuWhatsOn::Record(void)
{
if (cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current())) {
- LOCK_TIMERS_WRITE;
- LOCK_CHANNELS_READ;
- LOCK_SCHEDULES_READ;
- Timers->SetExplicitModify();
- if (item->timerMatch == tmFull) {
- if (cTimer *Timer = Timers->GetMatch(item->event))
- return AddSubMenu(new cMenuEditTimer(Timer));
- }
- cTimer *Timer = new cTimer(item->event);
- if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
- Timer->SetRemote(Setup.SVDRPDefaultHost);
- if (cTimer *t = Timers->GetTimer(Timer)) {
- delete Timer;
- Timer = t;
- return AddSubMenu(new cMenuEditTimer(Timer));
- }
- if (Timer->Matches(0, false, NEWTIMERLIMIT))
- return AddSubMenu(new cMenuEditTimer(Timer, true));
- Timers->Add(Timer);
- Timers->SetModified();
- if (!HandleRemoteModifications(Timer)) {
- // must add the timer before HandleRemoteModifications to get proper log messages with timer ids
- Timers->Del(Timer);
- }
+ LOCK_TIMERS_WRITE;
+ LOCK_CHANNELS_READ;
+ LOCK_SCHEDULES_READ;
+ Timers->SetExplicitModify();
+ if (item->timerMatch == tmFull) {
+ if (cTimer *Timer = Timers->GetMatch(item->event))
+ return AddSubMenu(new cMenuEditTimer(Timer));
+ }
+ cTimer *Timer = new cTimer(item->event);
+ if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
+ Timer->SetRemote(Setup.SVDRPDefaultHost);
+ if (cTimer *t = Timers->GetTimer(Timer)) {
+ delete Timer;
+ Timer = t;
+ return AddSubMenu(new cMenuEditTimer(Timer));
+ }
+ if (Timer->Matches(0, false, NEWTIMERLIMIT))
+ return AddSubMenu(new cMenuEditTimer(Timer, true));
+ Timers->Add(Timer);
+ Timers->SetModified();
+ if (!HandleRemoteModifications(Timer)) {
+ // must add the timer before HandleRemoteModifications to get proper log messages with timer ids
+ Timers->Del(Timer);
+ }
if (HasSubMenu())
CloseSubMenu();
if (Update())
@@ -1714,7 +1718,10 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key)
for (cOsdItem *item = First(); item; item = Next(item)) {
if (((cMenuScheduleItem *)item)->channel->Number() == cDevice::CurrentChannel()) {
SetCurrent(item);
- Display();
+ {
+ LOCK_SCHEDULES_READ;
+ Display();
+ }
LOCK_CHANNELS_READ;
SetHelpKeys(Channels);
break;
@@ -1733,8 +1740,10 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key)
}
}
else if (!HasSubMenu()) {
- if (HadSubMenu && Update())
+ if (HadSubMenu && Update()) {
+ LOCK_SCHEDULES_READ;
Display();
+ }
if (Key != kNone) {
LOCK_CHANNELS_READ;
SetHelpKeys(Channels);
@@ -1953,32 +1962,30 @@ eOSState cMenuSchedule::Number(void)
eOSState cMenuSchedule::Record(void)
{
if (cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current())) {
- {
- LOCK_TIMERS_WRITE;
- LOCK_CHANNELS_READ;
- LOCK_SCHEDULES_READ;
- Timers->SetExplicitModify();
- if (item->timerMatch == tmFull) {
- if (cTimer *Timer = Timers->GetMatch(item->event))
- return AddSubMenu(new cMenuEditTimer(Timer));
- }
- cTimer *Timer = new cTimer(item->event);
- if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
- Timer->SetRemote(Setup.SVDRPDefaultHost);
- if (cTimer *t = Timers->GetTimer(Timer)) {
- delete Timer;
- Timer = t;
- return AddSubMenu(new cMenuEditTimer(Timer));
- }
- if (Timer->Matches(0, false, NEWTIMERLIMIT))
- return AddSubMenu(new cMenuEditTimer(Timer, true));
- Timers->Add(Timer);
- Timers->SetModified();
- if (!HandleRemoteModifications(Timer)) {
- // must add the timer before HandleRemoteModifications to get proper log messages with timer ids
- Timers->Del(Timer);
- }
- }
+ LOCK_TIMERS_WRITE;
+ LOCK_CHANNELS_READ;
+ LOCK_SCHEDULES_READ;
+ Timers->SetExplicitModify();
+ if (item->timerMatch == tmFull) {
+ if (cTimer *Timer = Timers->GetMatch(item->event))
+ return AddSubMenu(new cMenuEditTimer(Timer));
+ }
+ cTimer *Timer = new cTimer(item->event);
+ if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
+ Timer->SetRemote(Setup.SVDRPDefaultHost);
+ if (cTimer *t = Timers->GetTimer(Timer)) {
+ delete Timer;
+ Timer = t;
+ return AddSubMenu(new cMenuEditTimer(Timer));
+ }
+ if (Timer->Matches(0, false, NEWTIMERLIMIT))
+ return AddSubMenu(new cMenuEditTimer(Timer, true));
+ Timers->Add(Timer);
+ Timers->SetModified();
+ if (!HandleRemoteModifications(Timer)) {
+ // must add the timer before HandleRemoteModifications to get proper log messages with timer ids
+ Timers->Del(Timer);
+ }
if (HasSubMenu())
CloseSubMenu();
if (Update())
@@ -2077,8 +2084,10 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
Set(Timers, Channels, Channel, true);
}
}
- else if (HadSubMenu && Update())
+ else if (HadSubMenu && Update()) {
+ LOCK_SCHEDULES_READ;
Display();
+ }
if (Key != kNone)
SetHelpKeys();
}
@@ -3189,8 +3198,10 @@ eOSState cMenuRecordings::ProcessKey(eKeys Key)
return state; // closes all recording menus except for the top one
Set(); // this is the top level menu, so we refresh it...
Open(true); // ...and open any necessary submenus to show the new name
- if (!HasSubMenu())
+ if (!HasSubMenu()) {
+ LOCK_RECORDINGS_READ;
Display();
+ }
path = NULL;
fileName = NULL;
}
@@ -4012,6 +4023,7 @@ void cMenuSetupReplay::Store(void)
class cMenuSetupMisc : public cMenuSetupBase {
private:
+ const char *svdrpPeeringModeTexts[3];
const char *showChannelNamesWithSourceTexts[3];
cStringList svdrpServerNames;
void Set(void);
@@ -4023,6 +4035,9 @@ public:
cMenuSetupMisc::cMenuSetupMisc(void)
{
SetMenuCategory(mcSetupMisc);
+ svdrpPeeringModeTexts[0] = tr("off");
+ svdrpPeeringModeTexts[1] = tr("any hosts");
+ svdrpPeeringModeTexts[2] = tr("only default host");
showChannelNamesWithSourceTexts[0] = tr("off");
showChannelNamesWithSourceTexts[1] = tr("type");
showChannelNamesWithSourceTexts[2] = tr("full");
@@ -4037,7 +4052,7 @@ void cMenuSetupMisc::Set(void)
Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Min. event timeout (min)"), &data.MinEventTimeout));
Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Min. user inactivity (min)"), &data.MinUserInactivity));
Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$SVDRP timeout (s)"), &data.SVDRPTimeout));
- Add(new cMenuEditBoolItem(tr("Setup.Miscellaneous$SVDRP peering"), &data.SVDRPPeering));
+ Add(new cMenuEditStraItem(tr("Setup.Miscellaneous$SVDRP peering"), &data.SVDRPPeering, 3, svdrpPeeringModeTexts));
if (data.SVDRPPeering) {
Add(new cMenuEditStrItem( tr("Setup.Miscellaneous$SVDRP host name"), data.SVDRPHostName, sizeof(data.SVDRPHostName)));
if (GetSVDRPServerNames(&svdrpServerNames)) {
diff --git a/po/ar.po b/po/ar.po
index 267d518..f8b0394 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2008-10-16 11:16-0400\n"
"Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
"Language-Team: Arabic <ar@li.org>\n"
@@ -1302,6 +1302,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "رقم المواصلة"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/ca_ES.po b/po/ca_ES.po
index 42b2bc5..285f7e3 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Catalan <vdr@linuxtv.org>\n"
@@ -1301,6 +1301,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID de Continuar"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index 8036f12..3defcbd 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2010-05-06 11:00+0200\n"
"Last-Translator: Aleš Juřík <ajurik@quick.cz>\n"
"Language-Team: Czech <vdr@linuxtv.org>\n"
@@ -1301,6 +1301,12 @@ msgstr "Velikost skoku za použití tlačítek Zelená/Žlutá při opakování
msgid "Setup.Replay$Resume ID"
msgstr "ID obnovení"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/da_DK.po b/po/da_DK.po
index 5c3f870..906aa61 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: Danish <vdr@linuxtv.org>\n"
@@ -1298,6 +1298,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Genoptagelses ID"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/de_DE.po b/po/de_DE.po
index 7b1ac5e..d7e6576 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-10 13:45+0100\n"
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr "Sprungweite mit Taste Grn/Gelb bei Wiederh. (s)"
msgid "Setup.Replay$Resume ID"
msgstr "Wiedergabe-ID"
+msgid "any hosts"
+msgstr "mit jeder Maschine"
+
+msgid "only default host"
+msgstr "nur mit der Standardmaschine"
+
msgid "type"
msgstr "Typ"
diff --git a/po/el_GR.po b/po/el_GR.po
index b64518a..db382e8 100644
--- a/po/el_GR.po
+++ b/po/el_GR.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
"Language-Team: Greek <vdr@linuxtv.org>\n"
@@ -1298,6 +1298,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID "
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/es_ES.po b/po/es_ES.po
index a010c3f..e61ed66 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-19 23:00+0100\n"
"Last-Translator: Gabriel Bonich <gbonich@gmail.com>\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr "Saltar distancia con teclas verde/amarillo en la repeticin (s)"
msgid "Setup.Replay$Resume ID"
msgstr "ID de continuacin"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/et_EE.po b/po/et_EE.po
index 4026098..e58f97e 100644
--- a/po/et_EE.po
+++ b/po/et_EE.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
@@ -1298,6 +1298,12 @@ msgstr "Klahvide Roheline/Kollane korduv hüpe (s)"
msgid "Setup.Replay$Resume ID"
msgstr "Taasesituse tunnus"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/fi_FI.po b/po/fi_FI.po
index 6ed0af2..964d8d0 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2007-08-15 15:52+0200\n"
"Last-Translator: Matti Lehtimäki <matti.lehtimaki@gmail.com>\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n"
@@ -1302,6 +1302,12 @@ msgstr "Toistohypyn kesto värinäppäimillä (s)"
msgid "Setup.Replay$Resume ID"
msgstr "Tallenteen paluutunniste"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/fr_FR.po b/po/fr_FR.po
index 3a04653..e3c7e08 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-18 20:16+0100\n"
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
"Language-Team: French <vdr@linuxtv.org>\n"
@@ -1309,6 +1309,12 @@ msgstr "Durée du saut pour les touches Verte/Jaune en répétition (s)"
msgid "Setup.Replay$Resume ID"
msgstr "ID résumé"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/hr_HR.po b/po/hr_HR.po
index f7b3dd3..c70a5c3 100644
--- a/po/hr_HR.po
+++ b/po/hr_HR.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2008-03-17 19:00+0100\n"
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
"Language-Team: Croatian <vdr@linuxtv.org>\n"
@@ -1300,6 +1300,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID nastavka"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 9174994..d1f80b7 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-13 09:36+0200\n"
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
@@ -1303,6 +1303,12 @@ msgstr "Ismételt ugrástáv a Zöld/Sárga gombokkal (mp)"
msgid "Setup.Replay$Resume ID"
msgstr "Lejátszás azonosító"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/it_IT.po b/po/it_IT.po
index d27f1fb..5e214c5 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
-"PO-Revision-Date: 2015-09-14 19:28+0100\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
+"PO-Revision-Date: 2017-06-23 00:00+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n"
"Language: it\n"
@@ -1304,12 +1304,18 @@ msgstr "Durata spostamento con tasti Verde/Giallo in sequenza (s)"
msgid "Setup.Replay$Resume ID"
msgstr "ID di ripristino"
-msgid "type"
+msgid "any hosts"
msgstr ""
-msgid "full"
+msgid "only default host"
msgstr ""
+msgid "type"
+msgstr "tipo"
+
+msgid "full"
+msgstr "completo"
+
msgid "Miscellaneous"
msgstr "Generici"
diff --git a/po/lt_LT.po b/po/lt_LT.po
index 46e4618..2c1f3d7 100644
--- a/po/lt_LT.po
+++ b/po/lt_LT.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-11 14:02+0200\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@@ -1298,6 +1298,12 @@ msgstr "Praleisti atkarpą pakartojime (s) su Žaliu/Geltonu mygtukais"
msgid "Setup.Replay$Resume ID"
msgstr "Kūrinio ID"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/mk_MK.po b/po/mk_MK.po
index 69cf47f..d07af18 100644
--- a/po/mk_MK.po
+++ b/po/mk_MK.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-08 15:18+0100\n"
"Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
"Language-Team: Macedonian <en@li.org>\n"
@@ -1299,6 +1299,12 @@ msgstr "Дистанца на скокање со Зелено/Жолто коп
msgid "Setup.Replay$Resume ID"
msgstr "ID на продолжеток"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/nl_NL.po b/po/nl_NL.po
index 6a984e2..ed6223e 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-10 19:43+0100\n"
"Last-Translator: Erik Oomen <oomen.e@gmail.com>\n"
"Language-Team: Dutch <vdr@linuxtv.org>\n"
@@ -1304,6 +1304,12 @@ msgstr "Spoel sprong met groene en gele toesten in repeteerstand (s)"
msgid "Setup.Replay$Resume ID"
msgstr "Hervattings ID"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/nn_NO.po b/po/nn_NO.po
index 15c25ec..37eb906 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Resume ID"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/pl_PL.po b/po/pl_PL.po
index b9077a2..3a6ec65 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-12 00:59+0100\n"
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n"
@@ -1301,6 +1301,12 @@ msgstr "Pomi dystans klawiszami Zielony/ty w powtrce (s)"
msgid "Setup.Replay$Resume ID"
msgstr "ID wznowienia"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/pt_PT.po b/po/pt_PT.po
index 972419b..ae37d28 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2010-03-28 22:49+0100\n"
"Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID de resumo"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/ro_RO.po b/po/ro_RO.po
index 78c4f32..69364c1 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-11 22:26+0100\n"
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
"Language-Team: Romanian <vdr@linuxtv.org>\n"
@@ -1300,6 +1300,12 @@ msgstr "Durata sărită cu tastele Verde/Galben la repetiție (s)"
msgid "Setup.Replay$Resume ID"
msgstr "Identificator continuare"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 0223d0a..f907ccc 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2016-12-27 17:13+0100\n"
"Last-Translator: Pridvorov Andrey <ua0lnj@bk.ru>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr "Пропуск интервала Зелёный/Жёлтый в пов
msgid "Setup.Replay$Resume ID"
msgstr "ID воспроизведения"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/sk_SK.po b/po/sk_SK.po
index 8ddbeb4..d5a70e3 100644
--- a/po/sk_SK.po
+++ b/po/sk_SK.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-17 18:59+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr "Opakovan preskoenie seku so Zelenm/ltm tlaidlom (s)"
msgid "Setup.Replay$Resume ID"
msgstr "ident. slo obnovenia prehrvania"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/sl_SI.po b/po/sl_SI.po
index 0a6a289..d2e4630 100644
--- a/po/sl_SI.po
+++ b/po/sl_SI.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2013-03-04 12:46+0100\n"
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID za predvajanje"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/sr_RS.po b/po/sr_RS.po
index ba1fd18..069c1ec 100644
--- a/po/sr_RS.po
+++ b/po/sr_RS.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2013-03-16 15:05+0100\n"
"Last-Translator: Zoran Turalija <zoran.turalija@gmail.com>\n"
"Language-Team: Serbian <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "ID reprodukcije"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/sv_SE.po b/po/sv_SE.po
index 78f689d..ded70cf 100644
--- a/po/sv_SE.po
+++ b/po/sv_SE.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-12 21:58+0100\n"
"Last-Translator: Magnus Sirvi <sirwio@hotmail.com>\n"
"Language-Team: Swedish <vdr@linuxtv.org>\n"
@@ -1303,6 +1303,12 @@ msgstr "Tid fr hopp med Grn/Gul knapp vid teruppspelning (s)"
msgid "Setup.Replay$Resume ID"
msgstr "terupptagnings-ID"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/tr_TR.po b/po/tr_TR.po
index 5cfac45..749ca47 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2008-02-28 00:33+0100\n"
"Last-Translator: Oktay Yolgeen <oktay_73@yahoo.de>\n"
"Language-Team: Turkish <vdr@linuxtv.org>\n"
@@ -1298,6 +1298,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "Gsteri ID'si"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/uk_UA.po b/po/uk_UA.po
index f9b18b3..d9f15ca 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2015-02-13 18:14+0100\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian <vdr@linuxtv.org>\n"
@@ -1299,6 +1299,12 @@ msgstr "Інтервал пропуску з Зеленою/Жовтою кно
msgid "Setup.Replay$Resume ID"
msgstr "ID продовження"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 5ae7555..dbeea3f 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 2.2.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2017-06-10 17:19+0200\n"
+"POT-Creation-Date: 2017-06-30 11:46+0200\n"
"PO-Revision-Date: 2013-03-04 14:52+0800\n"
"Last-Translator: NFVDR <nfvdr@live.com>\n"
"Language-Team: Chinese (simplified) <nfvdr@live.com>\n"
@@ -1300,6 +1300,12 @@ msgstr ""
msgid "Setup.Replay$Resume ID"
msgstr "恢复 ID"
+msgid "any hosts"
+msgstr ""
+
+msgid "only default host"
+msgstr ""
+
msgid "type"
msgstr ""
diff --git a/recording.c b/recording.c
index 7b1d158..ca0ec79 100644
--- a/recording.c
+++ b/recording.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.c 4.9 2017/05/27 15:46:57 kls Exp $
+ * $Id: recording.c 4.10 2017/06/25 12:31:46 kls Exp $
*/
#include "recording.h"
@@ -27,6 +27,7 @@
#include "remux.h"
#include "ringbuffer.h"
#include "skins.h"
+#include "svdrp.h"
#include "tools.h"
#include "videodir.h"
@@ -1493,6 +1494,7 @@ void cRecordings::TouchUpdate(void)
TouchFile(UpdateFileName());
if (!needsUpdate)
lastUpdate = time(NULL); // make sure we don't trigger ourselves
+ BroadcastSVDRPCommand("UPDR");
}
bool cRecordings::NeedsUpdate(void)
diff --git a/skinlcars.c b/skinlcars.c
index c4278d2..a7c28f1 100644
--- a/skinlcars.c
+++ b/skinlcars.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skinlcars.c 4.4 2017/04/20 08:46:42 kls Exp $
+ * $Id: skinlcars.c 4.5 2017/06/23 15:52:03 kls Exp $
*/
// "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures,
@@ -1551,7 +1551,7 @@ void cSkinLCARSDisplayMenu::SetTitle(const char *Title)
{
if (MenuCategory() != mcMain) {
const cFont *font = cFont::GetFont(fontOsd);
- int w = font->Width(Title);
+ int w = min(font->Width(Title), xa07 - xa06 - Gap);
osd->DrawRectangle(xa06, yt00, xa07 - w - Gap - 1, yt01 - 1, frameColor);
osd->DrawText(xa07 - w - Gap, yt00, Title, Theme.Color(clrMenuTitle), Theme.Color(clrBackground), font, w + Gap, yt01 - yt00, taRight);
}
diff --git a/skins.h b/skins.h
index 2286087..81d68ff 100644
--- a/skins.h
+++ b/skins.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skins.h 4.1 2015/09/10 11:19:48 kls Exp $
+ * $Id: skins.h 4.4 2017/06/25 10:02:09 kls Exp $
*/
#ifndef __SKINS_H
@@ -21,6 +21,19 @@
#include "timers.h"
#include "tools.h"
+// Several member functions of the following classes are called with a pointer to
+// an object from a global list (cTimer, cChannel, cRecording or cEvent). In these
+// cases the core VDR code holds a lock on the respective list. While in general a
+// plugin should only work with the objects and data that is explicitly given to it
+// in the function call, the called function may itself set a read lock (not a write
+// lock!) on this list, because read locks can be nested. It may also set read locks
+// (not write locks!) on higher order lists.
+// For instance, a function that is called with a cChannel may lock cRecordings and/or
+// cSchedules (which contains cEvent objects), but not cTimers. If a plugin needs to
+// set locks of its own (on mutexes defined inside the plugin code), it shall do so
+// after setting any locks on VDR's global lists, and it shall always set these
+// locks in the same sequence, to avoid deadlocks.
+
enum eMessageType { mtStatus = 0, mtInfo, mtWarning, mtError }; // will be used to calculate color offsets!
class cSkinDisplay {
@@ -220,16 +233,24 @@ public:
///< this function will be first called for the old current item
///< with Current set to false, and then for the new current item
///< with Current set to true.
- virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch) { return false; }
+ virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch, bool TimerActive) { return false; }
///< Sets the item at the given Index to Event. See SetItem() for more information.
///< If a derived skin class implements this function, it can display an Event item
///< in a more elaborate way than just a simple line of text.
///< If Channel is not NULL, the channel's name and/or number shall be displayed.
///< If WithDate is true, the date of the Event shall be displayed (in addition to the time).
///< TimerMatch tells how much of this event will be recorded by a timer.
+ ///< TimerActive tells whether the timer that will record this event is active.
///< If the skin displays the Event item in its own way, it shall return true.
///< The default implementation does nothing and returns false, which results in
///< a call to SetItem() with a proper text.
+#define DEPRECATED_SKIN_SETITEMEVENT
+#ifdef DEPRECATED_SKIN_SETITEMEVENT
+ virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch) { return SetItemEvent(Event, Index, Current, Selectable, Channel, WithDate, TimerMatch, true); }
+ ///< This function is here for comaptibility with older plugins and may be removed
+ ///< in a future version. Use the above version of SetItemEvent() with the TimerActive
+ ///< parameter instead.
+#endif
virtual bool SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable) { return false; }
///< Sets the item at the given Index to Timer. See SetItem() for more information.
///< If a derived skin class implements this function, it can display a Timer item
diff --git a/status.h b/status.h
index 6d1b9df..c8a9e1f 100644
--- a/status.h
+++ b/status.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: status.h 4.1 2015/08/02 10:34:44 kls Exp $
+ * $Id: status.h 4.3 2017/06/23 09:08:24 kls Exp $
*/
#ifndef __STATUS_H
@@ -15,6 +15,19 @@
#include "player.h"
#include "tools.h"
+// Several member functions of the following classes are called with a pointer to
+// an object from a global list (cTimer, cChannel, cRecording or cEvent). In these
+// cases the core VDR code holds a lock on the respective list. While in general a
+// plugin should only work with the objects and data that is explicitly given to it
+// in the function call, the called function may itself set a read lock (not a write
+// lock!) on this list, because read locks can be nested. It may also set read locks
+// (not write locks!) on higher order lists.
+// For instance, a function that is called with a cChannel may lock cRecordings and/or
+// cSchedules (which contains cEvent objects), but not cTimers. If a plugin needs to
+// set locks of its own (on mutexes defined inside the plugin code), it shall do so
+// after setting any locks on VDR's global lists, and it shall always set these
+// locks in the same sequence, to avoid deadlocks.
+
enum eTimerChange { tcMod, tcAdd, tcDel }; // tcMod is obsolete and no longer used!
class cTimer;
diff --git a/svdrp.c b/svdrp.c
index 2b63c80..3769575 100644
--- a/svdrp.c
+++ b/svdrp.c
@@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
- * $Id: svdrp.c 4.20 2017/05/31 14:02:17 kls Exp $
+ * $Id: svdrp.c 4.22 2017/06/30 09:49:39 kls Exp $
*/
#include "svdrp.h"
@@ -549,7 +549,7 @@ cSVDRPClient *cSVDRPClientHandler::GetClientForServer(const char *ServerName)
void cSVDRPClientHandler::SendDiscover(const char *Address)
{
cMutexLock MutexLock(&mutex);
- cString Dgram = cString::sprintf("SVDRP:discover name:%s port:%d vdrversion:%d apiversion:%d timeout:%d", Setup.SVDRPHostName, tcpPort, VDRVERSNUM, APIVERSNUM, Setup.SVDRPTimeout);
+ cString Dgram = cString::sprintf("SVDRP:discover name:%s port:%d vdrversion:%d apiversion:%d timeout:%d%s", Setup.SVDRPHostName, tcpPort, VDRVERSNUM, APIVERSNUM, Setup.SVDRPTimeout, (Setup.SVDRPPeering == spmOnly && *Setup.SVDRPDefaultHost) ? *cString::sprintf(" host:%s", Setup.SVDRPDefaultHost) : "");
udpSocket.SendDgram(Dgram, udpSocket.Port(), Address);
}
@@ -580,6 +580,11 @@ void cSVDRPClientHandler::HandleClientConnection(void)
}
cString ServerName = strgetval(NewDiscover, "name", ':');
if (*ServerName) {
+ if (Setup.SVDRPPeering == spmOnly && strcmp(ServerName, Setup.SVDRPDefaultHost) != 0)
+ return; // we only want to peer with the default host, but this isn't the default host
+ cString HostName = strgetval(NewDiscover, "host", ':');
+ if (*HostName && strcmp(HostName, Setup.SVDRPHostName) != 0)
+ return; // the remote VDR requests a specific host, but it's not us
cString t = strgetval(NewDiscover, "timeout", ':');
if (*t) {
int Timeout = atoi(t);
@@ -2600,3 +2605,15 @@ bool ExecSVDRPCommand(const char *ServerName, const char *Command, cStringList *
return SVDRPClientHandler->Execute(ServerName, Command, Response);
return false;
}
+
+void BroadcastSVDRPCommand(const char *Command)
+{
+ cMutexLock MutexLock(&SVDRPHandlerMutex);
+ cStringList ServerNames;
+ if (SVDRPClientHandler) {
+ if (SVDRPClientHandler->GetServerNames(&ServerNames)) {
+ for (int i = 0; i < ServerNames.Size(); i++)
+ ExecSVDRPCommand(ServerNames[i], Command);
+ }
+ }
+}
diff --git a/svdrp.h b/svdrp.h
index ba33fc2..e0d3616 100644
--- a/svdrp.h
+++ b/svdrp.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: svdrp.h 4.5 2015/09/09 09:44:12 kls Exp $
+ * $Id: svdrp.h 4.7 2017/06/30 09:49:39 kls Exp $
*/
#ifndef __SVDRP_H
@@ -12,6 +12,12 @@
#include "tools.h"
+enum eSvdrpPeerModes {
+ spmOff = 0,
+ spmAny = 1,
+ spmOnly = 2,
+ };
+
enum eSvdrpFetchFlags {
sffNone = 0b0000,
sffTimers = 0b0001,
@@ -42,6 +48,8 @@ bool ExecSVDRPCommand(const char *ServerName, const char *Command, cStringList *
///< resulting strings from the remote VDR, which can be accessed
///< through Response. If Response is given, it will be cleared before
///< the command is actually executed.
+void BroadcastSVDRPCommand(const char *Command);
+ ///< Sends the given SVDRP Command string to all remote VDRs.
inline int SVDRPCode(const char *s) { return s ? atoi(s) : 0; }
///< Returns the value of the three digit reply code of the given
///< SVDRP response string.
diff --git a/thread.c b/thread.c
index 2753679..8fc2340 100644
--- a/thread.c
+++ b/thread.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: thread.c 4.9 2017/06/09 08:27:22 kls Exp $
+ * $Id: thread.c 4.11 2017/06/25 12:08:16 kls Exp $
*/
#include "thread.h"
@@ -558,6 +558,7 @@ cString cBackTrace::GetCaller(int Level, bool Mangled)
#ifdef DEBUG_LOCKSEQ
#define SLL_SIZE 20 // the number of log entries
#define SLL_LENGTH 512 // the maximum length of log entries
+#define SLL_THREADS 20 // the maximum number of threads holding locks at the same time (typically well below 10)
#define SLL_MAX_LIST 9 // max. number of lists to log
#define SLL_WRITE_FLAG 0x80000000
#define SLL_LOCK_FLAG 0x40000000
@@ -569,7 +570,7 @@ private:
cVector<int> flags;
tThreadId logThreadIds[SLL_SIZE];
int logFlags[SLL_SIZE];
- uint8_t logCounter[SLL_SIZE][SLL_MAX_LIST];
+ uint8_t logCounter[SLL_THREADS][SLL_MAX_LIST];
#ifdef DEBUG_LOCKCALL
char logCaller[SLL_SIZE][SLL_LENGTH];
#endif
@@ -633,6 +634,7 @@ void cStateLockLog::Dump(const char *Name, tThreadId ThreadId)
dsyslog("full backtrace:");
cBackTrace::BackTrace(NULL, 2);
dsyslog("--- end invalid lock sequence report");
+ dsyslog("--- THERE WILL BE NO FURTHER REPORTS UNTIL VDR IS RESTARTED!");
fprintf(stderr, "invalid lock sequence at %s\n", *DayDateTime(time(NULL)));
}
@@ -644,15 +646,32 @@ void cStateLockLog::Check(const char *Name, bool Lock, bool Write)
int b = 1 << n;
cMutexLock MutexLock(&mutex);
tThreadId ThreadId = cThread::ThreadId();
- int Index = threadIds.IndexOf(ThreadId);
+ int Index = -1;
+ int AvailableIndex = -1;
+ for (int i = 0; i < threadIds.Size(); i++) {
+ if (ThreadId == threadIds[i]) {
+ Index = i;
+ break;
+ }
+ if (threadIds[i] == 0)
+ AvailableIndex = i;
+ }
if (Index < 0) {
- if (Lock) {
+ if (AvailableIndex < 0) {
Index = threadIds.Size();
threadIds.Append(ThreadId);
flags.Append(0);
}
- else
- return;
+ else {
+ Index = AvailableIndex;
+ threadIds[Index] = ThreadId;
+ }
+ }
+ if (Index >= SLL_THREADS) {
+ // should never happen!
+ esyslog("ERROR: too many threads holding list locks at the same time - stopped logging locks!");
+ dumped = true;
+ return;
}
bool DoDump = false;
if (Lock) {
@@ -667,6 +686,8 @@ void cStateLockLog::Check(const char *Name, bool Lock, bool Write)
flags[Index] &= ~b;
logThreadIds[logIndex] = ThreadId;
logFlags[logIndex] = flags[Index] | (Write ? SLL_WRITE_FLAG : 0) | (Lock ? SLL_LOCK_FLAG : 0);
+ if (flags[Index] == 0)
+ threadIds[Index] = 0;
#ifdef DEBUG_LOCKCALL
strn0cpy(logCaller[logIndex], cBackTrace::GetCaller(Lock ? 3 : 5, true), SLL_LENGTH);
#endif
diff --git a/timers.c b/timers.c
index 95cb723..8987b12 100644
--- a/timers.c
+++ b/timers.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: timers.c 4.10 2017/05/26 15:43:38 kls Exp $
+ * $Id: timers.c 4.11 2017/06/25 10:02:09 kls Exp $
*/
#include "timers.h"
@@ -476,7 +476,7 @@ eTimerMatch cTimer::Matches(const cEvent *Event, int *Overlap) const
// To make sure a VPS timer can be distinguished from a plain 100% overlap,
// it gets an additional 100 added, and a VPS event that is actually running
// gets 200 added to the FULLMATCH.
- if (HasFlags(tfActive) && channel->GetChannelID() == Event->ChannelID()) {
+ if (channel->GetChannelID() == Event->ChannelID()) {
bool UseVps = HasFlags(tfVps) && Event->Vps();
Matches(UseVps ? Event->Vps() : Event->StartTime(), true);
int overlap = 0;
diff --git a/tools.c b/tools.c
index a8e6af1..ac2f9eb 100644
--- a/tools.c
+++ b/tools.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: tools.c 4.6 2017/05/09 08:32:54 kls Exp $
+ * $Id: tools.c 4.8 2017/06/25 11:45:39 kls Exp $
*/
#include "tools.h"
@@ -371,6 +371,8 @@ bool StrInArray(const char *a[], const char *s)
cString AddDirectory(const char *DirName, const char *FileName)
{
+ if (*FileName == '/')
+ FileName++;
return cString::sprintf("%s/%s", DirName && *DirName ? DirName : ".", FileName);
}
@@ -1526,7 +1528,11 @@ cReadDir::~cReadDir()
struct dirent *cReadDir::Next(void)
{
if (directory) {
+#if !__GLIBC_PREREQ(2, 24) // readdir_r() is deprecated as of GLIBC 2.24
while (readdir_r(directory, &u.d, &result) == 0 && result) {
+#else
+ while ((result = readdir(directory)) != NULL) {
+#endif
if (strcmp(result->d_name, ".") && strcmp(result->d_name, ".."))
return result;
}
diff --git a/tools.h b/tools.h
index 5894a18..aaba602 100644
--- a/tools.h
+++ b/tools.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: tools.h 4.12 2017/06/11 10:00:49 kls Exp $
+ * $Id: tools.h 4.13 2017/06/25 11:45:38 kls Exp $
*/
#ifndef __TOOLS_H
@@ -400,10 +400,12 @@ class cReadDir {
private:
DIR *directory;
struct dirent *result;
+#if !__GLIBC_PREREQ(2, 24) // readdir_r() is deprecated as of GLIBC 2.24
union { // according to "The GNU C Library Reference Manual"
struct dirent d;
char b[offsetof(struct dirent, d_name) + NAME_MAX + 1];
} u;
+#endif
public:
cReadDir(const char *Directory);
~cReadDir();