mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
VDR developer version 1.7.37 is now available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.37.tar.bz2 A 'diff' against the previous version is available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.36-1.7.37.diff MD5 checksums: 602dc7e678bcfcf075da36344a337562 vdr-1.7.37.tar.bz2 34e953fcffc112f316cbfc1f53915324 vdr-1.7.36-1.7.37.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. Approaching version 2.0.0: ========================== If all goes well, there should be no more functional or API changes before the final version 2.0.0. There will just be a few more fixes. From the HISTORY file: - Now also using FindHeader() in cMpeg2Fixer::AdjTref() (pointed out by Sören Moch). - Added missing template for DVBDIR to Make.config.template (reported by Derek Kelly). - The LCARS menu now also works if the OSD has only 1bpp (two colors). - Fixed possible garbage in the remaining time of the LCARS replay display in case the hours change from two to one digit. - Fixed upscaling bitmaps. The last row and column of the scaled bitmap was not filled, which resulted in empty lines between scaled subtitles. - Fixed a leftover line in case a two line subtitle was followed by a one line subtitle on the dvbhddevice in "high level" OSD mode. - Returning 0 from cDvbSdFfDevice::NumProvidedSystems() if option --outputonly is given. - The index file is now closed after initially reading it if it is older than 3600 seconds. - Improved responsiveness during replay when close to the recording's end. - Fixed a leftover progress display in the LCARS main menu when replay of a recording ends while the menu is open, and the live channel has no EPG information. - Fixed possible audio chatter when a recording is replayed to its very end. - Added dependency on 'i18n' to 'install-i18n' in the VDR Makefile (thanks to Tobias Grimm). - Changed several calls to Skins.Message() in vdr.c to Skins.QueueMessage() in order to avoid a black screen while such a message is displayed in case the channel will be switched (reported by Uwe Scheffler). - Updated the Slovakian language texts (thanks to Milan Hrala). - Improved LIRC timing for repeat function. - When pausing live video, the current audio and subtitle tracks are now retained. - Added some notes about plugin Makefiles to PLUGINS.html. - Avoiding an extra key press event if the repeat function kicks in when controlling VDR via the PC keyboard. - The new options "Setup/Miscellaneous/Remote control repeat delay" and "Setup/Miscellaneous/Remote control repeat delta" can be used to adjust the behavior of the remote control in case a key is held pressed down for a while, so that the repeat function kicks in (see MANUAL). The builtin LIRC and KBD remote controls already use these parameters. It is recommended that plugins that implement an interface to any kind of remote controls also use the parameters Setup.RcRepeatDelay and Setup.RcRepeatDelta for the desired purpose, and remove any setup options they might have that serve the same purpose. - cTimer no longer does any special "VFAT" handling to shorten directory names to 40 characters. When a string is used as a directory name for a recording, the maximum length of the directory path, as well as the individual directory names, is now limited to the values specified by the new command line option --dirnames (see man vdr(1) for details). For backwards compatibility the option --vfat is still available and has the same effect as --dirnames=250,40,1. - The macro MaxFileName is now obsolete and may be removed in future versions. Use NAME_MAX directly instead. - There is no more fixed limit to the maximum number of cPixmap objects an OSD can create. However, a particular device may still be unable to create an arbitrary number of pixmaps, due to limited resources. So it's always a good idea to use as few pixmaps as possible. - Fixed formatting and removed some superfluous break statements in vdr.c's command line option switch.
798 lines
27 KiB
C
798 lines
27 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 2.34 2013/02/05 11:16:08 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, "TITLE EPISODE");
|
|
InstantRecordTime = DEFINSTRECTIME;
|
|
LnbSLOF = 11700;
|
|
LnbFrequLo = 9750;
|
|
LnbFrequHi = 10600;
|
|
DiSEqC = 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;
|
|
NumberKeysForChars = 1;
|
|
ColorKey0 = 0;
|
|
ColorKey1 = 1;
|
|
ColorKey2 = 2;
|
|
ColorKey3 = 3;
|
|
VideoDisplayFormat = 1;
|
|
VideoFormat = 0;
|
|
UpdateChannels = 5;
|
|
UseDolbyDigital = 1;
|
|
ChannelInfoPos = 0;
|
|
ChannelInfoTime = 5;
|
|
OSDLeftP = 0.03;
|
|
OSDTopP = 0.03;
|
|
OSDWidthP = 0.93;
|
|
OSDHeightP = 0.93;
|
|
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;
|
|
ResumeID = 0;
|
|
CurrentChannel = -1;
|
|
CurrentVolume = MAXVOLUME;
|
|
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, true)) {
|
|
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, "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, "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, "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, "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("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("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("ResumeID", ResumeID);
|
|
Store("CurrentChannel", CurrentChannel);
|
|
Store("CurrentVolume", CurrentVolume);
|
|
Store("CurrentDolby", CurrentDolby);
|
|
Store("InitialChannel", InitialChannel);
|
|
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;
|
|
}
|