vdr 2.6.1
config.c
Go to the documentation of this file.
1/*
2 * config.c: Configuration file handling
3 *
4 * See the main source file 'vdr.c' for copyright information and
5 * how to reach the author.
6 *
7 * $Id: config.c 4.8 2018/02/15 14:40:36 kls Exp $
8 */
9
10#include "config.h"
11#include <ctype.h>
12#include <stdlib.h>
13#include "device.h"
14#include "i18n.h"
15#include "interface.h"
16#include "menu.h"
17#include "plugin.h"
18#include "recording.h"
19
20// IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
21// format characters in order to allow any number of blanks after a numeric
22// value!
23
24#define ChkDoublePlausibility(Variable, Default) { if (Variable < 0.00001) Variable = Default; }
25
26// --- cSVDRPhost ------------------------------------------------------------
27
29{
30 addr.s_addr = 0;
31 mask = 0;
32}
33
34bool cSVDRPhost::Parse(const char *s)
35{
36 mask = 0xFFFFFFFF;
37 const char *p = strchr(s, '/');
38 if (p) {
39 char *error = NULL;
40 int m = strtoul(p + 1, &error, 10);
41 if (error && *error && !isspace(*error) || m > 32)
42 return false;
43 *(char *)p = 0; // yes, we know it's 'const' - will be restored!
44 if (m == 0)
45 mask = 0;
46 else {
47 mask <<= (32 - m);
48 mask = htonl(mask);
49 }
50 }
51 int result = inet_aton(s, &addr);
52 if (p)
53 *(char *)p = '/'; // there it is again
54 return result != 0 && (mask != 0 || addr.s_addr == 0);
55}
56
58{
59 return addr.s_addr == htonl(INADDR_LOOPBACK);
60}
61
63{
64 return (Address & mask) == (addr.s_addr & mask);
65}
66
67// --- cSatCableNumbers ------------------------------------------------------
68
69cSatCableNumbers::cSatCableNumbers(int Size, const char *s)
70{
71 size = Size;
72 array = MALLOC(int, size);
73 FromString(s);
74}
75
77{
78 free(array);
79}
80
82{
83 char *t;
84 int i = 0;
85 const char *p = s;
86 while (p && *p) {
87 int n = strtol(p, &t, 10);
88 if (t != p) {
89 if (i < size)
90 array[i++] = n;
91 else {
92 esyslog("ERROR: too many sat cable numbers in '%s'", s);
93 return false;
94 }
95 }
96 else {
97 esyslog("ERROR: invalid sat cable number in '%s'", s);
98 return false;
99 }
100 p = skipspace(t);
101 }
102 for ( ; i < size; i++)
103 array[i] = 0;
104 return true;
105}
106
108{
109 cString s("");
110 for (int i = 0; i < size; i++) {
111 s = cString::sprintf("%s%d ", *s, array[i]);
112 }
113 return s;
114}
115
116int cSatCableNumbers::FirstDeviceIndex(int DeviceIndex) const
117{
118 if (0 <= DeviceIndex && DeviceIndex < size) {
119 if (int CableNr = array[DeviceIndex]) {
120 for (int i = 0; i < size; i++) {
121 if (i < DeviceIndex && array[i] == CableNr)
122 return i;
123 }
124 }
125 }
126 return -1;
127}
128
129// --- cNestedItem -----------------------------------------------------------
130
131cNestedItem::cNestedItem(const char *Text, bool WithSubItems)
132{
133 text = strdup(Text ? Text : "");
134 subItems = WithSubItems ? new cList<cNestedItem> : NULL;
135}
136
138{
139 delete subItems;
140 free(text);
141}
142
143int cNestedItem::Compare(const cListObject &ListObject) const
144{
145 return strcasecmp(text, ((cNestedItem *)&ListObject)->text);
146}
147
149{
150 if (!subItems)
152 if (Item)
153 subItems->Add(Item);
154}
155
156void cNestedItem::SetText(const char *Text)
157{
158 free(text);
159 text = strdup(Text ? Text : "");
160}
161
163{
164 if (On && !subItems)
166 else if (!On && subItems) {
167 delete subItems;
168 subItems = NULL;
169 }
170}
171
172// --- cNestedItemList -------------------------------------------------------
173
175{
176 fileName = NULL;
177}
178
180{
181 free(fileName);
182}
183
185{
186 char *s;
187 cReadLine ReadLine;
188 while ((s = ReadLine.Read(f)) != NULL) {
189 Line++;
190 char *p = strchr(s, '#');
191 if (p)
192 *p = 0;
193 s = skipspace(stripspace(s));
194 if (!isempty(s)) {
195 p = s + strlen(s) - 1;
196 if (*p == '{') {
197 *p = 0;
198 stripspace(s);
199 cNestedItem *Item = new cNestedItem(s, true);
200 List->Add(Item);
201 if (!Parse(f, Item->SubItems(), Line))
202 return false;
203 }
204 else if (*s == '}')
205 break;
206 else
207 List->Add(new cNestedItem(s));
208 }
209 }
210 return true;
211}
212
214{
215 for (cNestedItem *Item = List->First(); Item; Item = List->Next(Item)) {
216 if (Item->SubItems()) {
217 fprintf(f, "%*s%s {\n", Indent, "", Item->Text());
218 Write(f, Item->SubItems(), Indent + 2);
219 fprintf(f, "%*s}\n", Indent + 2, "");
220 }
221 else
222 fprintf(f, "%*s%s\n", Indent, "", Item->Text());
223 }
224 return true;
225}
226
228{
229 free(fileName);
230 fileName = NULL;
232}
233
234bool cNestedItemList::Load(const char *FileName)
235{
237 if (FileName) {
238 free(fileName);
239 fileName = strdup(FileName);
240 }
241 bool result = false;
242 if (fileName && access(fileName, F_OK) == 0) {
243 isyslog("loading %s", fileName);
244 FILE *f = fopen(fileName, "r");
245 if (f) {
246 int Line = 0;
247 result = Parse(f, this, Line);
248 fclose(f);
249 }
250 else {
252 result = false;
253 }
254 }
255 return result;
256}
257
259{
260 bool result = true;
262 if (f.Open()) {
263 result = Write(f, this);
264 if (!f.Close())
265 result = false;
266 }
267 else
268 result = false;
269 return result;
270}
271
272// --- Folders and Commands --------------------------------------------------
273
277
278// --- cSVDRPhosts -----------------------------------------------------------
279
281
283{
284 cSVDRPhost *h = First();
285 while (h) {
286 if (!h->IsLocalhost())
287 return false;
288 h = (cSVDRPhost *)h->Next();
289 }
290 return true;
291}
292
294{
295 cSVDRPhost *h = First();
296 while (h) {
297 if (h->Accepts(Address))
298 return true;
299 h = (cSVDRPhost *)h->Next();
300 }
301 return false;
302}
303
304// --- cSetupLine ------------------------------------------------------------
305
307{
308 plugin = name = value = NULL;
309}
310
311cSetupLine::cSetupLine(const char *Name, const char *Value, const char *Plugin)
312{
313 name = strreplace(strdup(Name), '\n', 0);
314 value = strreplace(strdup(Value), '\n', 0);
315 plugin = Plugin ? strreplace(strdup(Plugin), '\n', 0) : NULL;
316}
317
319{
320 free(plugin);
321 free(name);
322 free(value);
323}
324
325int cSetupLine::Compare(const cListObject &ListObject) const
326{
327 const cSetupLine *sl = (cSetupLine *)&ListObject;
328 if (!plugin && !sl->plugin)
329 return strcasecmp(name, sl->name);
330 if (!plugin)
331 return -1;
332 if (!sl->plugin)
333 return 1;
334 int result = strcasecmp(plugin, sl->plugin);
335 if (result == 0)
336 result = strcasecmp(name, sl->name);
337 return result;
338}
339
340bool cSetupLine::Parse(char *s)
341{
342 char *p = strchr(s, '=');
343 if (p) {
344 *p = 0;
345 char *Name = compactspace(s);
346 char *Value = compactspace(p + 1);
347 if (*Name) { // value may be an empty string
348 p = strchr(Name, '.');
349 if (p) {
350 *p = 0;
351 char *Plugin = compactspace(Name);
352 Name = compactspace(p + 1);
353 if (!(*Plugin && *Name))
354 return false;
355 plugin = strdup(Plugin);
356 }
357 name = strdup(Name);
358 value = strdup(Value);
359 return true;
360 }
361 }
362 return false;
363}
364
365bool cSetupLine::Save(FILE *f)
366{
367 return fprintf(f, "%s%s%s = %s\n", plugin ? plugin : "", plugin ? "." : "", name, value) > 0;
368}
369
370// --- cSetup ----------------------------------------------------------------
371
373
375{
376 strcpy(OSDLanguage, ""); // default is taken from environment
377 strcpy(OSDSkin, "lcars");
378 strcpy(OSDTheme, "default");
379 PrimaryDVB = 1;
382 MenuScrollPage = 1;
383 MenuScrollWrap = 0;
384 MenuKeyCloses = 0;
388 LnbSLOF = 11700;
389 LnbFrequLo = 9750;
390 LnbFrequHi = 10600;
391 DiSEqC = 0;
392 UsePositioner = 0;
393 SiteLat = 0;
394 SiteLon = 0;
395 PositionerSpeed = 15;
396 PositionerSwing = 650;
398 SetSystemTime = 0;
399 TimeSource = 0;
400 TimeTransponder = 0;
402 MarginStart = 2;
403 MarginStop = 10;
404 AudioLanguages[0] = -1;
406 SubtitleLanguages[0] = -1;
407 SubtitleOffset = 0;
410 EPGLanguages[0] = -1;
411 EPGScanTimeout = 5;
412 EPGBugfixLevel = 3;
413 EPGLinger = 0;
414 SVDRPTimeout = 300;
415 SVDRPPeering = 0;
417 strcpy(SVDRPDefaultHost, "");
418 ZapTimeout = 3;
419 ChannelEntryTimeout = 1000;
420 RcRepeatDelay = 300;
421 RcRepeatDelta = 100;
422 DefaultPriority = 50;
426 PausePriority = 10;
427 PauseLifetime = 1;
428 UseSubtitle = 1;
429 UseVps = 0;
430 VpsMargin = 120;
431 RecordingDirs = 1;
437 ColorKey0 = 0;
438 ColorKey1 = 1;
439 ColorKey2 = 2;
440 ColorKey3 = 3;
442 VideoFormat = 0;
443 UpdateChannels = 5;
444 UseDolbyDigital = 1;
445 ChannelInfoPos = 0;
446 ChannelInfoTime = 5;
447 OSDLeftP = 0.08;
448 OSDTopP = 0.08;
449 OSDWidthP = 0.87;
450 OSDHeightP = 0.84;
451 OSDLeft = 54;
452 OSDTop = 45;
453 OSDWidth = 624;
454 OSDHeight = 486;
455 OSDAspect = 1.0;
456 OSDMessageTime = 1;
457 UseSmallFont = 1;
458 AntiAlias = 1;
459 strcpy(FontOsd, DefaultFontOsd);
460 strcpy(FontSml, DefaultFontSml);
461 strcpy(FontFix, DefaultFontFix);
462 FontOsdSizeP = 0.031;
463 FontSmlSizeP = 0.028;
464 FontFixSizeP = 0.030;
465 FontOsdSize = 22;
466 FontSmlSize = 18;
467 FontFixSize = 20;
470 DelTimeshiftRec = 0;
471 MinEventTimeout = 30;
472 MinUserInactivity = 300;
473 NextWakeupTime = 0;
474 MultiSpeedMode = 0;
475 ShowReplayMode = 0;
478 PauseOnMarkSet = 0;
479 PauseOnMarkJump = 1;
480 SkipEdited = 0;
481 PauseAtLastMark = 0;
486 SkipSeconds = 60;
488 ResumeID = 0;
489 CurrentChannel = -1;
491 VolumeSteps = 51;
492 VolumeLinearize = 0;
493 CurrentDolby = 0;
494 InitialChannel = "";
495 DeviceBondings = "";
496 InitialVolume = -1;
497 ChannelsWrap = 0;
499 EmergencyExit = 1;
500}
501
503{
504 memcpy(&__BeginData__, &s.__BeginData__, (char *)&s.__EndData__ - (char *)&s.__BeginData__);
507 return *this;
508}
509
510cSetupLine *cSetup::Get(const char *Name, const char *Plugin)
511{
512 for (cSetupLine *l = First(); l; l = Next(l)) {
513 if ((l->Plugin() == NULL) == (Plugin == NULL)) {
514 if ((!Plugin || strcasecmp(l->Plugin(), Plugin) == 0) && strcasecmp(l->Name(), Name) == 0)
515 return l;
516 }
517 }
518 return NULL;
519}
520
521void cSetup::Store(const char *Name, const char *Value, const char *Plugin, bool AllowMultiple)
522{
523 if (Name && *Name) {
524 cSetupLine *l = Get(Name, Plugin);
525 if (l && !AllowMultiple)
526 Del(l);
527 if (Value)
528 Add(new cSetupLine(Name, Value, Plugin));
529 }
530}
531
532void cSetup::Store(const char *Name, int Value, const char *Plugin)
533{
534 Store(Name, cString::sprintf("%d", Value), Plugin);
535}
536
537void cSetup::Store(const char *Name, double &Value, const char *Plugin)
538{
539 Store(Name, dtoa(Value), Plugin);
540}
541
542bool cSetup::Load(const char *FileName)
543{
545 bool result = true;
546 for (cSetupLine *l = First(); l; l = Next(l)) {
547 bool error = false;
548 if (l->Plugin()) {
549 cPlugin *p = cPluginManager::GetPlugin(l->Plugin());
550 if (p && !p->SetupParse(l->Name(), l->Value()))
551 error = true;
552 }
553 else {
554 if (!Parse(l->Name(), l->Value()))
555 error = true;
556 }
557 if (error) {
558 esyslog("ERROR: unknown config parameter: %s%s%s = %s", l->Plugin() ? l->Plugin() : "", l->Plugin() ? "." : "", l->Name(), l->Value());
559 result = false;
560 }
561 }
562 return result;
563 }
564 return false;
565}
566
567void cSetup::StoreLanguages(const char *Name, int *Values)
568{
569 char buffer[I18nLanguages()->Size() * 4];
570 char *q = buffer;
571 for (int i = 0; i < I18nLanguages()->Size(); i++) {
572 if (Values[i] < 0)
573 break;
574 const char *s = I18nLanguageCode(Values[i]);
575 if (s) {
576 if (q > buffer)
577 *q++ = ' ';
578 strncpy(q, s, 3);
579 q += 3;
580 }
581 }
582 *q = 0;
583 Store(Name, buffer);
584}
585
586bool cSetup::ParseLanguages(const char *Value, int *Values)
587{
588 int n = 0;
589 while (Value && *Value && n < I18nLanguages()->Size()) {
590 char buffer[4];
591 strn0cpy(buffer, Value, sizeof(buffer));
592 int i = I18nLanguageIndex(buffer);
593 if (i >= 0)
594 Values[n++] = i;
595 if ((Value = strchr(Value, ' ')) != NULL)
596 Value++;
597 }
598 Values[n] = -1;
599 return true;
600}
601
602bool cSetup::Parse(const char *Name, const char *Value)
603{
604 if (!strcasecmp(Name, "OSDLanguage")) { strn0cpy(OSDLanguage, Value, sizeof(OSDLanguage)); I18nSetLocale(OSDLanguage); }
605 else if (!strcasecmp(Name, "OSDSkin")) Utf8Strn0Cpy(OSDSkin, Value, MaxSkinName);
606 else if (!strcasecmp(Name, "OSDTheme")) Utf8Strn0Cpy(OSDTheme, Value, MaxThemeName);
607 else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value);
608 else if (!strcasecmp(Name, "ShowInfoOnChSwitch")) ShowInfoOnChSwitch = atoi(Value);
609 else if (!strcasecmp(Name, "TimeoutRequChInfo")) TimeoutRequChInfo = atoi(Value);
610 else if (!strcasecmp(Name, "MenuScrollPage")) MenuScrollPage = atoi(Value);
611 else if (!strcasecmp(Name, "MenuScrollWrap")) MenuScrollWrap = atoi(Value);
612 else if (!strcasecmp(Name, "MenuKeyCloses")) MenuKeyCloses = atoi(Value);
613 else if (!strcasecmp(Name, "MarkInstantRecord")) MarkInstantRecord = atoi(Value);
614 else if (!strcasecmp(Name, "NameInstantRecord")) Utf8Strn0Cpy(NameInstantRecord, Value, sizeof(NameInstantRecord));
615 else if (!strcasecmp(Name, "InstantRecordTime")) InstantRecordTime = atoi(Value);
616 else if (!strcasecmp(Name, "LnbSLOF")) LnbSLOF = atoi(Value);
617 else if (!strcasecmp(Name, "LnbFrequLo")) LnbFrequLo = atoi(Value);
618 else if (!strcasecmp(Name, "LnbFrequHi")) LnbFrequHi = atoi(Value);
619 else if (!strcasecmp(Name, "DiSEqC")) DiSEqC = atoi(Value);
620 else if (!strcasecmp(Name, "UsePositioner")) UsePositioner = atoi(Value);
621 else if (!strcasecmp(Name, "SiteLat")) SiteLat = atoi(Value);
622 else if (!strcasecmp(Name, "SiteLon")) SiteLon = atoi(Value);
623 else if (!strcasecmp(Name, "PositionerSpeed")) PositionerSpeed = atoi(Value);
624 else if (!strcasecmp(Name, "PositionerSwing")) PositionerSwing = atoi(Value);
625 else if (!strcasecmp(Name, "PositionerLastLon")) PositionerLastLon = atoi(Value);
626 else if (!strcasecmp(Name, "SetSystemTime")) SetSystemTime = atoi(Value);
627 else if (!strcasecmp(Name, "TimeSource")) TimeSource = cSource::FromString(Value);
628 else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value);
629 else if (!strcasecmp(Name, "StandardCompliance")) StandardCompliance = atoi(Value);
630 else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value);
631 else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value);
632 else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages);
633 else if (!strcasecmp(Name, "DisplaySubtitles")) DisplaySubtitles = atoi(Value);
634 else if (!strcasecmp(Name, "SubtitleLanguages")) return ParseLanguages(Value, SubtitleLanguages);
635 else if (!strcasecmp(Name, "SubtitleOffset")) SubtitleOffset = atoi(Value);
636 else if (!strcasecmp(Name, "SubtitleFgTransparency")) SubtitleFgTransparency = atoi(Value);
637 else if (!strcasecmp(Name, "SubtitleBgTransparency")) SubtitleBgTransparency = atoi(Value);
638 else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages);
639 else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
640 else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
641 else if (!strcasecmp(Name, "EPGLinger")) EPGLinger = atoi(Value);
642 else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
643 else if (!strcasecmp(Name, "SVDRPPeering")) SVDRPPeering = atoi(Value);
644 else if (!strcasecmp(Name, "SVDRPHostName")) { if (*Value) strn0cpy(SVDRPHostName, Value, sizeof(SVDRPHostName)); }
645 else if (!strcasecmp(Name, "SVDRPDefaultHost")) strn0cpy(SVDRPDefaultHost, Value, sizeof(SVDRPDefaultHost));
646 else if (!strcasecmp(Name, "ZapTimeout")) ZapTimeout = atoi(Value);
647 else if (!strcasecmp(Name, "ChannelEntryTimeout")) ChannelEntryTimeout= atoi(Value);
648 else if (!strcasecmp(Name, "RcRepeatDelay")) RcRepeatDelay = atoi(Value);
649 else if (!strcasecmp(Name, "RcRepeatDelta")) RcRepeatDelta = atoi(Value);
650 else if (!strcasecmp(Name, "DefaultPriority")) DefaultPriority = atoi(Value);
651 else if (!strcasecmp(Name, "DefaultLifetime")) DefaultLifetime = atoi(Value);
652 else if (!strcasecmp(Name, "RecordKeyHandling")) RecordKeyHandling = atoi(Value);
653 else if (!strcasecmp(Name, "PauseKeyHandling")) PauseKeyHandling = atoi(Value);
654 else if (!strcasecmp(Name, "PausePriority")) PausePriority = atoi(Value);
655 else if (!strcasecmp(Name, "PauseLifetime")) PauseLifetime = atoi(Value);
656 else if (!strcasecmp(Name, "UseSubtitle")) UseSubtitle = atoi(Value);
657 else if (!strcasecmp(Name, "UseVps")) UseVps = atoi(Value);
658 else if (!strcasecmp(Name, "VpsMargin")) VpsMargin = atoi(Value);
659 else if (!strcasecmp(Name, "RecordingDirs")) RecordingDirs = atoi(Value);
660 else if (!strcasecmp(Name, "FoldersInTimerMenu")) FoldersInTimerMenu = atoi(Value);
661 else if (!strcasecmp(Name, "AlwaysSortFoldersFirst")) AlwaysSortFoldersFirst = atoi(Value);
662 else if (!strcasecmp(Name, "RecSortingDirection")) RecSortingDirection= atoi(Value);
663 else if (!strcasecmp(Name, "DefaultSortModeRec")) DefaultSortModeRec = atoi(Value);
664 else if (!strcasecmp(Name, "NumberKeysForChars")) NumberKeysForChars = atoi(Value);
665 else if (!strcasecmp(Name, "ColorKey0")) ColorKey0 = atoi(Value);
666 else if (!strcasecmp(Name, "ColorKey1")) ColorKey1 = atoi(Value);
667 else if (!strcasecmp(Name, "ColorKey2")) ColorKey2 = atoi(Value);
668 else if (!strcasecmp(Name, "ColorKey3")) ColorKey3 = atoi(Value);
669 else if (!strcasecmp(Name, "VideoDisplayFormat")) VideoDisplayFormat = atoi(Value);
670 else if (!strcasecmp(Name, "VideoFormat")) VideoFormat = atoi(Value);
671 else if (!strcasecmp(Name, "UpdateChannels")) UpdateChannels = atoi(Value);
672 else if (!strcasecmp(Name, "UseDolbyDigital")) UseDolbyDigital = atoi(Value);
673 else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value);
674 else if (!strcasecmp(Name, "ChannelInfoTime")) ChannelInfoTime = atoi(Value);
675 else if (!strcasecmp(Name, "OSDLeftP")) OSDLeftP = atod(Value);
676 else if (!strcasecmp(Name, "OSDTopP")) OSDTopP = atod(Value);
677 else if (!strcasecmp(Name, "OSDWidthP")) { OSDWidthP = atod(Value); ChkDoublePlausibility(OSDWidthP, 0.87); }
678 else if (!strcasecmp(Name, "OSDHeightP")) { OSDHeightP = atod(Value); ChkDoublePlausibility(OSDHeightP, 0.84); }
679 else if (!strcasecmp(Name, "OSDLeft")) OSDLeft = atoi(Value);
680 else if (!strcasecmp(Name, "OSDTop")) OSDTop = atoi(Value);
681 else if (!strcasecmp(Name, "OSDWidth")) { OSDWidth = atoi(Value); OSDWidth &= ~0x07; } // OSD width must be a multiple of 8
682 else if (!strcasecmp(Name, "OSDHeight")) OSDHeight = atoi(Value);
683 else if (!strcasecmp(Name, "OSDAspect")) OSDAspect = atod(Value);
684 else if (!strcasecmp(Name, "OSDMessageTime")) OSDMessageTime = atoi(Value);
685 else if (!strcasecmp(Name, "UseSmallFont")) UseSmallFont = atoi(Value);
686 else if (!strcasecmp(Name, "AntiAlias")) AntiAlias = atoi(Value);
687 else if (!strcasecmp(Name, "FontOsd")) Utf8Strn0Cpy(FontOsd, Value, MAXFONTNAME);
688 else if (!strcasecmp(Name, "FontSml")) Utf8Strn0Cpy(FontSml, Value, MAXFONTNAME);
689 else if (!strcasecmp(Name, "FontFix")) Utf8Strn0Cpy(FontFix, Value, MAXFONTNAME);
690 else if (!strcasecmp(Name, "FontOsdSizeP")) { FontOsdSizeP = atod(Value); ChkDoublePlausibility(FontOsdSizeP, 0.038); }
691 else if (!strcasecmp(Name, "FontSmlSizeP")) { FontSmlSizeP = atod(Value); ChkDoublePlausibility(FontSmlSizeP, 0.035); }
692 else if (!strcasecmp(Name, "FontFixSizeP")) { FontFixSizeP = atod(Value); ChkDoublePlausibility(FontFixSizeP, 0.031); }
693 else if (!strcasecmp(Name, "FontOsdSize")) FontOsdSize = atoi(Value);
694 else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value);
695 else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = atoi(Value);
696 else if (!strcasecmp(Name, "MaxVideoFileSize")) MaxVideoFileSize = atoi(Value);
697 else if (!strcasecmp(Name, "SplitEditedFiles")) SplitEditedFiles = atoi(Value);
698 else if (!strcasecmp(Name, "DelTimeshiftRec")) DelTimeshiftRec = atoi(Value);
699 else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value);
700 else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value);
701 else if (!strcasecmp(Name, "NextWakeupTime")) NextWakeupTime = atoi(Value);
702 else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
703 else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
704 else if (!strcasecmp(Name, "ShowRemainingTime")) ShowRemainingTime = atoi(Value);
705 else if (!strcasecmp(Name, "ProgressDisplayTime")) ProgressDisplayTime= atoi(Value);
706 else if (!strcasecmp(Name, "PauseOnMarkSet")) PauseOnMarkSet = atoi(Value);
707 else if (!strcasecmp(Name, "PauseOnMarkJump")) PauseOnMarkJump = atoi(Value);
708 else if (!strcasecmp(Name, "SkipEdited")) SkipEdited = atoi(Value);
709 else if (!strcasecmp(Name, "PauseAtLastMark")) PauseAtLastMark = atoi(Value);
710 else if (!strcasecmp(Name, "AdaptiveSkipInitial")) AdaptiveSkipInitial= atoi(Value);
711 else if (!strcasecmp(Name, "AdaptiveSkipTimeout")) AdaptiveSkipTimeout= atoi(Value);
712 else if (!strcasecmp(Name, "AdaptiveSkipAlternate")) AdaptiveSkipAlternate = atoi(Value);
713 else if (!strcasecmp(Name, "AdaptiveSkipPrevNext")) AdaptiveSkipPrevNext = atoi(Value);
714 else if (!strcasecmp(Name, "SkipSeconds")) SkipSeconds = atoi(Value);
715 else if (!strcasecmp(Name, "SkipSecondsRepeat")) SkipSecondsRepeat = atoi(Value);
716 else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value);
717 else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
718 else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
719 else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value);
720 else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = Value;
721 else if (!strcasecmp(Name, "VolumeSteps")) VolumeSteps = atoi(Value);
722 else if (!strcasecmp(Name, "VolumeLinearize")) VolumeLinearize = atoi(Value);
723 else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value);
724 else if (!strcasecmp(Name, "DeviceBondings")) DeviceBondings = Value;
725 else if (!strcasecmp(Name, "ChannelsWrap")) ChannelsWrap = atoi(Value);
726 else if (!strcasecmp(Name, "ShowChannelNamesWithSource")) ShowChannelNamesWithSource = atoi(Value);
727 else if (!strcasecmp(Name, "EmergencyExit")) EmergencyExit = atoi(Value);
728 else if (!strcasecmp(Name, "LastReplayed")) cReplayControl::SetRecording(Value);
729 else
730 return false;
731 return true;
732}
733
734bool cSetup::Save(void)
735{
736 Store("OSDLanguage", OSDLanguage);
737 Store("OSDSkin", OSDSkin);
738 Store("OSDTheme", OSDTheme);
739 Store("PrimaryDVB", PrimaryDVB);
740 Store("ShowInfoOnChSwitch", ShowInfoOnChSwitch);
741 Store("TimeoutRequChInfo", TimeoutRequChInfo);
742 Store("MenuScrollPage", MenuScrollPage);
743 Store("MenuScrollWrap", MenuScrollWrap);
744 Store("MenuKeyCloses", MenuKeyCloses);
745 Store("MarkInstantRecord", MarkInstantRecord);
746 Store("NameInstantRecord", NameInstantRecord);
747 Store("InstantRecordTime", InstantRecordTime);
748 Store("LnbSLOF", LnbSLOF);
749 Store("LnbFrequLo", LnbFrequLo);
750 Store("LnbFrequHi", LnbFrequHi);
751 Store("DiSEqC", DiSEqC);
752 Store("UsePositioner", UsePositioner);
753 Store("SiteLat", SiteLat);
754 Store("SiteLon", SiteLon);
755 Store("PositionerSpeed", PositionerSpeed);
756 Store("PositionerSwing", PositionerSwing);
757 Store("PositionerLastLon", PositionerLastLon);
758 Store("SetSystemTime", SetSystemTime);
759 Store("TimeSource", cSource::ToString(TimeSource));
760 Store("TimeTransponder", TimeTransponder);
761 Store("StandardCompliance", StandardCompliance);
762 Store("MarginStart", MarginStart);
763 Store("MarginStop", MarginStop);
764 StoreLanguages("AudioLanguages", AudioLanguages);
765 Store("DisplaySubtitles", DisplaySubtitles);
766 StoreLanguages("SubtitleLanguages", SubtitleLanguages);
767 Store("SubtitleOffset", SubtitleOffset);
768 Store("SubtitleFgTransparency", SubtitleFgTransparency);
769 Store("SubtitleBgTransparency", SubtitleBgTransparency);
770 StoreLanguages("EPGLanguages", EPGLanguages);
771 Store("EPGScanTimeout", EPGScanTimeout);
772 Store("EPGBugfixLevel", EPGBugfixLevel);
773 Store("EPGLinger", EPGLinger);
774 Store("SVDRPTimeout", SVDRPTimeout);
775 Store("SVDRPPeering", SVDRPPeering);
776 Store("SVDRPHostName", strcmp(SVDRPHostName, GetHostName()) ? SVDRPHostName : "");
777 Store("SVDRPDefaultHost", SVDRPDefaultHost);
778 Store("ZapTimeout", ZapTimeout);
779 Store("ChannelEntryTimeout",ChannelEntryTimeout);
780 Store("RcRepeatDelay", RcRepeatDelay);
781 Store("RcRepeatDelta", RcRepeatDelta);
782 Store("DefaultPriority", DefaultPriority);
783 Store("DefaultLifetime", DefaultLifetime);
784 Store("RecordKeyHandling", RecordKeyHandling);
785 Store("PauseKeyHandling", PauseKeyHandling);
786 Store("PausePriority", PausePriority);
787 Store("PauseLifetime", PauseLifetime);
788 Store("UseSubtitle", UseSubtitle);
789 Store("UseVps", UseVps);
790 Store("VpsMargin", VpsMargin);
791 Store("RecordingDirs", RecordingDirs);
792 Store("FoldersInTimerMenu", FoldersInTimerMenu);
793 Store("AlwaysSortFoldersFirst", AlwaysSortFoldersFirst);
794 Store("RecSortingDirection",RecSortingDirection);
795 Store("DefaultSortModeRec", DefaultSortModeRec);
796 Store("NumberKeysForChars", NumberKeysForChars);
797 Store("ColorKey0", ColorKey0);
798 Store("ColorKey1", ColorKey1);
799 Store("ColorKey2", ColorKey2);
800 Store("ColorKey3", ColorKey3);
801 Store("VideoDisplayFormat", VideoDisplayFormat);
802 Store("VideoFormat", VideoFormat);
803 Store("UpdateChannels", UpdateChannels);
804 Store("UseDolbyDigital", UseDolbyDigital);
805 Store("ChannelInfoPos", ChannelInfoPos);
806 Store("ChannelInfoTime", ChannelInfoTime);
807 Store("OSDLeftP", OSDLeftP);
808 Store("OSDTopP", OSDTopP);
809 Store("OSDWidthP", OSDWidthP);
810 Store("OSDHeightP", OSDHeightP);
811 Store("OSDLeft", OSDLeft);
812 Store("OSDTop", OSDTop);
813 Store("OSDWidth", OSDWidth);
814 Store("OSDHeight", OSDHeight);
815 Store("OSDAspect", OSDAspect);
816 Store("OSDMessageTime", OSDMessageTime);
817 Store("UseSmallFont", UseSmallFont);
818 Store("AntiAlias", AntiAlias);
819 Store("FontOsd", FontOsd);
820 Store("FontSml", FontSml);
821 Store("FontFix", FontFix);
822 Store("FontOsdSizeP", FontOsdSizeP);
823 Store("FontSmlSizeP", FontSmlSizeP);
824 Store("FontFixSizeP", FontFixSizeP);
825 Store("FontOsdSize", FontOsdSize);
826 Store("FontSmlSize", FontSmlSize);
827 Store("FontFixSize", FontFixSize);
828 Store("MaxVideoFileSize", MaxVideoFileSize);
829 Store("SplitEditedFiles", SplitEditedFiles);
830 Store("DelTimeshiftRec", DelTimeshiftRec);
831 Store("MinEventTimeout", MinEventTimeout);
832 Store("MinUserInactivity", MinUserInactivity);
833 Store("NextWakeupTime", NextWakeupTime);
834 Store("MultiSpeedMode", MultiSpeedMode);
835 Store("ShowReplayMode", ShowReplayMode);
836 Store("ShowRemainingTime", ShowRemainingTime);
837 Store("ProgressDisplayTime",ProgressDisplayTime);
838 Store("PauseOnMarkSet", PauseOnMarkSet);
839 Store("PauseOnMarkJump", PauseOnMarkJump);
840 Store("SkipEdited", SkipEdited);
841 Store("PauseAtLastMark", PauseAtLastMark);
842 Store("AdaptiveSkipInitial",AdaptiveSkipInitial);
843 Store("AdaptiveSkipTimeout",AdaptiveSkipTimeout);
844 Store("AdaptiveSkipAlternate", AdaptiveSkipAlternate);
845 Store("AdaptiveSkipPrevNext", AdaptiveSkipPrevNext);
846 Store("SkipSeconds", SkipSeconds);
847 Store("SkipSecondsRepeat", SkipSecondsRepeat);
848 Store("ResumeID", ResumeID);
849 Store("CurrentChannel", CurrentChannel);
850 Store("CurrentVolume", CurrentVolume);
851 Store("CurrentDolby", CurrentDolby);
852 Store("InitialChannel", InitialChannel);
853 Store("VolumeSteps", VolumeSteps);
854 Store("VolumeLinearize", VolumeLinearize);
855 Store("InitialVolume", InitialVolume);
856 Store("DeviceBondings", DeviceBondings);
857 Store("ChannelsWrap", ChannelsWrap);
858 Store("ShowChannelNamesWithSource", ShowChannelNamesWithSource);
859 Store("EmergencyExit", EmergencyExit);
860 Store("LastReplayed", cReplayControl::LastReplayed());
861
862 Sort();
863
865 isyslog("saved setup to %s", FileName());
866 return true;
867 }
868 return false;
869}
const char * FileName(void)
Definition: config.h:126
virtual void Clear(void)
Definition: tools.c:2261
void Del(cListObject *Object, bool DeleteObject=true)
Definition: tools.c:2216
void Add(cListObject *Object, cListObject *After=NULL)
Definition: tools.c:2184
void Sort(void)
Definition: tools.c:2308
cListObject * Next(void) const
Definition: tools.h:557
Definition: tools.h:641
const T * First(void) const
Returns the first element in this list, or NULL if the list is empty.
Definition: tools.h:653
const T * Next(const T *Object) const
< Returns the element immediately before Object in this list, or NULL if Object is the first element ...
Definition: tools.h:660
bool Save(void)
Definition: config.c:258
bool Write(FILE *f, cList< cNestedItem > *List, int Indent=0)
Definition: config.c:213
void Clear(void)
Definition: config.c:227
virtual ~cNestedItemList()
Definition: config.c:179
bool Parse(FILE *f, cList< cNestedItem > *List, int &Line)
Definition: config.c:184
bool Load(const char *FileName)
Definition: config.c:234
char * fileName
Definition: config.h:213
cNestedItemList(void)
Definition: config.c:174
void SetText(const char *Text)
Definition: config.c:156
virtual ~cNestedItem()
Definition: config.c:137
char * text
Definition: config.h:198
virtual int Compare(const cListObject &ListObject) const
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
Definition: config.c:143
void AddSubItem(cNestedItem *Item)
Definition: config.c:148
void SetSubItems(bool On)
Definition: config.c:162
cNestedItem(const char *Text, bool WithSubItems=false)
Definition: config.c:131
cList< cNestedItem > * SubItems(void)
Definition: config.h:205
cList< cNestedItem > * subItems
Definition: config.h:199
const char * Text(void) const
Definition: config.h:204
static cPlugin * GetPlugin(int Index)
Definition: plugin.c:469
Definition: plugin.h:22
virtual bool SetupParse(const char *Name, const char *Value)
Definition: plugin.c:105
char * Read(FILE *f)
Definition: tools.c:1481
static void SetRecording(const char *FileName)
Definition: menu.c:5864
static const char * LastReplayed(void)
Definition: menu.c:5874
bool Parse(const char *s)
Definition: config.c:34
in_addr_t mask
Definition: config.h:86
bool IsLocalhost(void)
Definition: config.c:57
cSVDRPhost(void)
Definition: config.c:28
bool Accepts(in_addr_t Address)
Definition: config.c:62
struct in_addr addr
Definition: config.h:85
bool LocalhostOnly(void)
Definition: config.c:282
bool Acceptable(in_addr_t Address)
Definition: config.c:293
bool Open(void)
Definition: tools.c:1772
bool Close(void)
Definition: tools.c:1782
cSatCableNumbers(int Size, const char *s=NULL)
Definition: config.c:69
int Size(void) const
Definition: config.h:101
bool FromString(const char *s)
Definition: config.c:81
~cSatCableNumbers()
Definition: config.c:76
cString ToString(void)
Definition: config.c:107
int * array
Definition: config.h:97
int FirstDeviceIndex(int DeviceIndex) const
Returns the first device index (starting at 0) that uses the same sat cable number as the device with...
Definition: config.c:116
char * plugin
Definition: config.h:237
const char * Name(void)
Definition: config.h:246
cSetupLine(void)
Definition: config.c:306
bool Save(FILE *f)
Definition: config.c:365
virtual int Compare(const cListObject &ListObject) const
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
Definition: config.c:325
const char * Plugin(void)
Definition: config.h:245
const char * Value(void)
Definition: config.h:247
virtual ~cSetupLine()
Definition: config.c:318
bool Parse(char *s)
Definition: config.c:340
char * value
Definition: config.h:239
char * name
Definition: config.h:238
Definition: config.h:252
int __EndData__
Definition: config.h:373
int DefaultLifetime
Definition: config.h:309
int VolumeSteps
Definition: config.h:366
int EmergencyExit
Definition: config.h:372
int SplitEditedFiles
Definition: config.h:345
int RcRepeatDelay
Definition: config.h:307
int ColorKey3
Definition: config.h:322
int MenuScrollPage
Definition: config.h:271
int EPGBugfixLevel
Definition: config.h:299
int ColorKey2
Definition: config.h:322
int VideoDisplayFormat
Definition: config.h:323
int SubtitleFgTransparency
Definition: config.h:296
int MinUserInactivity
Definition: config.h:347
int CurrentVolume
Definition: config.h:365
int AntiAlias
Definition: config.h:334
int FontFixSize
Definition: config.h:343
int ShowInfoOnChSwitch
Definition: config.h:269
int SkipSecondsRepeat
Definition: config.h:362
int StandardCompliance
Definition: config.h:290
char SVDRPDefaultHost[HOST_NAME_MAX]
Definition: config.h:304
int CurrentChannel
Definition: config.h:364
bool Save(void)
Definition: config.c:734
int TimeoutRequChInfo
Definition: config.h:270
int ResumeID
Definition: config.h:363
char OSDTheme[MaxThemeName]
Definition: config.h:267
int SubtitleLanguages[I18N_MAX_LANGUAGES+1]
Definition: config.h:294
int SVDRPTimeout
Definition: config.h:301
int OSDHeight
Definition: config.h:330
int LnbSLOF
Definition: config.h:277
int EPGLanguages[I18N_MAX_LANGUAGES+1]
Definition: config.h:297
char OSDSkin[MaxSkinName]
Definition: config.h:266
int UsePositioner
Definition: config.h:281
int AlwaysSortFoldersFirst
Definition: config.h:318
int AdaptiveSkipInitial
Definition: config.h:357
int RecSortingDirection
Definition: config.h:320
int VpsMargin
Definition: config.h:315
double OSDAspect
Definition: config.h:331
char OSDLanguage[I18N_MAX_LOCALE_LEN]
Definition: config.h:265
int ShowChannelNamesWithSource
Definition: config.h:371
int DefaultPriority
Definition: config.h:309
int ZapTimeout
Definition: config.h:305
double OSDWidthP
Definition: config.h:329
int RecordKeyHandling
Definition: config.h:310
int PauseKeyHandling
Definition: config.h:311
double OSDHeightP
Definition: config.h:329
int PositionerSpeed
Definition: config.h:284
cSetup & operator=(const cSetup &s)
Definition: config.c:502
int MarginStart
Definition: config.h:291
bool Parse(const char *Name, const char *Value)
Definition: config.c:602
double FontOsdSizeP
Definition: config.h:338
int PauseAtLastMark
Definition: config.h:356
int AdaptiveSkipPrevNext
Definition: config.h:360
int FontOsdSize
Definition: config.h:341
int LnbFrequLo
Definition: config.h:278
bool Load(const char *FileName)
Definition: config.c:542
int FontSmlSize
Definition: config.h:342
int UseSmallFont
Definition: config.h:333
int SubtitleOffset
Definition: config.h:295
int MarginStop
Definition: config.h:291
cSetupLine * Get(const char *Name, const char *Plugin=NULL)
Definition: config.c:510
int SVDRPPeering
Definition: config.h:302
int ProgressDisplayTime
Definition: config.h:352
int UpdateChannels
Definition: config.h:325
int SkipSeconds
Definition: config.h:361
int SubtitleBgTransparency
Definition: config.h:296
int ColorKey0
Definition: config.h:322
int FoldersInTimerMenu
Definition: config.h:317
int MenuScrollWrap
Definition: config.h:272
int EPGLinger
Definition: config.h:300
int ShowReplayMode
Definition: config.h:350
cSetup(void)
Definition: config.c:374
int SiteLon
Definition: config.h:283
int OSDTop
Definition: config.h:330
int AdaptiveSkipAlternate
Definition: config.h:359
int UseVps
Definition: config.h:314
time_t NextWakeupTime
Definition: config.h:348
void StoreLanguages(const char *Name, int *Values)
Definition: config.c:567
int DisplaySubtitles
Definition: config.h:293
bool ParseLanguages(const char *Value, int *Values)
Definition: config.c:586
int ChannelInfoTime
Definition: config.h:328
int SiteLat
Definition: config.h:282
int VolumeLinearize
Definition: config.h:367
int ChannelsWrap
Definition: config.h:370
double FontFixSizeP
Definition: config.h:340
int AudioLanguages[I18N_MAX_LANGUAGES+1]
Definition: config.h:292
int OSDMessageTime
Definition: config.h:332
int MarkInstantRecord
Definition: config.h:274
double OSDLeftP
Definition: config.h:329
int RecordingDirs
Definition: config.h:316
int PausePriority
Definition: config.h:312
double FontSmlSizeP
Definition: config.h:339
int OSDLeft
Definition: config.h:330
int AdaptiveSkipTimeout
Definition: config.h:358
int MenuKeyCloses
Definition: config.h:273
int DiSEqC
Definition: config.h:280
char NameInstantRecord[NAME_MAX+1]
Definition: config.h:275
char FontOsd[MAXFONTNAME]
Definition: config.h:335
int UseSubtitle
Definition: config.h:313
int OSDWidth
Definition: config.h:330
int MinEventTimeout
Definition: config.h:347
int ChannelInfoPos
Definition: config.h:327
int LnbFrequHi
Definition: config.h:279
void Store(const char *Name, const char *Value, const char *Plugin=NULL, bool AllowMultiple=false)
Definition: config.c:521
char FontSml[MAXFONTNAME]
Definition: config.h:336
int MultiSpeedMode
Definition: config.h:349
int __BeginData__
Definition: config.h:264
int EPGScanTimeout
Definition: config.h:298
int TimeTransponder
Definition: config.h:289
int VideoFormat
Definition: config.h:324
int MaxVideoFileSize
Definition: config.h:344
cString DeviceBondings
Definition: config.h:375
int PositionerSwing
Definition: config.h:285
double OSDTopP
Definition: config.h:329
int PositionerLastLon
Definition: config.h:286
int PauseOnMarkSet
Definition: config.h:353
int DelTimeshiftRec
Definition: config.h:346
int SetSystemTime
Definition: config.h:287
int PrimaryDVB
Definition: config.h:268
int ChannelEntryTimeout
Definition: config.h:306
char FontFix[MAXFONTNAME]
Definition: config.h:337
int TimeSource
Definition: config.h:288
int UseDolbyDigital
Definition: config.h:326
int PauseOnMarkJump
Definition: config.h:354
int ColorKey1
Definition: config.h:322
int ShowRemainingTime
Definition: config.h:351
int CurrentDolby
Definition: config.h:368
cString InitialChannel
Definition: config.h:374
int DefaultSortModeRec
Definition: config.h:319
char SVDRPHostName[HOST_NAME_MAX]
Definition: config.h:303
int RcRepeatDelta
Definition: config.h:308
int InstantRecordTime
Definition: config.h:276
int NumberKeysForChars
Definition: config.h:321
int SkipEdited
Definition: config.h:355
int PauseLifetime
Definition: config.h:312
int InitialVolume
Definition: config.h:369
static int FromString(const char *s)
Definition: sources.c:68
static cString ToString(int Code)
Definition: sources.c:55
Definition: tools.h:178
static cString sprintf(const char *fmt,...) __attribute__((format(printf
Definition: tools.c:1149
int Size(void) const
Definition: tools.h:764
#define ChkDoublePlausibility(Variable, Default)
Definition: config.c:24
cNestedItemList Commands
Definition: config.c:275
cSetup Setup
Definition: config.c:372
cSVDRPhosts SVDRPhosts
Definition: config.c:280
cNestedItemList Folders
Definition: config.c:274
cNestedItemList RecordingCommands
Definition: config.c:276
#define MaxSkinName
Definition: config.h:67
#define STANDARD_DVB
Definition: config.h:77
#define MAXLIFETIME
Definition: config.h:48
uint32_t in_addr_t
Definition: config.h:81
#define TIMERMACRO_EPISODE
Definition: config.h:52
#define DEFINSTRECTIME
Definition: config.h:49
#define MaxThemeName
Definition: config.h:68
#define TIMERMACRO_TITLE
Definition: config.h:51
#define MAXVOLUME
Definition: device.h:32
const char * DefaultFontOsd
Definition: font.c:24
const char * DefaultFontSml
Definition: font.c:25
const char * DefaultFontFix
Definition: font.c:26
#define MAXFONTNAME
Definition: font.h:17
const cStringList * I18nLanguages(void)
Returns the list of available languages.
Definition: i18n.c:248
int I18nLanguageIndex(const char *Code)
Returns the index of the language with the given three letter language Code.
Definition: i18n.c:275
void I18nSetLocale(const char *Locale)
Sets the current locale to Locale.
Definition: i18n.c:216
const char * I18nLanguageCode(int Language)
Returns the three letter language code of the given Language (which is an index as returned by I18nCu...
Definition: i18n.c:270
#define MAXVIDEOFILESIZEDEFAULT
Definition: recording.h:451
@ rsmTime
Definition: recording.h:550
@ rsdAscending
Definition: recording.h:549
Definition: runvdr.c:107
char * Utf8Strn0Cpy(char *Dest, const char *Src, int n)
Copies at most n character bytes from Src to Dest, making sure that the resulting copy ends with a co...
Definition: tools.c:899
bool isempty(const char *s)
Definition: tools.c:349
char * strreplace(char *s, char c1, char c2)
Definition: tools.c:139
cString dtoa(double d, const char *Format)
Converts the given double value to a string, making sure it uses a '.
Definition: tools.c:432
const char * GetHostName(void)
Gets the host name of this machine.
Definition: tools.c:1363
char * compactspace(char *s)
Definition: tools.c:231
double atod(const char *s)
Converts the given string, which is a floating point number using a '.
Definition: tools.c:411
char * stripspace(char *s)
Definition: tools.c:219
char * strn0cpy(char *dest, const char *src, size_t n)
Definition: tools.c:131
#define LOG_ERROR_STR(s)
Definition: tools.h:40
#define MALLOC(type, size)
Definition: tools.h:47
char * skipspace(const char *s)
Definition: tools.h:241
#define esyslog(a...)
Definition: tools.h:35
#define isyslog(a...)
Definition: tools.h:36