mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Original announce message: VDR developer version 1.7.22 is now available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.22.tar.bz2 A 'diff' against the previous version is available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.21-1.7.22.diff MD5 checksums: b9c0fe1aac8e653c0d0234bc72c2bb2c vdr-1.7.22.tar.bz2 868bb332342c9a78beda17cc85e0bb93 vdr-1.7.21-1.7.22.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: - Fixed scaling subtitles in case the primary device's GetVideoSize() function doesn't return actual values (thanks to Luca Olivetti). - The DiSEqC codes are now copied in the call to cDiseqc::Execute(). - VDR now supports "Satellite Channel Routing" (SCR) according to EN50494 (based on the "unicable" patch from Lars Hanisch). Since "Unicable" is a registered trademark and stands for only one of many implementations of SCR, the following changes have been made compared to the patch, which need to be taken into account by people who have set up their system using the patch: - The 'U' parameter in the diseqc.conf file has been changed to 'S' ("Scr"). - The configuration file name has been changed from "unicable.conf" to "scr.conf". - Updated sources.conf (thanks to Arthur Konovalov). - The SVDRP command LSTC now also accepts channel IDs (thanks to Dominic Evans). - Fixed handling DVB subtitles and implemented decoding textual DVB subtitles (thanks to Rolf Ahrenberg). - Added cap_net_raw to the capabilities that are not dropped (thanks to Dominic Evans). - Fixed setting the start time of an edited recording (thanks to Christoph Haubrich). - Temporarily switching free devices to transponders in order to have their running status updated is now done by marking the devices as "occupied" for a certain amount of time. - The new setup options "LNB/Device n connected to sat cable" can be used to define which DVB-S devices are connected to the same sat cable and are therefore "bonded". This obsoletes the LNBSHARE patch. Users of the LNBSHARE patch will need to newly set up their sat devices with the above options. - Fixed a crash when deleting a recording while cutting it (thanks to Ville Skyttä). - Fixed several spelling errors (thanks to Ville Skyttä). - The new SVDRP command UPDR can be used to trigger an update of the list of recordings (thanks to Lars Hanisch). - Added generating a pkg-config file to the Makefile (thanks to Ville Skyttä). - Removed the '.pl' suffix from all scripts (thanks to Ville Skyttä). - Changed the default location for the LIRC socket to /var/run/lirc/lircd (thanks to Ville Skyttä). - Added file name and line number to LOG_ERROR_STR() (thanks to Rolf Ahrenberg). - Replaced all calls to sleep() with cCondWait::SleepMs() (thanks to Rolf Ahrenberg). - Fixed a crash with malformed SI data (patch from vdr-portal).
766 lines
25 KiB
C
766 lines
25 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.16 2011/12/03 15:21:30 kls Exp $
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include "device.h"
|
|
#include "i18n.h"
|
|
#include "interface.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);
|
|
memset(array, size * sizeof(int), 0);
|
|
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 = strdup(Name);
|
|
value = strdup(Value);
|
|
plugin = Plugin ? strdup(Plugin) : 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, "sttng");
|
|
strcpy(OSDTheme, "default");
|
|
PrimaryDVB = 1;
|
|
ShowInfoOnChSwitch = 1;
|
|
TimeoutRequChInfo = 1;
|
|
MenuScrollPage = 1;
|
|
MenuScrollWrap = 0;
|
|
MenuKeyCloses = 0;
|
|
MarkInstantRecord = 1;
|
|
strcpy(NameInstantRecord, "TITLE EPISODE");
|
|
InstantRecordTime = 180;
|
|
LnbSLOF = 11700;
|
|
LnbFrequLo = 9750;
|
|
LnbFrequHi = 10600;
|
|
DiSEqC = 0;
|
|
SetSystemTime = 0;
|
|
TimeSource = 0;
|
|
TimeTransponder = 0;
|
|
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;
|
|
PrimaryLimit = 0;
|
|
DefaultPriority = 50;
|
|
DefaultLifetime = 99;
|
|
PauseKeyHandling = 2;
|
|
PausePriority = 10;
|
|
PauseLifetime = 1;
|
|
UseSubtitle = 1;
|
|
UseVps = 0;
|
|
VpsMargin = 120;
|
|
RecordingDirs = 1;
|
|
FoldersInTimerMenu = 1;
|
|
NumberKeysForChars = 1;
|
|
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.038;
|
|
FontSmlSizeP = 0.035;
|
|
FontFixSizeP = 0.031;
|
|
FontOsdSize = 22;
|
|
FontSmlSize = 18;
|
|
FontFixSize = 20;
|
|
MaxVideoFileSize = MAXVIDEOFILESIZEDEFAULT;
|
|
SplitEditedFiles = 0;
|
|
DelTimeshiftRec = 0;
|
|
MinEventTimeout = 30;
|
|
MinUserInactivity = 300;
|
|
NextWakeupTime = 0;
|
|
MultiSpeedMode = 0;
|
|
ShowReplayMode = 0;
|
|
ResumeID = 0;
|
|
CurrentChannel = -1;
|
|
CurrentVolume = MAXVOLUME;
|
|
CurrentDolby = 0;
|
|
InitialChannel = "";
|
|
DeviceBondings = "";
|
|
InitialVolume = -1;
|
|
ChannelsWrap = 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, cString::sprintf("%f", 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, MaxFileName);
|
|
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, "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, "PrimaryLimit")) PrimaryLimit = 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, "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 = atof(Value);
|
|
else if (!strcasecmp(Name, "OSDTopP")) OSDTopP = atof(Value);
|
|
else if (!strcasecmp(Name, "OSDWidthP")) { OSDWidthP = atof(Value); ChkDoublePlausibility(OSDWidthP, 0.87); }
|
|
else if (!strcasecmp(Name, "OSDHeightP")) { OSDHeightP = atof(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 = atof(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 = atof(Value); ChkDoublePlausibility(FontOsdSizeP, 0.038); }
|
|
else if (!strcasecmp(Name, "FontSmlSizeP")) { FontSmlSizeP = atof(Value); ChkDoublePlausibility(FontSmlSizeP, 0.035); }
|
|
else if (!strcasecmp(Name, "FontFixSizeP")) { FontFixSizeP = atof(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, "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, "EmergencyExit")) EmergencyExit = atoi(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("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("PrimaryLimit", PrimaryLimit);
|
|
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("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("ResumeID", ResumeID);
|
|
Store("CurrentChannel", CurrentChannel);
|
|
Store("CurrentVolume", CurrentVolume);
|
|
Store("CurrentDolby", CurrentDolby);
|
|
Store("InitialChannel", InitialChannel);
|
|
Store("InitialVolume", InitialVolume);
|
|
Store("DeviceBondings", DeviceBondings);
|
|
Store("ChannelsWrap", ChannelsWrap);
|
|
Store("EmergencyExit", EmergencyExit);
|
|
|
|
Sort();
|
|
|
|
if (cConfig<cSetupLine>::Save()) {
|
|
isyslog("saved setup to %s", FileName());
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|