1
0
mirror of https://github.com/vdr-projects/vdr.git synced 2025-03-01 10:50:46 +00:00
vdr/config.c
Klaus Schmidinger 4ee983a294 Version 2.1.8
VDR developer version 2.1.8 is now available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.8.tar.bz2

A 'diff' against the previous version is available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.7-2.1.8.diff

MD5 checksums:

1d2751e87def9b18b448513f24e635e9  vdr-2.1.8.tar.bz2
0487e037278f6f6684a7933674910f05  vdr-2.1.7-2.1.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.

From the HISTORY file:
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- Fixed "warning: invalid suffix on literal" with GCC 4.8 and C++11 (thanks to Joerg
  Bornkessel).
- Fixed the link to "svdrpsend (1)" in the vdr.1 man page (thanks to Chris Mayo).
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Updated the Romanian OSD texts (thanks to Lucian Muresan).
- Added functionality based on the "jumpplay" patch from Torsten Kunkel and Thomas
  Günther:
  + The new option "Setup/Replay/Pause replay when jumping to a mark" can be used to
    turn off pausing replay when jumping to an editing mark with the '9' key.
  + The new option "Setup/Replay/Skip edited parts" can be used to automatically skip
    the edited parts of a recording during replay, without the need to actually cut
    the recording.
  + The new option "Setup/Replay/Pause replay at last mark" can be used to make replay
    go into Pause mode when it has reached the last "end" mark.
  + The '8' key for testing an edited sequence now also jumps to the next *end*
    mark if "Setup/Replay/Skip edited parts" is active. This allows for testing edits
    in recordings that have actually been cut, as well as recordings that have not
    been cut, in case "Skip edited parts" is enabled.
- Added support for "Satellite Channel Routing" (SCR) according to EN50607, also
  known as "JESS" (thanks to Manfred Völkel and Frank Neumann).
- The keys '1' and '3' can now be used in replay mode to position an editing mark
  in "binary" mode (based on a patch from Rolf Ahrenberg, with modifications by Helmut
  Auer). See MANUAL, section "Editing a Recording".
- The Yellow button in the "Setup/CAM" menu can now be used to put the selected
  CAM into a mode where it remains assigned to a device that is tuned to the current
  channel until the smart card it contains is activated and the CAM thus starts to
  descramble (see MANUAL, section "Setup/CAM" for details).
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
- Added ARGSDIR to the ONEDIR section of Make.config.template (suggested by Derek
  Kelly).
- Made cRecording::GetResume() public (suggested by Stefan Braun).
- Fixed setting the read index in cDvbPlayer::Goto() in case Still is false.
- The function cDvbPlayer::Goto() now automatically calls Play() if Still is false.
- Added support for LCN (Logical Channel Numbers), which plugins may use to sort
  channels (thanks to Rolf Ahrenberg).
2015-02-01 16:58:18 +01:00

840 lines
29 KiB
C

/*
* config.c: Configuration file handling
*
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.c 3.6 2015/01/29 09:01:30 kls Exp $
*/
#include "config.h"
#include <ctype.h>
#include <stdlib.h>
#include "device.h"
#include "i18n.h"
#include "interface.h"
#include "menu.h"
#include "plugin.h"
#include "recording.h"
// IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
// format characters in order to allow any number of blanks after a numeric
// value!
#define ChkDoublePlausibility(Variable, Default) { if (Variable < 0.00001) Variable = Default; }
// --- cSVDRPhost ------------------------------------------------------------
cSVDRPhost::cSVDRPhost(void)
{
addr.s_addr = 0;
mask = 0;
}
bool cSVDRPhost::Parse(const char *s)
{
mask = 0xFFFFFFFF;
const char *p = strchr(s, '/');
if (p) {
char *error = NULL;
int m = strtoul(p + 1, &error, 10);
if (error && *error && !isspace(*error) || m > 32)
return false;
*(char *)p = 0; // yes, we know it's 'const' - will be restored!
if (m == 0)
mask = 0;
else {
mask <<= (32 - m);
mask = htonl(mask);
}
}
int result = inet_aton(s, &addr);
if (p)
*(char *)p = '/'; // there it is again
return result != 0 && (mask != 0 || addr.s_addr == 0);
}
bool cSVDRPhost::IsLocalhost(void)
{
return addr.s_addr == htonl(INADDR_LOOPBACK);
}
bool cSVDRPhost::Accepts(in_addr_t Address)
{
return (Address & mask) == (addr.s_addr & mask);
}
// --- cSatCableNumbers ------------------------------------------------------
cSatCableNumbers::cSatCableNumbers(int Size, const char *s)
{
size = Size;
array = MALLOC(int, size);
FromString(s);
}
cSatCableNumbers::~cSatCableNumbers()
{
free(array);
}
bool cSatCableNumbers::FromString(const char *s)
{
char *t;
int i = 0;
const char *p = s;
while (p && *p) {
int n = strtol(p, &t, 10);
if (t != p) {
if (i < size)
array[i++] = n;
else {
esyslog("ERROR: too many sat cable numbers in '%s'", s);
return false;
}
}
else {
esyslog("ERROR: invalid sat cable number in '%s'", s);
return false;
}
p = skipspace(t);
}
for ( ; i < size; i++)
array[i] = 0;
return true;
}
cString cSatCableNumbers::ToString(void)
{
cString s("");
for (int i = 0; i < size; i++) {
s = cString::sprintf("%s%d ", *s, array[i]);
}
return s;
}
int cSatCableNumbers::FirstDeviceIndex(int DeviceIndex) const
{
if (0 <= DeviceIndex && DeviceIndex < size) {
if (int CableNr = array[DeviceIndex]) {
for (int i = 0; i < size; i++) {
if (i < DeviceIndex && array[i] == CableNr)
return i;
}
}
}
return -1;
}
// --- cNestedItem -----------------------------------------------------------
cNestedItem::cNestedItem(const char *Text, bool WithSubItems)
{
text = strdup(Text ? Text : "");
subItems = WithSubItems ? new cList<cNestedItem> : NULL;
}
cNestedItem::~cNestedItem()
{
delete subItems;
free(text);
}
int cNestedItem::Compare(const cListObject &ListObject) const
{
return strcasecmp(text, ((cNestedItem *)&ListObject)->text);
}
void cNestedItem::AddSubItem(cNestedItem *Item)
{
if (!subItems)
subItems = new cList<cNestedItem>;
if (Item)
subItems->Add(Item);
}
void cNestedItem::SetText(const char *Text)
{
free(text);
text = strdup(Text ? Text : "");
}
void cNestedItem::SetSubItems(bool On)
{
if (On && !subItems)
subItems = new cList<cNestedItem>;
else if (!On && subItems) {
delete subItems;
subItems = NULL;
}
}
// --- cNestedItemList -------------------------------------------------------
cNestedItemList::cNestedItemList(void)
{
fileName = NULL;
}
cNestedItemList::~cNestedItemList()
{
free(fileName);
}
bool cNestedItemList::Parse(FILE *f, cList<cNestedItem> *List, int &Line)
{
char *s;
cReadLine ReadLine;
while ((s = ReadLine.Read(f)) != NULL) {
Line++;
char *p = strchr(s, '#');
if (p)
*p = 0;
s = skipspace(stripspace(s));
if (!isempty(s)) {
p = s + strlen(s) - 1;
if (*p == '{') {
*p = 0;
stripspace(s);
cNestedItem *Item = new cNestedItem(s, true);
List->Add(Item);
if (!Parse(f, Item->SubItems(), Line))
return false;
}
else if (*s == '}')
break;
else
List->Add(new cNestedItem(s));
}
}
return true;
}
bool cNestedItemList::Write(FILE *f, cList<cNestedItem> *List, int Indent)
{
for (cNestedItem *Item = List->First(); Item; Item = List->Next(Item)) {
if (Item->SubItems()) {
fprintf(f, "%*s%s {\n", Indent, "", Item->Text());
Write(f, Item->SubItems(), Indent + 2);
fprintf(f, "%*s}\n", Indent + 2, "");
}
else
fprintf(f, "%*s%s\n", Indent, "", Item->Text());
}
return true;
}
void cNestedItemList::Clear(void)
{
free(fileName);
fileName = NULL;
cList<cNestedItem>::Clear();
}
bool cNestedItemList::Load(const char *FileName)
{
cList<cNestedItem>::Clear();
if (FileName) {
free(fileName);
fileName = strdup(FileName);
}
bool result = false;
if (fileName && access(fileName, F_OK) == 0) {
isyslog("loading %s", fileName);
FILE *f = fopen(fileName, "r");
if (f) {
int Line = 0;
result = Parse(f, this, Line);
fclose(f);
}
else {
LOG_ERROR_STR(fileName);
result = false;
}
}
return result;
}
bool cNestedItemList::Save(void)
{
bool result = true;
cSafeFile f(fileName);
if (f.Open()) {
result = Write(f, this);
if (!f.Close())
result = false;
}
else
result = false;
return result;
}
// --- Folders and Commands --------------------------------------------------
cNestedItemList Folders;
cNestedItemList Commands;
cNestedItemList RecordingCommands;
// --- cSVDRPhosts -----------------------------------------------------------
cSVDRPhosts SVDRPhosts;
bool cSVDRPhosts::LocalhostOnly(void)
{
cSVDRPhost *h = First();
while (h) {
if (!h->IsLocalhost())
return false;
h = (cSVDRPhost *)h->Next();
}
return true;
}
bool cSVDRPhosts::Acceptable(in_addr_t Address)
{
cSVDRPhost *h = First();
while (h) {
if (h->Accepts(Address))
return true;
h = (cSVDRPhost *)h->Next();
}
return false;
}
// --- cSetupLine ------------------------------------------------------------
cSetupLine::cSetupLine(void)
{
plugin = name = value = NULL;
}
cSetupLine::cSetupLine(const char *Name, const char *Value, const char *Plugin)
{
name = strreplace(strdup(Name), '\n', 0);
value = strreplace(strdup(Value), '\n', 0);
plugin = Plugin ? strreplace(strdup(Plugin), '\n', 0) : NULL;
}
cSetupLine::~cSetupLine()
{
free(plugin);
free(name);
free(value);
}
int cSetupLine::Compare(const cListObject &ListObject) const
{
const cSetupLine *sl = (cSetupLine *)&ListObject;
if (!plugin && !sl->plugin)
return strcasecmp(name, sl->name);
if (!plugin)
return -1;
if (!sl->plugin)
return 1;
int result = strcasecmp(plugin, sl->plugin);
if (result == 0)
result = strcasecmp(name, sl->name);
return result;
}
bool cSetupLine::Parse(char *s)
{
char *p = strchr(s, '=');
if (p) {
*p = 0;
char *Name = compactspace(s);
char *Value = compactspace(p + 1);
if (*Name) { // value may be an empty string
p = strchr(Name, '.');
if (p) {
*p = 0;
char *Plugin = compactspace(Name);
Name = compactspace(p + 1);
if (!(*Plugin && *Name))
return false;
plugin = strdup(Plugin);
}
name = strdup(Name);
value = strdup(Value);
return true;
}
}
return false;
}
bool cSetupLine::Save(FILE *f)
{
return fprintf(f, "%s%s%s = %s\n", plugin ? plugin : "", plugin ? "." : "", name, value) > 0;
}
// --- cSetup ----------------------------------------------------------------
cSetup Setup;
cSetup::cSetup(void)
{
strcpy(OSDLanguage, ""); // default is taken from environment
strcpy(OSDSkin, "lcars");
strcpy(OSDTheme, "default");
PrimaryDVB = 1;
ShowInfoOnChSwitch = 1;
TimeoutRequChInfo = 1;
MenuScrollPage = 1;
MenuScrollWrap = 0;
MenuKeyCloses = 0;
MarkInstantRecord = 1;
strcpy(NameInstantRecord, TIMERMACRO_TITLE " " TIMERMACRO_EPISODE);
InstantRecordTime = DEFINSTRECTIME;
LnbSLOF = 11700;
LnbFrequLo = 9750;
LnbFrequHi = 10600;
DiSEqC = 0;
UsePositioner = 0;
SiteLat = 0;
SiteLon = 0;
PositionerSpeed = 15;
PositionerSwing = 650;
PositionerLastLon = 0;
SetSystemTime = 0;
TimeSource = 0;
TimeTransponder = 0;
StandardCompliance = STANDARD_DVB;
MarginStart = 2;
MarginStop = 10;
AudioLanguages[0] = -1;
DisplaySubtitles = 0;
SubtitleLanguages[0] = -1;
SubtitleOffset = 0;
SubtitleFgTransparency = 0;
SubtitleBgTransparency = 0;
EPGLanguages[0] = -1;
EPGScanTimeout = 5;
EPGBugfixLevel = 3;
EPGLinger = 0;
SVDRPTimeout = 300;
ZapTimeout = 3;
ChannelEntryTimeout = 1000;
RcRepeatDelay = 300;
RcRepeatDelta = 100;
DefaultPriority = 50;
DefaultLifetime = MAXLIFETIME;
PauseKeyHandling = 2;
PausePriority = 10;
PauseLifetime = 1;
UseSubtitle = 1;
UseVps = 0;
VpsMargin = 120;
RecordingDirs = 1;
FoldersInTimerMenu = 1;
AlwaysSortFoldersFirst = 1;
NumberKeysForChars = 1;
ColorKey0 = 0;
ColorKey1 = 1;
ColorKey2 = 2;
ColorKey3 = 3;
VideoDisplayFormat = 1;
VideoFormat = 0;
UpdateChannels = 5;
UseDolbyDigital = 1;
ChannelInfoPos = 0;
ChannelInfoTime = 5;
OSDLeftP = 0.08;
OSDTopP = 0.08;
OSDWidthP = 0.87;
OSDHeightP = 0.84;
OSDLeft = 54;
OSDTop = 45;
OSDWidth = 624;
OSDHeight = 486;
OSDAspect = 1.0;
OSDMessageTime = 1;
UseSmallFont = 1;
AntiAlias = 1;
strcpy(FontOsd, DefaultFontOsd);
strcpy(FontSml, DefaultFontSml);
strcpy(FontFix, DefaultFontFix);
FontOsdSizeP = 0.031;
FontSmlSizeP = 0.028;
FontFixSizeP = 0.030;
FontOsdSize = 22;
FontSmlSize = 18;
FontFixSize = 20;
MaxVideoFileSize = MAXVIDEOFILESIZEDEFAULT;
SplitEditedFiles = 0;
DelTimeshiftRec = 0;
MinEventTimeout = 30;
MinUserInactivity = 300;
NextWakeupTime = 0;
MultiSpeedMode = 0;
ShowReplayMode = 0;
ShowRemainingTime = 0;
ProgressDisplayTime = 0;
PauseOnMarkSet = 0;
PauseOnMarkJump = 1;
SkipEdited = 0;
PauseAtLastMark = 0;
BinarySkipInitial = 120;
BinarySkipTimeout = 3;
ResumeID = 0;
CurrentChannel = -1;
CurrentVolume = MAXVOLUME;
VolumeSteps = 51;
VolumeLinearize = 0;
CurrentDolby = 0;
InitialChannel = "";
DeviceBondings = "";
InitialVolume = -1;
ChannelsWrap = 0;
ShowChannelNamesWithSource = 0;
EmergencyExit = 1;
}
cSetup& cSetup::operator= (const cSetup &s)
{
memcpy(&__BeginData__, &s.__BeginData__, (char *)&s.__EndData__ - (char *)&s.__BeginData__);
InitialChannel = s.InitialChannel;
DeviceBondings = s.DeviceBondings;
return *this;
}
cSetupLine *cSetup::Get(const char *Name, const char *Plugin)
{
for (cSetupLine *l = First(); l; l = Next(l)) {
if ((l->Plugin() == NULL) == (Plugin == NULL)) {
if ((!Plugin || strcasecmp(l->Plugin(), Plugin) == 0) && strcasecmp(l->Name(), Name) == 0)
return l;
}
}
return NULL;
}
void cSetup::Store(const char *Name, const char *Value, const char *Plugin, bool AllowMultiple)
{
if (Name && *Name) {
cSetupLine *l = Get(Name, Plugin);
if (l && !AllowMultiple)
Del(l);
if (Value)
Add(new cSetupLine(Name, Value, Plugin));
}
}
void cSetup::Store(const char *Name, int Value, const char *Plugin)
{
Store(Name, cString::sprintf("%d", Value), Plugin);
}
void cSetup::Store(const char *Name, double &Value, const char *Plugin)
{
Store(Name, dtoa(Value), Plugin);
}
bool cSetup::Load(const char *FileName)
{
if (cConfig<cSetupLine>::Load(FileName)) {
bool result = true;
for (cSetupLine *l = First(); l; l = Next(l)) {
bool error = false;
if (l->Plugin()) {
cPlugin *p = cPluginManager::GetPlugin(l->Plugin());
if (p && !p->SetupParse(l->Name(), l->Value()))
error = true;
}
else {
if (!Parse(l->Name(), l->Value()))
error = true;
}
if (error) {
esyslog("ERROR: unknown config parameter: %s%s%s = %s", l->Plugin() ? l->Plugin() : "", l->Plugin() ? "." : "", l->Name(), l->Value());
result = false;
}
}
return result;
}
return false;
}
void cSetup::StoreLanguages(const char *Name, int *Values)
{
char buffer[I18nLanguages()->Size() * 4];
char *q = buffer;
for (int i = 0; i < I18nLanguages()->Size(); i++) {
if (Values[i] < 0)
break;
const char *s = I18nLanguageCode(Values[i]);
if (s) {
if (q > buffer)
*q++ = ' ';
strncpy(q, s, 3);
q += 3;
}
}
*q = 0;
Store(Name, buffer);
}
bool cSetup::ParseLanguages(const char *Value, int *Values)
{
int n = 0;
while (Value && *Value && n < I18nLanguages()->Size()) {
char buffer[4];
strn0cpy(buffer, Value, sizeof(buffer));
int i = I18nLanguageIndex(buffer);
if (i >= 0)
Values[n++] = i;
if ((Value = strchr(Value, ' ')) != NULL)
Value++;
}
Values[n] = -1;
return true;
}
bool cSetup::Parse(const char *Name, const char *Value)
{
if (!strcasecmp(Name, "OSDLanguage")) { strn0cpy(OSDLanguage, Value, sizeof(OSDLanguage)); I18nSetLocale(OSDLanguage); }
else if (!strcasecmp(Name, "OSDSkin")) Utf8Strn0Cpy(OSDSkin, Value, MaxSkinName);
else if (!strcasecmp(Name, "OSDTheme")) Utf8Strn0Cpy(OSDTheme, Value, MaxThemeName);
else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value);
else if (!strcasecmp(Name, "ShowInfoOnChSwitch")) ShowInfoOnChSwitch = atoi(Value);
else if (!strcasecmp(Name, "TimeoutRequChInfo")) TimeoutRequChInfo = atoi(Value);
else if (!strcasecmp(Name, "MenuScrollPage")) MenuScrollPage = atoi(Value);
else if (!strcasecmp(Name, "MenuScrollWrap")) MenuScrollWrap = atoi(Value);
else if (!strcasecmp(Name, "MenuKeyCloses")) MenuKeyCloses = atoi(Value);
else if (!strcasecmp(Name, "MarkInstantRecord")) MarkInstantRecord = atoi(Value);
else if (!strcasecmp(Name, "NameInstantRecord")) Utf8Strn0Cpy(NameInstantRecord, Value, sizeof(NameInstantRecord));
else if (!strcasecmp(Name, "InstantRecordTime")) InstantRecordTime = atoi(Value);
else if (!strcasecmp(Name, "LnbSLOF")) LnbSLOF = atoi(Value);
else if (!strcasecmp(Name, "LnbFrequLo")) LnbFrequLo = atoi(Value);
else if (!strcasecmp(Name, "LnbFrequHi")) LnbFrequHi = atoi(Value);
else if (!strcasecmp(Name, "DiSEqC")) DiSEqC = atoi(Value);
else if (!strcasecmp(Name, "UsePositioner")) UsePositioner = atoi(Value);
else if (!strcasecmp(Name, "SiteLat")) SiteLat = atoi(Value);
else if (!strcasecmp(Name, "SiteLon")) SiteLon = atoi(Value);
else if (!strcasecmp(Name, "PositionerSpeed")) PositionerSpeed = atoi(Value);
else if (!strcasecmp(Name, "PositionerSwing")) PositionerSwing = atoi(Value);
else if (!strcasecmp(Name, "PositionerLastLon")) PositionerLastLon = atoi(Value);
else if (!strcasecmp(Name, "SetSystemTime")) SetSystemTime = atoi(Value);
else if (!strcasecmp(Name, "TimeSource")) TimeSource = cSource::FromString(Value);
else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value);
else if (!strcasecmp(Name, "StandardCompliance")) StandardCompliance = atoi(Value);
else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value);
else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value);
else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages);
else if (!strcasecmp(Name, "DisplaySubtitles")) DisplaySubtitles = atoi(Value);
else if (!strcasecmp(Name, "SubtitleLanguages")) return ParseLanguages(Value, SubtitleLanguages);
else if (!strcasecmp(Name, "SubtitleOffset")) SubtitleOffset = atoi(Value);
else if (!strcasecmp(Name, "SubtitleFgTransparency")) SubtitleFgTransparency = atoi(Value);
else if (!strcasecmp(Name, "SubtitleBgTransparency")) SubtitleBgTransparency = atoi(Value);
else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages);
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
else if (!strcasecmp(Name, "EPGLinger")) EPGLinger = atoi(Value);
else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
else if (!strcasecmp(Name, "ZapTimeout")) ZapTimeout = atoi(Value);
else if (!strcasecmp(Name, "ChannelEntryTimeout")) ChannelEntryTimeout= atoi(Value);
else if (!strcasecmp(Name, "RcRepeatDelay")) RcRepeatDelay = atoi(Value);
else if (!strcasecmp(Name, "RcRepeatDelta")) RcRepeatDelta = atoi(Value);
else if (!strcasecmp(Name, "DefaultPriority")) DefaultPriority = atoi(Value);
else if (!strcasecmp(Name, "DefaultLifetime")) DefaultLifetime = atoi(Value);
else if (!strcasecmp(Name, "PauseKeyHandling")) PauseKeyHandling = atoi(Value);
else if (!strcasecmp(Name, "PausePriority")) PausePriority = atoi(Value);
else if (!strcasecmp(Name, "PauseLifetime")) PauseLifetime = atoi(Value);
else if (!strcasecmp(Name, "UseSubtitle")) UseSubtitle = atoi(Value);
else if (!strcasecmp(Name, "UseVps")) UseVps = atoi(Value);
else if (!strcasecmp(Name, "VpsMargin")) VpsMargin = atoi(Value);
else if (!strcasecmp(Name, "RecordingDirs")) RecordingDirs = atoi(Value);
else if (!strcasecmp(Name, "FoldersInTimerMenu")) FoldersInTimerMenu = atoi(Value);
else if (!strcasecmp(Name, "AlwaysSortFoldersFirst")) AlwaysSortFoldersFirst = atoi(Value);
else if (!strcasecmp(Name, "NumberKeysForChars")) NumberKeysForChars = atoi(Value);
else if (!strcasecmp(Name, "ColorKey0")) ColorKey0 = atoi(Value);
else if (!strcasecmp(Name, "ColorKey1")) ColorKey1 = atoi(Value);
else if (!strcasecmp(Name, "ColorKey2")) ColorKey2 = atoi(Value);
else if (!strcasecmp(Name, "ColorKey3")) ColorKey3 = atoi(Value);
else if (!strcasecmp(Name, "VideoDisplayFormat")) VideoDisplayFormat = atoi(Value);
else if (!strcasecmp(Name, "VideoFormat")) VideoFormat = atoi(Value);
else if (!strcasecmp(Name, "UpdateChannels")) UpdateChannels = atoi(Value);
else if (!strcasecmp(Name, "UseDolbyDigital")) UseDolbyDigital = atoi(Value);
else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value);
else if (!strcasecmp(Name, "ChannelInfoTime")) ChannelInfoTime = atoi(Value);
else if (!strcasecmp(Name, "OSDLeftP")) OSDLeftP = atod(Value);
else if (!strcasecmp(Name, "OSDTopP")) OSDTopP = atod(Value);
else if (!strcasecmp(Name, "OSDWidthP")) { OSDWidthP = atod(Value); ChkDoublePlausibility(OSDWidthP, 0.87); }
else if (!strcasecmp(Name, "OSDHeightP")) { OSDHeightP = atod(Value); ChkDoublePlausibility(OSDHeightP, 0.84); }
else if (!strcasecmp(Name, "OSDLeft")) OSDLeft = atoi(Value);
else if (!strcasecmp(Name, "OSDTop")) OSDTop = atoi(Value);
else if (!strcasecmp(Name, "OSDWidth")) { OSDWidth = atoi(Value); OSDWidth &= ~0x07; } // OSD width must be a multiple of 8
else if (!strcasecmp(Name, "OSDHeight")) OSDHeight = atoi(Value);
else if (!strcasecmp(Name, "OSDAspect")) OSDAspect = atod(Value);
else if (!strcasecmp(Name, "OSDMessageTime")) OSDMessageTime = atoi(Value);
else if (!strcasecmp(Name, "UseSmallFont")) UseSmallFont = atoi(Value);
else if (!strcasecmp(Name, "AntiAlias")) AntiAlias = atoi(Value);
else if (!strcasecmp(Name, "FontOsd")) Utf8Strn0Cpy(FontOsd, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontSml")) Utf8Strn0Cpy(FontSml, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontFix")) Utf8Strn0Cpy(FontFix, Value, MAXFONTNAME);
else if (!strcasecmp(Name, "FontOsdSizeP")) { FontOsdSizeP = atod(Value); ChkDoublePlausibility(FontOsdSizeP, 0.038); }
else if (!strcasecmp(Name, "FontSmlSizeP")) { FontSmlSizeP = atod(Value); ChkDoublePlausibility(FontSmlSizeP, 0.035); }
else if (!strcasecmp(Name, "FontFixSizeP")) { FontFixSizeP = atod(Value); ChkDoublePlausibility(FontFixSizeP, 0.031); }
else if (!strcasecmp(Name, "FontOsdSize")) FontOsdSize = atoi(Value);
else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value);
else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = atoi(Value);
else if (!strcasecmp(Name, "MaxVideoFileSize")) MaxVideoFileSize = atoi(Value);
else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value);
else if (!strcasecmp(Name, "DelTimeshiftRec")) DelTimeshiftRec = atoi(Value);
else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value);
else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value);
else if (!strcasecmp(Name, "NextWakeupTime")) NextWakeupTime = atoi(Value);
else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
else if (!strcasecmp(Name, "ShowRemainingTime")) ShowRemainingTime = atoi(Value);
else if (!strcasecmp(Name, "ProgressDisplayTime")) ProgressDisplayTime= atoi(Value);
else if (!strcasecmp(Name, "PauseOnMarkSet")) PauseOnMarkSet = atoi(Value);
else if (!strcasecmp(Name, "PauseOnMarkJump")) PauseOnMarkJump = atoi(Value);
else if (!strcasecmp(Name, "SkipEdited")) SkipEdited = atoi(Value);
else if (!strcasecmp(Name, "PauseAtLastMark")) PauseAtLastMark = atoi(Value);
else if (!strcasecmp(Name, "BinarySkipInitial")) BinarySkipInitial = atoi(Value);
else if (!strcasecmp(Name, "BinarySkipTimeout")) BinarySkipTimeout = atoi(Value);
else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value);
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value);
else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = Value;
else if (!strcasecmp(Name, "VolumeSteps")) VolumeSteps = atoi(Value);
else if (!strcasecmp(Name, "VolumeLinearize")) VolumeLinearize = atoi(Value);
else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value);
else if (!strcasecmp(Name, "DeviceBondings")) DeviceBondings = Value;
else if (!strcasecmp(Name, "ChannelsWrap")) ChannelsWrap = atoi(Value);
else if (!strcasecmp(Name, "ShowChannelNamesWithSource")) ShowChannelNamesWithSource = atoi(Value);
else if (!strcasecmp(Name, "EmergencyExit")) EmergencyExit = atoi(Value);
else if (!strcasecmp(Name, "LastReplayed")) cReplayControl::SetRecording(Value);
else
return false;
return true;
}
bool cSetup::Save(void)
{
Store("OSDLanguage", OSDLanguage);
Store("OSDSkin", OSDSkin);
Store("OSDTheme", OSDTheme);
Store("PrimaryDVB", PrimaryDVB);
Store("ShowInfoOnChSwitch", ShowInfoOnChSwitch);
Store("TimeoutRequChInfo", TimeoutRequChInfo);
Store("MenuScrollPage", MenuScrollPage);
Store("MenuScrollWrap", MenuScrollWrap);
Store("MenuKeyCloses", MenuKeyCloses);
Store("MarkInstantRecord", MarkInstantRecord);
Store("NameInstantRecord", NameInstantRecord);
Store("InstantRecordTime", InstantRecordTime);
Store("LnbSLOF", LnbSLOF);
Store("LnbFrequLo", LnbFrequLo);
Store("LnbFrequHi", LnbFrequHi);
Store("DiSEqC", DiSEqC);
Store("UsePositioner", UsePositioner);
Store("SiteLat", SiteLat);
Store("SiteLon", SiteLon);
Store("PositionerSpeed", PositionerSpeed);
Store("PositionerSwing", PositionerSwing);
Store("PositionerLastLon", PositionerLastLon);
Store("SetSystemTime", SetSystemTime);
Store("TimeSource", cSource::ToString(TimeSource));
Store("TimeTransponder", TimeTransponder);
Store("StandardCompliance", StandardCompliance);
Store("MarginStart", MarginStart);
Store("MarginStop", MarginStop);
StoreLanguages("AudioLanguages", AudioLanguages);
Store("DisplaySubtitles", DisplaySubtitles);
StoreLanguages("SubtitleLanguages", SubtitleLanguages);
Store("SubtitleOffset", SubtitleOffset);
Store("SubtitleFgTransparency", SubtitleFgTransparency);
Store("SubtitleBgTransparency", SubtitleBgTransparency);
StoreLanguages("EPGLanguages", EPGLanguages);
Store("EPGScanTimeout", EPGScanTimeout);
Store("EPGBugfixLevel", EPGBugfixLevel);
Store("EPGLinger", EPGLinger);
Store("SVDRPTimeout", SVDRPTimeout);
Store("ZapTimeout", ZapTimeout);
Store("ChannelEntryTimeout",ChannelEntryTimeout);
Store("RcRepeatDelay", RcRepeatDelay);
Store("RcRepeatDelta", RcRepeatDelta);
Store("DefaultPriority", DefaultPriority);
Store("DefaultLifetime", DefaultLifetime);
Store("PauseKeyHandling", PauseKeyHandling);
Store("PausePriority", PausePriority);
Store("PauseLifetime", PauseLifetime);
Store("UseSubtitle", UseSubtitle);
Store("UseVps", UseVps);
Store("VpsMargin", VpsMargin);
Store("RecordingDirs", RecordingDirs);
Store("FoldersInTimerMenu", FoldersInTimerMenu);
Store("AlwaysSortFoldersFirst", AlwaysSortFoldersFirst);
Store("NumberKeysForChars", NumberKeysForChars);
Store("ColorKey0", ColorKey0);
Store("ColorKey1", ColorKey1);
Store("ColorKey2", ColorKey2);
Store("ColorKey3", ColorKey3);
Store("VideoDisplayFormat", VideoDisplayFormat);
Store("VideoFormat", VideoFormat);
Store("UpdateChannels", UpdateChannels);
Store("UseDolbyDigital", UseDolbyDigital);
Store("ChannelInfoPos", ChannelInfoPos);
Store("ChannelInfoTime", ChannelInfoTime);
Store("OSDLeftP", OSDLeftP);
Store("OSDTopP", OSDTopP);
Store("OSDWidthP", OSDWidthP);
Store("OSDHeightP", OSDHeightP);
Store("OSDLeft", OSDLeft);
Store("OSDTop", OSDTop);
Store("OSDWidth", OSDWidth);
Store("OSDHeight", OSDHeight);
Store("OSDAspect", OSDAspect);
Store("OSDMessageTime", OSDMessageTime);
Store("UseSmallFont", UseSmallFont);
Store("AntiAlias", AntiAlias);
Store("FontOsd", FontOsd);
Store("FontSml", FontSml);
Store("FontFix", FontFix);
Store("FontOsdSizeP", FontOsdSizeP);
Store("FontSmlSizeP", FontSmlSizeP);
Store("FontFixSizeP", FontFixSizeP);
Store("FontOsdSize", FontOsdSize);
Store("FontSmlSize", FontSmlSize);
Store("FontFixSize", FontFixSize);
Store("MaxVideoFileSize", MaxVideoFileSize);
Store("SplitEditedFiles", SplitEditedFiles);
Store("DelTimeshiftRec", DelTimeshiftRec);
Store("MinEventTimeout", MinEventTimeout);
Store("MinUserInactivity", MinUserInactivity);
Store("NextWakeupTime", NextWakeupTime);
Store("MultiSpeedMode", MultiSpeedMode);
Store("ShowReplayMode", ShowReplayMode);
Store("ShowRemainingTime", ShowRemainingTime);
Store("ProgressDisplayTime",ProgressDisplayTime);
Store("PauseOnMarkSet", PauseOnMarkSet);
Store("PauseOnMarkJump", PauseOnMarkJump);
Store("SkipEdited", SkipEdited);
Store("PauseAtLastMark", PauseAtLastMark);
Store("BinarySkipInitial", BinarySkipInitial);
Store("BinarySkipTimeout", BinarySkipTimeout);
Store("ResumeID", ResumeID);
Store("CurrentChannel", CurrentChannel);
Store("CurrentVolume", CurrentVolume);
Store("CurrentDolby", CurrentDolby);
Store("InitialChannel", InitialChannel);
Store("VolumeSteps", VolumeSteps);
Store("VolumeLinearize", VolumeLinearize);
Store("InitialVolume", InitialVolume);
Store("DeviceBondings", DeviceBondings);
Store("ChannelsWrap", ChannelsWrap);
Store("ShowChannelNamesWithSource", ShowChannelNamesWithSource);
Store("EmergencyExit", EmergencyExit);
Store("LastReplayed", cReplayControl::LastReplayed());
Sort();
if (cConfig<cSetupLine>::Save()) {
isyslog("saved setup to %s", FileName());
return true;
}
return false;
}