1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00
vdr/config.h

381 lines
11 KiB
C
Raw Normal View History

2000-02-19 13:36:48 +01:00
/*
* config.h: Configuration file handling
*
2000-04-24 09:46:05 +02:00
* See the main source file 'vdr.c' for copyright information and
2000-02-19 13:36:48 +01:00
* how to reach the author.
*
2021-05-21 15:09:34 +02:00
* $Id: config.h 5.4 2021/05/21 15:09:34 kls Exp $
2000-02-19 13:36:48 +01:00
*/
#ifndef __CONFIG_H
#define __CONFIG_H
2002-02-02 17:20:54 +01:00
#include <arpa/inet.h>
2000-02-19 13:36:48 +01:00
#include <stdio.h>
#include <stdlib.h>
2000-02-19 13:36:48 +01:00
#include <string.h>
#include <time.h>
2000-12-28 12:57:16 +01:00
#include <unistd.h>
#include "i18n.h"
#include "font.h"
2000-02-19 13:36:48 +01:00
#include "tools.h"
// VDR's own version number:
2021-05-21 15:09:34 +02:00
#define VDRVERSION "2.5.4"
#define VDRVERSNUM 20504 // Version * 10000 + Major * 100 + Minor
2000-07-29 18:19:49 +02:00
// The plugin API's version number:
2021-05-21 15:09:34 +02:00
#define APIVERSION "2.5.4"
#define APIVERSNUM 20504 // Version * 10000 + Major * 100 + Minor
// When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to
// VDR header files since the last APIVERSION. This allows compiled
// plugins to work with newer versions of the core VDR as long as no
// VDR header files have changed.
#define MAXPRIORITY 99
#define MINPRIORITY (-MAXPRIORITY)
#define LIVEPRIORITY 0 // priority used when selecting a device for live viewing
#define TRANSFERPRIORITY (LIVEPRIORITY - 1) // priority used for actual local Transfer Mode
#define IDLEPRIORITY (MINPRIORITY - 1) // priority of an idle device
#define MAXLIFETIME 99
#define DEFINSTRECTIME 180 // default instant recording time (minutes)
#define TIMERMACRO_TITLE "TITLE"
#define TIMERMACRO_EPISODE "EPISODE"
2020-12-26 15:49:01 +01:00
#define TIMERMACRO_BEFORE "{<}"
#define TIMERMACRO_MATCH "{=}"
#define TIMERMACRO_AFTER "{>}"
#define TIMERPATTERN_AVOID "@"
#define TIMERPATTERN_BEGIN "^"
#define TIMERPATTERN_END "$"
#define MINOSDWIDTH 480
#define MAXOSDWIDTH 1920
#define MINOSDHEIGHT 324
2009-05-09 10:28:15 +02:00
#define MAXOSDHEIGHT 1200
2013-02-08 09:24:55 +01:00
#define MaxFileName NAME_MAX // obsolete - use NAME_MAX directly instead!
2004-05-16 10:35:36 +02:00
#define MaxSkinName 16
#define MaxThemeName 16
2002-02-03 15:55:04 +01:00
// Basically VDR works according to the DVB standard, but there are countries/providers
// that use other standards, which in some details deviate from the DVB standard.
// This makes it necessary to handle things differently in some areas, depending on
// which standard is actually used. The following macros are used to distinguish
// these cases (make sure to adjust cMenuSetupDVB::standardComplianceTexts accordingly
// when adding a new standard):
#define STANDARD_DVB 0
#define STANDARD_ANSISCTE 1
#define STANDARD_NORDIG 2
typedef uint32_t in_addr_t; //XXX from /usr/include/netinet/in.h (apparently this is not defined on systems with glibc < 2.2)
2002-02-02 17:20:54 +01:00
class cSVDRPhost : public cListObject {
private:
struct in_addr addr;
in_addr_t mask;
public:
cSVDRPhost(void);
bool Parse(const char *s);
bool IsLocalhost(void);
2002-02-02 17:20:54 +01:00
bool Accepts(in_addr_t Address);
};
2011-12-04 12:45:26 +01:00
class cSatCableNumbers {
private:
int size;
int *array;
public:
cSatCableNumbers(int Size, const char *s = NULL);
~cSatCableNumbers();
int Size(void) const { return size; }
int *Array(void) { return array; }
bool FromString(const char *s);
cString ToString(void);
int FirstDeviceIndex(int DeviceIndex) const;
///< Returns the first device index (starting at 0) that uses the same
///< sat cable number as the device with the given DeviceIndex.
///< If the given device does not use the same sat cable as any other device,
///< or if the resulting value would be the same as DeviceIndex,
///< or if DeviceIndex is out of range, -1 is returned.
};
2000-02-19 13:36:48 +01:00
template<class T> class cConfig : public cList<T> {
private:
char *fileName;
2002-09-29 13:40:45 +02:00
bool allowComments;
2000-02-19 13:36:48 +01:00
void Clear(void)
{
free(fileName);
fileName = NULL;
2000-02-19 13:36:48 +01:00
cList<T>::Clear();
}
public:
cConfig(const char *NeedsLocking = NULL): cList<T>(NeedsLocking) { fileName = NULL; }
virtual ~cConfig() { free(fileName); }
2002-05-09 16:26:56 +02:00
const char *FileName(void) { return fileName; }
bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false)
2000-02-19 13:36:48 +01:00
{
cConfig<T>::Clear();
2002-09-29 13:40:45 +02:00
if (FileName) {
free(fileName);
fileName = strdup(FileName);
allowComments = AllowComments;
}
bool result = !MustExist;
2002-09-29 13:40:45 +02:00
if (fileName && access(fileName, F_OK) == 0) {
isyslog("loading %s", fileName);
2000-12-28 12:57:16 +01:00
FILE *f = fopen(fileName, "r");
if (f) {
char *s;
2000-12-28 12:57:16 +01:00
int line = 0;
cReadLine ReadLine;
2000-12-28 12:57:16 +01:00
result = true;
while ((s = ReadLine.Read(f)) != NULL) {
2000-12-28 12:57:16 +01:00
line++;
2002-09-29 13:40:45 +02:00
if (allowComments) {
char *p = strchr(s, '#');
if (p)
*p = 0;
}
stripspace(s);
if (!isempty(s)) {
T *l = new T;
if (l->Parse(s))
this->Add(l);
else {
esyslog("ERROR: error in %s, line %d", fileName, line);
delete l;
result = false;
}
2000-12-28 12:57:16 +01:00
}
2000-02-19 13:36:48 +01:00
}
2000-12-28 12:57:16 +01:00
fclose(f);
}
else {
2000-12-28 12:57:16 +01:00
LOG_ERROR_STR(fileName);
result = false;
}
2000-02-19 13:36:48 +01:00
}
if (!result)
fprintf(stderr, "vdr: error while reading '%s'\n", fileName);
2000-02-19 13:36:48 +01:00
return result;
}
bool Save(void) const
2000-02-19 13:36:48 +01:00
{
bool result = true;
2004-05-22 11:29:52 +02:00
T *l = (T *)this->First();
cSafeFile f(fileName);
if (f.Open()) {
2000-02-19 13:36:48 +01:00
while (l) {
if (!l->Save(f)) {
result = false;
break;
}
l = (T *)l->Next();
}
if (!f.Close())
result = false;
2000-02-19 13:36:48 +01:00
}
else
2000-02-19 13:36:48 +01:00
result = false;
return result;
}
};
class cNestedItem : public cListObject {
private:
char *text;
cList<cNestedItem> *subItems;
public:
cNestedItem(const char *Text, bool WithSubItems = false);
virtual ~cNestedItem();
virtual int Compare(const cListObject &ListObject) const;
const char *Text(void) const { return text; }
cList<cNestedItem> *SubItems(void) { return subItems; }
void AddSubItem(cNestedItem *Item);
void SetText(const char *Text);
void SetSubItems(bool On);
};
class cNestedItemList : public cList<cNestedItem> {
private:
char *fileName;
bool Parse(FILE *f, cList<cNestedItem> *List, int &Line);
bool Write(FILE *f, cList<cNestedItem> *List, int Indent = 0);
public:
cNestedItemList(void);
virtual ~cNestedItemList();
void Clear(void);
bool Load(const char *FileName);
bool Save(void);
};
2002-02-02 17:20:54 +01:00
class cSVDRPhosts : public cConfig<cSVDRPhost> {
public:
bool LocalhostOnly(void);
2002-02-02 17:20:54 +01:00
bool Acceptable(in_addr_t Address);
};
extern cNestedItemList Folders;
extern cNestedItemList Commands;
extern cNestedItemList RecordingCommands;
2002-02-02 17:20:54 +01:00
extern cSVDRPhosts SVDRPhosts;
2000-02-19 13:36:48 +01:00
2002-05-09 16:26:56 +02:00
class cSetupLine : public cListObject {
2000-09-10 10:51:58 +02:00
private:
2002-05-09 16:26:56 +02:00
char *plugin;
char *name;
char *value;
public:
cSetupLine(void);
cSetupLine(const char *Name, const char *Value, const char *Plugin = NULL);
virtual ~cSetupLine();
virtual int Compare(const cListObject &ListObject) const;
2002-05-09 16:26:56 +02:00
const char *Plugin(void) { return plugin; }
const char *Name(void) { return name; }
const char *Value(void) { return value; }
2000-09-10 10:51:58 +02:00
bool Parse(char *s);
2002-05-09 16:26:56 +02:00
bool Save(FILE *f);
};
class cSetup : public cConfig<cSetupLine> {
friend class cPlugin; // needs to be able to call Store()
private:
void StoreLanguages(const char *Name, int *Values);
bool ParseLanguages(const char *Value, int *Values);
2002-05-09 16:26:56 +02:00
bool Parse(const char *Name, const char *Value);
cSetupLine *Get(const char *Name, const char *Plugin = NULL);
void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false);
2002-05-09 16:26:56 +02:00
void Store(const char *Name, int Value, const char *Plugin = NULL);
void Store(const char *Name, double &Value, const char *Plugin = NULL);
2000-09-10 10:51:58 +02:00
public:
// Also adjust cMenuSetup (menu.c) when adding parameters here!
2002-05-09 16:26:56 +02:00
int __BeginData__;
2007-08-11 12:39:06 +02:00
char OSDLanguage[I18N_MAX_LOCALE_LEN];
2004-05-16 10:35:36 +02:00
char OSDSkin[MaxSkinName];
char OSDTheme[MaxThemeName];
2000-09-10 10:51:58 +02:00
int PrimaryDVB;
int ShowInfoOnChSwitch;
int TimeoutRequChInfo;
2000-09-10 10:51:58 +02:00
int MenuScrollPage;
int MenuScrollWrap;
int MenuKeyCloses;
int MarkInstantRecord;
char NameInstantRecord[NAME_MAX + 1];
int InstantRecordTime;
int LnbSLOF;
2000-10-08 16:18:23 +02:00
int LnbFrequLo;
int LnbFrequHi;
int DiSEqC;
int UsePositioner;
int SiteLat;
int SiteLon;
int PositionerSpeed;
int PositionerSwing;
int PositionerLastLon;
2000-10-29 13:17:22 +01:00
int SetSystemTime;
int TimeSource;
int TimeTransponder;
int StandardCompliance;
2000-10-29 13:17:22 +01:00
int MarginStart, MarginStop;
2007-08-11 12:39:06 +02:00
int AudioLanguages[I18N_MAX_LANGUAGES + 1];
2007-10-12 14:52:30 +02:00
int DisplaySubtitles;
int SubtitleLanguages[I18N_MAX_LANGUAGES + 1];
int SubtitleOffset;
int SubtitleFgTransparency, SubtitleBgTransparency;
2007-08-11 12:39:06 +02:00
int EPGLanguages[I18N_MAX_LANGUAGES + 1];
int EPGScanTimeout;
2001-08-17 13:19:10 +02:00
int EPGBugfixLevel;
2004-02-21 15:30:35 +01:00
int EPGLinger;
int SVDRPTimeout;
int SVDRPPeering;
char SVDRPHostName[HOST_NAME_MAX];
char SVDRPDefaultHost[HOST_NAME_MAX];
int ZapTimeout;
int ChannelEntryTimeout;
int RcRepeatDelay;
int RcRepeatDelta;
int DefaultPriority, DefaultLifetime;
int RecordKeyHandling;
int PauseKeyHandling;
int PausePriority, PauseLifetime;
int UseSubtitle;
2004-02-29 14:21:22 +01:00
int UseVps;
int VpsMargin;
int RecordingDirs;
int FoldersInTimerMenu;
int AlwaysSortFoldersFirst;
int DefaultSortModeRec;
int RecSortingDirection;
int NumberKeysForChars;
int ColorKey0, ColorKey1, ColorKey2, ColorKey3;
int VideoDisplayFormat;
2001-06-16 14:31:14 +02:00
int VideoFormat;
int UpdateChannels;
int UseDolbyDigital;
int ChannelInfoPos;
int ChannelInfoTime;
double OSDLeftP, OSDTopP, OSDWidthP, OSDHeightP;
2004-05-16 10:35:36 +02:00
int OSDLeft, OSDTop, OSDWidth, OSDHeight;
2009-05-09 10:42:35 +02:00
double OSDAspect;
2001-09-01 15:23:27 +02:00
int OSDMessageTime;
2004-05-16 10:35:36 +02:00
int UseSmallFont;
int AntiAlias;
char FontOsd[MAXFONTNAME];
char FontSml[MAXFONTNAME];
char FontFix[MAXFONTNAME];
double FontOsdSizeP;
double FontSmlSizeP;
double FontFixSizeP;
int FontOsdSize;
int FontSmlSize;
int FontFixSize;
2001-08-25 13:52:38 +02:00
int MaxVideoFileSize;
2001-09-30 11:31:43 +02:00
int SplitEditedFiles;
int DelTimeshiftRec;
2001-09-01 09:04:37 +02:00
int MinEventTimeout, MinUserInactivity;
time_t NextWakeupTime;
2001-09-09 12:52:41 +02:00
int MultiSpeedMode;
2001-09-14 14:06:43 +02:00
int ShowReplayMode;
int ShowRemainingTime;
int ProgressDisplayTime;
int PauseOnMarkSet;
int PauseOnMarkJump;
int SkipEdited;
int PauseAtLastMark;
int AdaptiveSkipInitial;
int AdaptiveSkipTimeout;
int AdaptiveSkipAlternate;
int AdaptiveSkipPrevNext;
int SkipSeconds;
int SkipSecondsRepeat;
int ResumeID;
int CurrentChannel;
2001-09-22 13:41:49 +02:00
int CurrentVolume;
int VolumeSteps;
int VolumeLinearize;
2005-01-08 13:53:30 +01:00
int CurrentDolby;
int InitialVolume;
int ChannelsWrap;
int ShowChannelNamesWithSource;
int EmergencyExit;
2002-05-09 16:26:56 +02:00
int __EndData__;
cString InitialChannel;
2011-12-04 12:45:26 +01:00
cString DeviceBondings;
2000-09-10 10:51:58 +02:00
cSetup(void);
2002-05-09 16:26:56 +02:00
cSetup& operator= (const cSetup &s);
2000-09-10 10:51:58 +02:00
bool Load(const char *FileName);
2002-05-09 16:26:56 +02:00
bool Save(void);
2000-09-10 10:51:58 +02:00
};
extern cSetup Setup;
2000-02-19 13:36:48 +01:00
#endif //__CONFIG_H