/* * 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.30 2012/12/05 11:33:14 kls Exp $ */ #include "config.h" #include #include #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); 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 : 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; 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; else if (!On && subItems) { delete subItems; subItems = NULL; } } // --- cNestedItemList ------------------------------------------------------- cNestedItemList::cNestedItemList(void) { fileName = NULL; } cNestedItemList::~cNestedItemList() { free(fileName); } bool cNestedItemList::Parse(FILE *f, cList *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 *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::Clear(); } bool cNestedItemList::Load(const char *FileName) { cList::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; 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, cString::sprintf("%f", Value), Plugin); } bool cSetup::Load(const char *FileName) { if (cConfig::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, "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, "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 = 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, "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 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("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); Sort(); if (cConfig::Save()) { isyslog("saved setup to %s", FileName()); return true; } return false; }