mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Changed the EVCONTENTMASK_* macros to enums and changed "mask" to "group". - Updated the Estonian OSD texts (thanks to Arthur Konovalov). - The "Edit timer" menu can now set the folder for the recording from a list of folders stored in "folders.conf". - Updated the Italian OSD texts (thanks to Diego Pierotto). - If svdrphosts.conf contains only the address of the local host, the SVDRP port is opened only for the local host (thanks to Manuel Reimer). - Renamed 'runvdr' to 'runvdr.template' and no longer copying it to the BINDIR in 'make install' (thanks to Martin Dauskardt). - Added plain text error messages to log entries from cOsd::SetAreas() (suggested by Rolf Ahrenberg). - cPalette::ClosestColor() now treats fully transparent colors as "equal"; improved cDvbSpuBitmap::getMinBpp() (thanks to Matthieu Castet and Johann Friedrichs). - The new setup option "Miscellaneous/Channels wrap" controls whether the current channel wraps around the beginning or end of the channel list when zapping (thanks to Matti Lehtimäki). - Fixed determining the frame duration on channels where the PTS deltas jitter by +/-1 around 1800. - The PCR pid in generated PMTs is now set to the channel's PCR pid again. - Fixed determining the frame duration on channels where the PTS deltas jitter by +/-1 around 3600. - The PCR pid is now recorded for channels where this is different from the video PID. To facilitate this, the interfaces of cTransfer, cTransferControl, cRecorder and cReceiver have been modified, so that the PIDs are no longer given in separate parameters, but rather the whole channel is handed down for processing. The old constructor of cReceiver is still available, but it is recommended to plugin authors that they switch to the new interface as soon as possible. When replaying such a recording, the PCR packets are sent to PlayTsVideo() - The files "commands.conf" and "reccmd.conf" can now contain nested lists of commands. See vdr.5 for information about the new file format.
301 lines
7.8 KiB
C++
301 lines
7.8 KiB
C++
/*
|
|
* config.h: Configuration file handling
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: config.h 2.21 2010/01/31 11:14:02 kls Exp $
|
|
*/
|
|
|
|
#ifndef __CONFIG_H
|
|
#define __CONFIG_H
|
|
|
|
#include <arpa/inet.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#include "i18n.h"
|
|
#include "font.h"
|
|
#include "tools.h"
|
|
|
|
// VDR's own version number:
|
|
|
|
#define VDRVERSION "1.7.12"
|
|
#define VDRVERSNUM 10712 // Version * 10000 + Major * 100 + Minor
|
|
|
|
// The plugin API's version number:
|
|
|
|
#define APIVERSION "1.7.12"
|
|
#define APIVERSNUM 10712 // 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 MAXLIFETIME 99
|
|
|
|
#define MINOSDWIDTH 480
|
|
#define MAXOSDWIDTH 1920
|
|
#define MINOSDHEIGHT 324
|
|
#define MAXOSDHEIGHT 1200
|
|
|
|
#define MaxFileName 256
|
|
#define MaxSkinName 16
|
|
#define MaxThemeName 16
|
|
|
|
typedef uint32_t in_addr_t; //XXX from /usr/include/netinet/in.h (apparently this is not defined on systems with glibc < 2.2)
|
|
|
|
class cSVDRPhost : public cListObject {
|
|
private:
|
|
struct in_addr addr;
|
|
in_addr_t mask;
|
|
public:
|
|
cSVDRPhost(void);
|
|
bool Parse(const char *s);
|
|
bool IsLocalhost(void);
|
|
bool Accepts(in_addr_t Address);
|
|
};
|
|
|
|
template<class T> class cConfig : public cList<T> {
|
|
private:
|
|
char *fileName;
|
|
bool allowComments;
|
|
void Clear(void)
|
|
{
|
|
free(fileName);
|
|
fileName = NULL;
|
|
cList<T>::Clear();
|
|
}
|
|
public:
|
|
cConfig(void) { fileName = NULL; }
|
|
virtual ~cConfig() { free(fileName); }
|
|
const char *FileName(void) { return fileName; }
|
|
bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false)
|
|
{
|
|
cConfig<T>::Clear();
|
|
if (FileName) {
|
|
free(fileName);
|
|
fileName = strdup(FileName);
|
|
allowComments = AllowComments;
|
|
}
|
|
bool result = !MustExist;
|
|
if (fileName && access(fileName, F_OK) == 0) {
|
|
isyslog("loading %s", fileName);
|
|
FILE *f = fopen(fileName, "r");
|
|
if (f) {
|
|
char *s;
|
|
int line = 0;
|
|
cReadLine ReadLine;
|
|
result = true;
|
|
while ((s = ReadLine.Read(f)) != NULL) {
|
|
line++;
|
|
if (allowComments) {
|
|
char *p = strchr(s, '#');
|
|
if (p)
|
|
*p = 0;
|
|
}
|
|
stripspace(s);
|
|
if (!isempty(s)) {
|
|
T *l = new T;
|
|
if (l->Parse(s))
|
|
Add(l);
|
|
else {
|
|
esyslog("ERROR: error in %s, line %d", fileName, line);
|
|
delete l;
|
|
result = false;
|
|
}
|
|
}
|
|
}
|
|
fclose(f);
|
|
}
|
|
else {
|
|
LOG_ERROR_STR(fileName);
|
|
result = false;
|
|
}
|
|
}
|
|
if (!result)
|
|
fprintf(stderr, "vdr: error while reading '%s'\n", fileName);
|
|
return result;
|
|
}
|
|
bool Save(void)
|
|
{
|
|
bool result = true;
|
|
T *l = (T *)this->First();
|
|
cSafeFile f(fileName);
|
|
if (f.Open()) {
|
|
while (l) {
|
|
if (!l->Save(f)) {
|
|
result = false;
|
|
break;
|
|
}
|
|
l = (T *)l->Next();
|
|
}
|
|
if (!f.Close())
|
|
result = false;
|
|
}
|
|
else
|
|
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);
|
|
};
|
|
|
|
class cSVDRPhosts : public cConfig<cSVDRPhost> {
|
|
public:
|
|
bool LocalhostOnly(void);
|
|
bool Acceptable(in_addr_t Address);
|
|
};
|
|
|
|
extern cNestedItemList Folders;
|
|
extern cNestedItemList Commands;
|
|
extern cNestedItemList RecordingCommands;
|
|
extern cSVDRPhosts SVDRPhosts;
|
|
|
|
class cSetupLine : public cListObject {
|
|
private:
|
|
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;
|
|
const char *Plugin(void) { return plugin; }
|
|
const char *Name(void) { return name; }
|
|
const char *Value(void) { return value; }
|
|
bool Parse(char *s);
|
|
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);
|
|
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);
|
|
void Store(const char *Name, int Value, const char *Plugin = NULL);
|
|
void Store(const char *Name, double &Value, const char *Plugin = NULL);
|
|
public:
|
|
// Also adjust cMenuSetup (menu.c) when adding parameters here!
|
|
int __BeginData__;
|
|
char OSDLanguage[I18N_MAX_LOCALE_LEN];
|
|
char OSDSkin[MaxSkinName];
|
|
char OSDTheme[MaxThemeName];
|
|
int PrimaryDVB;
|
|
int ShowInfoOnChSwitch;
|
|
int TimeoutRequChInfo;
|
|
int MenuScrollPage;
|
|
int MenuScrollWrap;
|
|
int MenuKeyCloses;
|
|
int MarkInstantRecord;
|
|
char NameInstantRecord[MaxFileName];
|
|
int InstantRecordTime;
|
|
int LnbSLOF;
|
|
int LnbFrequLo;
|
|
int LnbFrequHi;
|
|
int DiSEqC;
|
|
int SetSystemTime;
|
|
int TimeSource;
|
|
int TimeTransponder;
|
|
int MarginStart, MarginStop;
|
|
int AudioLanguages[I18N_MAX_LANGUAGES + 1];
|
|
int DisplaySubtitles;
|
|
int SubtitleLanguages[I18N_MAX_LANGUAGES + 1];
|
|
int SubtitleOffset;
|
|
int SubtitleFgTransparency, SubtitleBgTransparency;
|
|
int EPGLanguages[I18N_MAX_LANGUAGES + 1];
|
|
int EPGScanTimeout;
|
|
int EPGBugfixLevel;
|
|
int EPGLinger;
|
|
int SVDRPTimeout;
|
|
int ZapTimeout;
|
|
int ChannelEntryTimeout;
|
|
int PrimaryLimit;
|
|
int DefaultPriority, DefaultLifetime;
|
|
int PausePriority, PauseLifetime;
|
|
int PauseKeyHandling;
|
|
int UseSubtitle;
|
|
int UseVps;
|
|
int VpsMargin;
|
|
int RecordingDirs;
|
|
int VideoDisplayFormat;
|
|
int VideoFormat;
|
|
int UpdateChannels;
|
|
int UseDolbyDigital;
|
|
int ChannelInfoPos;
|
|
int ChannelInfoTime;
|
|
double OSDLeftP, OSDTopP, OSDWidthP, OSDHeightP;
|
|
int OSDLeft, OSDTop, OSDWidth, OSDHeight;
|
|
double OSDAspect;
|
|
int OSDMessageTime;
|
|
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;
|
|
int MaxVideoFileSize;
|
|
int SplitEditedFiles;
|
|
int MinEventTimeout, MinUserInactivity;
|
|
time_t NextWakeupTime;
|
|
int MultiSpeedMode;
|
|
int ShowReplayMode;
|
|
int ResumeID;
|
|
int CurrentChannel;
|
|
int CurrentVolume;
|
|
int CurrentDolby;
|
|
int InitialChannel;
|
|
int InitialVolume;
|
|
int ChannelsWrap;
|
|
int EmergencyExit;
|
|
int __EndData__;
|
|
cSetup(void);
|
|
cSetup& operator= (const cSetup &s);
|
|
bool Load(const char *FileName);
|
|
bool Save(void);
|
|
};
|
|
|
|
extern cSetup Setup;
|
|
|
|
#endif //__CONFIG_H
|