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.
|
|
|
|
*
|
2012-12-05 11:49:33 +01:00
|
|
|
* $Id: config.h 2.57 2012/12/05 11:33:20 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>
|
2002-08-11 13:32:23 +02:00
|
|
|
#include <stdlib.h>
|
2000-02-19 13:36:48 +01:00
|
|
|
#include <string.h>
|
2000-03-11 11:22:37 +01:00
|
|
|
#include <time.h>
|
2000-12-28 12:57:16 +01:00
|
|
|
#include <unistd.h>
|
2004-01-09 15:53:59 +01:00
|
|
|
#include "i18n.h"
|
2007-06-10 13:02:43 +02:00
|
|
|
#include "font.h"
|
2000-02-19 13:36:48 +01:00
|
|
|
#include "tools.h"
|
|
|
|
|
2006-04-16 09:36:10 +02:00
|
|
|
// VDR's own version number:
|
|
|
|
|
2012-11-19 10:32:31 +01:00
|
|
|
#define VDRVERSION "1.7.33"
|
|
|
|
#define VDRVERSNUM 10733 // Version * 10000 + Major * 100 + Minor
|
2000-07-29 18:19:49 +02:00
|
|
|
|
2006-04-16 09:36:10 +02:00
|
|
|
// The plugin API's version number:
|
|
|
|
|
2012-11-19 10:32:31 +01:00
|
|
|
#define APIVERSION "1.7.33"
|
|
|
|
#define APIVERSNUM 10733 // Version * 10000 + Major * 100 + Minor
|
2006-04-16 09:36:10 +02:00
|
|
|
|
|
|
|
// 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.
|
|
|
|
|
2012-03-02 10:19:00 +01:00
|
|
|
#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
|
2012-09-15 13:57:39 +02:00
|
|
|
#define DEFINSTRECTIME 180 // default instant recording time (minutes)
|
2001-06-02 10:47:40 +02:00
|
|
|
|
2009-05-03 14:15:21 +02:00
|
|
|
#define MINOSDWIDTH 480
|
|
|
|
#define MAXOSDWIDTH 1920
|
|
|
|
#define MINOSDHEIGHT 324
|
2009-05-09 10:28:15 +02:00
|
|
|
#define MAXOSDHEIGHT 1200
|
2001-07-27 11:51:42 +02:00
|
|
|
|
2002-02-03 15:55:04 +01:00
|
|
|
#define MaxFileName 256
|
2004-05-16 10:35:36 +02:00
|
|
|
#define MaxSkinName 16
|
|
|
|
#define MaxThemeName 16
|
2002-02-03 15:55:04 +01:00
|
|
|
|
2012-04-15 10:52:34 +02: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
|
|
|
|
|
2002-02-09 16:03:22 +01:00
|
|
|
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);
|
2010-01-17 12:27:01 +01:00
|
|
|
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)
|
|
|
|
{
|
2002-08-11 13:32:23 +02:00
|
|
|
free(fileName);
|
|
|
|
fileName = NULL;
|
2000-02-19 13:36:48 +01:00
|
|
|
cList<T>::Clear();
|
|
|
|
}
|
|
|
|
public:
|
2000-12-28 12:57:16 +01:00
|
|
|
cConfig(void) { fileName = NULL; }
|
2002-08-11 13:32:23 +02:00
|
|
|
virtual ~cConfig() { free(fileName); }
|
2002-05-09 16:26:56 +02:00
|
|
|
const char *FileName(void) { return fileName; }
|
2004-01-05 10:15:19 +01:00
|
|
|
bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false)
|
2000-02-19 13:36:48 +01:00
|
|
|
{
|
2005-10-01 10:43:01 +02:00
|
|
|
cConfig<T>::Clear();
|
2002-09-29 13:40:45 +02:00
|
|
|
if (FileName) {
|
|
|
|
free(fileName);
|
|
|
|
fileName = strdup(FileName);
|
|
|
|
allowComments = AllowComments;
|
|
|
|
}
|
2003-08-16 09:18:52 +02:00
|
|
|
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) {
|
2005-11-04 17:18:33 +01:00
|
|
|
char *s;
|
2000-12-28 12:57:16 +01:00
|
|
|
int line = 0;
|
2005-11-04 17:18:33 +01:00
|
|
|
cReadLine ReadLine;
|
2000-12-28 12:57:16 +01:00
|
|
|
result = true;
|
2005-11-04 17:18:33 +01:00
|
|
|
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) {
|
2005-11-04 17:18:33 +01:00
|
|
|
char *p = strchr(s, '#');
|
2002-02-02 15:57:48 +01:00
|
|
|
if (p)
|
|
|
|
*p = 0;
|
|
|
|
}
|
2005-11-04 17:18:33 +01:00
|
|
|
stripspace(s);
|
|
|
|
if (!isempty(s)) {
|
2001-04-01 14:44:40 +02:00
|
|
|
T *l = new T;
|
2005-11-04 17:18:33 +01:00
|
|
|
if (l->Parse(s))
|
2012-01-11 15:41:55 +01:00
|
|
|
this->Add(l);
|
2001-04-01 14:44:40 +02:00
|
|
|
else {
|
2005-11-04 14:22:04 +01:00
|
|
|
esyslog("ERROR: error in %s, line %d", fileName, line);
|
2001-04-01 14:44:40 +02:00
|
|
|
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);
|
|
|
|
}
|
2003-08-16 09:18:52 +02:00
|
|
|
else {
|
2000-12-28 12:57:16 +01:00
|
|
|
LOG_ERROR_STR(fileName);
|
2003-08-16 09:18:52 +02:00
|
|
|
result = false;
|
|
|
|
}
|
2000-02-19 13:36:48 +01:00
|
|
|
}
|
2003-08-16 09:18:52 +02: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)
|
|
|
|
{
|
|
|
|
bool result = true;
|
2004-05-22 11:29:52 +02:00
|
|
|
T *l = (T *)this->First();
|
2001-01-13 15:36:31 +01:00
|
|
|
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();
|
|
|
|
}
|
2001-09-16 08:57:58 +02:00
|
|
|
if (!f.Close())
|
|
|
|
result = false;
|
2000-02-19 13:36:48 +01:00
|
|
|
}
|
2001-01-13 15:36:31 +01:00
|
|
|
else
|
2000-02-19 13:36:48 +01:00
|
|
|
result = false;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-01-17 12:08:03 +01:00
|
|
|
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:
|
2010-01-17 12:27:01 +01:00
|
|
|
bool LocalhostOnly(void);
|
2002-02-02 17:20:54 +01:00
|
|
|
bool Acceptable(in_addr_t Address);
|
|
|
|
};
|
|
|
|
|
2010-01-17 12:08:03 +01:00
|
|
|
extern cNestedItemList Folders;
|
2010-01-31 12:59:50 +01:00
|
|
|
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();
|
2004-11-01 10:40:38 +01:00
|
|
|
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:
|
2004-01-09 15:53:59 +01:00
|
|
|
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);
|
2002-10-19 11:34:48 +02:00
|
|
|
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);
|
2009-05-03 14:15:21 +02:00
|
|
|
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;
|
2006-01-04 14:45:23 +01:00
|
|
|
int TimeoutRequChInfo;
|
2000-09-10 10:51:58 +02:00
|
|
|
int MenuScrollPage;
|
2005-06-18 10:44:30 +02:00
|
|
|
int MenuScrollWrap;
|
2007-02-25 11:39:40 +01:00
|
|
|
int MenuKeyCloses;
|
2000-10-08 13:08:13 +02:00
|
|
|
int MarkInstantRecord;
|
2002-02-03 15:55:04 +01:00
|
|
|
char NameInstantRecord[MaxFileName];
|
2002-04-26 13:43:46 +02:00
|
|
|
int InstantRecordTime;
|
2001-06-02 10:47:40 +02:00
|
|
|
int LnbSLOF;
|
2000-10-08 16:18:23 +02:00
|
|
|
int LnbFrequLo;
|
|
|
|
int LnbFrequHi;
|
2001-07-27 13:45:55 +02:00
|
|
|
int DiSEqC;
|
2000-10-29 13:17:22 +01:00
|
|
|
int SetSystemTime;
|
2004-05-16 12:58:04 +02:00
|
|
|
int TimeSource;
|
2002-03-17 14:24:11 +01:00
|
|
|
int TimeTransponder;
|
2012-04-15 10:52:34 +02:00
|
|
|
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];
|
2000-11-18 13:57:32 +01:00
|
|
|
int EPGScanTimeout;
|
2001-08-17 13:19:10 +02:00
|
|
|
int EPGBugfixLevel;
|
2004-02-21 15:30:35 +01:00
|
|
|
int EPGLinger;
|
2001-02-18 14:18:13 +01:00
|
|
|
int SVDRPTimeout;
|
2003-08-17 08:58:02 +02:00
|
|
|
int ZapTimeout;
|
2007-02-25 14:14:06 +01:00
|
|
|
int ChannelEntryTimeout;
|
2001-06-02 10:47:40 +02:00
|
|
|
int DefaultPriority, DefaultLifetime;
|
2003-05-11 14:10:00 +02:00
|
|
|
int PausePriority, PauseLifetime;
|
2009-05-21 11:35:37 +02:00
|
|
|
int PauseKeyHandling;
|
2001-09-02 15:21:54 +02:00
|
|
|
int UseSubtitle;
|
2004-02-29 14:21:22 +01:00
|
|
|
int UseVps;
|
|
|
|
int VpsMargin;
|
2002-01-20 14:05:28 +01:00
|
|
|
int RecordingDirs;
|
2010-03-12 16:46:45 +01:00
|
|
|
int FoldersInTimerMenu;
|
2010-06-06 10:56:11 +02:00
|
|
|
int NumberKeysForChars;
|
2012-09-09 14:37:15 +02:00
|
|
|
int ColorKey0, ColorKey1, ColorKey2, ColorKey3;
|
2005-02-20 13:39:49 +01:00
|
|
|
int VideoDisplayFormat;
|
2001-06-16 14:31:14 +02:00
|
|
|
int VideoFormat;
|
2004-01-05 12:08:09 +01:00
|
|
|
int UpdateChannels;
|
2005-01-09 12:36:48 +01:00
|
|
|
int UseDolbyDigital;
|
2001-07-27 10:59:50 +02:00
|
|
|
int ChannelInfoPos;
|
2005-02-05 11:40:04 +01:00
|
|
|
int ChannelInfoTime;
|
2009-05-03 14:15:21 +02:00
|
|
|
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;
|
2007-06-10 13:02:43 +02:00
|
|
|
int AntiAlias;
|
|
|
|
char FontOsd[MAXFONTNAME];
|
|
|
|
char FontSml[MAXFONTNAME];
|
|
|
|
char FontFix[MAXFONTNAME];
|
2009-05-03 14:15:21 +02:00
|
|
|
double FontOsdSizeP;
|
|
|
|
double FontSmlSizeP;
|
|
|
|
double FontFixSizeP;
|
2007-06-10 13:02:43 +02:00
|
|
|
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;
|
2010-03-07 12:43:30 +01:00
|
|
|
int DelTimeshiftRec;
|
2001-09-01 09:04:37 +02:00
|
|
|
int MinEventTimeout, MinUserInactivity;
|
2007-02-25 10:56:29 +01:00
|
|
|
time_t NextWakeupTime;
|
2001-09-09 12:52:41 +02:00
|
|
|
int MultiSpeedMode;
|
2001-09-14 14:06:43 +02:00
|
|
|
int ShowReplayMode;
|
2012-01-14 13:20:16 +01:00
|
|
|
int ShowRemainingTime;
|
2012-12-05 11:49:33 +01:00
|
|
|
int ProgressDisplayTime;
|
2012-12-05 10:07:12 +01:00
|
|
|
int PauseOnMarkSet;
|
2003-04-12 10:06:21 +02:00
|
|
|
int ResumeID;
|
2001-01-14 15:29:51 +01:00
|
|
|
int CurrentChannel;
|
2001-09-22 13:41:49 +02:00
|
|
|
int CurrentVolume;
|
2005-01-08 13:53:30 +01:00
|
|
|
int CurrentDolby;
|
2006-04-09 13:26:56 +02:00
|
|
|
int InitialVolume;
|
2010-01-17 15:21:28 +01:00
|
|
|
int ChannelsWrap;
|
2012-06-17 12:27:07 +02:00
|
|
|
int ShowChannelNamesWithSource;
|
2007-11-25 14:20:03 +01:00
|
|
|
int EmergencyExit;
|
2002-05-09 16:26:56 +02:00
|
|
|
int __EndData__;
|
2011-06-13 14:48:41 +02:00
|
|
|
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
|