vdr/config.h
Klaus Schmidinger 14bd32b948 Version 1.7.37
VDR developer version 1.7.37 is now available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.37.tar.bz2

A 'diff' against the previous version is available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.36-1.7.37.diff

MD5 checksums:

602dc7e678bcfcf075da36344a337562  vdr-1.7.37.tar.bz2
34e953fcffc112f316cbfc1f53915324  vdr-1.7.36-1.7.37.diff

WARNING:
========

This is a developer version. Even though I use it in my productive
environment. I strongly recommend that you only use it under controlled
conditions and for testing and debugging.

Approaching version 2.0.0:
==========================

If all goes well, there should be no more functional or API changes
before the final version 2.0.0. There will just be a few more fixes.

From the HISTORY file:
- Now also using FindHeader() in cMpeg2Fixer::AdjTref() (pointed out by Sören Moch).
- Added missing template for DVBDIR to Make.config.template (reported by Derek Kelly).
- The LCARS menu now also works if the OSD has only 1bpp (two colors).
- Fixed possible garbage in the remaining time of the LCARS replay display in case the
  hours change from two to one digit.
- Fixed upscaling bitmaps. The last row and column of the scaled bitmap was not filled,
  which resulted in empty lines between scaled subtitles.
- Fixed a leftover line in case a two line subtitle was followed by a one line
  subtitle on the dvbhddevice in "high level" OSD mode.
- Returning 0 from cDvbSdFfDevice::NumProvidedSystems() if option --outputonly is given.
- The index file is now closed after initially reading it if it is older than 3600 seconds.
- Improved responsiveness during replay when close to the recording's end.
- Fixed a leftover progress display in the LCARS main menu when replay of a recording
  ends while the menu is open, and the live channel has no EPG information.
- Fixed possible audio chatter when a recording is replayed to its very end.
- Added dependency on 'i18n' to 'install-i18n' in the VDR Makefile (thanks to Tobias
  Grimm).
- Changed several calls to Skins.Message() in vdr.c to Skins.QueueMessage() in order to
  avoid a black screen while such a message is displayed in case the channel will be
  switched (reported by Uwe Scheffler).
- Updated the Slovakian language texts (thanks to Milan Hrala).
- Improved LIRC timing for repeat function.
- When pausing live video, the current audio and subtitle tracks are now retained.
- Added some notes about plugin Makefiles to PLUGINS.html.
- Avoiding an extra key press event if the repeat function kicks in when controlling
  VDR via the PC keyboard.
- The new options "Setup/Miscellaneous/Remote control repeat delay" and
  "Setup/Miscellaneous/Remote control repeat delta" can be used to adjust the
  behavior of the remote control in case a key is held pressed down for a while, so
  that the repeat function kicks in (see MANUAL).
  The builtin LIRC and KBD remote controls already use these parameters. It is
  recommended that plugins that implement an interface to any kind of remote controls
  also use the parameters Setup.RcRepeatDelay and Setup.RcRepeatDelta for the desired
  purpose, and remove any setup options they might have that serve the same purpose.
- cTimer no longer does any special "VFAT" handling to shorten directory names to 40
  characters. When a string is used as a directory name for a recording, the maximum
  length of the directory path, as well as the individual directory names, is now
  limited to the values specified by the new command line option --dirnames (see
  man vdr(1) for details). For backwards compatibility the option --vfat is still
  available and has the same effect as --dirnames=250,40,1.
- The macro MaxFileName is now obsolete and may be removed in future versions. Use
  NAME_MAX directly instead.
- There is no more fixed limit to the maximum number of cPixmap objects an OSD can
  create. However, a particular device may still be unable to create an arbitrary
  number of pixmaps, due to limited resources. So it's always a good idea to use
  as few pixmaps as possible.
- Fixed formatting and removed some superfluous break statements in vdr.c's command
  line option switch.
2013-02-09 18:56:41 +01:00

346 lines
9.7 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.64 2013/02/05 11:19:20 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.37"
#define VDRVERSNUM 10737 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
#define APIVERSION "1.7.37"
#define APIVERSNUM 10737 // 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 MINOSDWIDTH 480
#define MAXOSDWIDTH 1920
#define MINOSDHEIGHT 324
#define MAXOSDHEIGHT 1200
#define MaxFileName NAME_MAX // obsolete - use NAME_MAX directly instead!
#define MaxSkinName 16
#define MaxThemeName 16
// 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
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);
};
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.
};
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))
this->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[NAME_MAX];
int InstantRecordTime;
int LnbSLOF;
int LnbFrequLo;
int LnbFrequHi;
int DiSEqC;
int SetSystemTime;
int TimeSource;
int TimeTransponder;
int StandardCompliance;
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 RcRepeatDelay;
int RcRepeatDelta;
int DefaultPriority, DefaultLifetime;
int PausePriority, PauseLifetime;
int PauseKeyHandling;
int UseSubtitle;
int UseVps;
int VpsMargin;
int RecordingDirs;
int FoldersInTimerMenu;
int NumberKeysForChars;
int ColorKey0, ColorKey1, ColorKey2, ColorKey3;
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 DelTimeshiftRec;
int MinEventTimeout, MinUserInactivity;
time_t NextWakeupTime;
int MultiSpeedMode;
int ShowReplayMode;
int ShowRemainingTime;
int ProgressDisplayTime;
int PauseOnMarkSet;
int ResumeID;
int CurrentChannel;
int CurrentVolume;
int CurrentDolby;
int InitialVolume;
int ChannelsWrap;
int ShowChannelNamesWithSource;
int EmergencyExit;
int __EndData__;
cString InitialChannel;
cString DeviceBondings;
cSetup(void);
cSetup& operator= (const cSetup &s);
bool Load(const char *FileName);
bool Save(void);
};
extern cSetup Setup;
#endif //__CONFIG_H