mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Changed -O2 to -O3 in Make.config.template (reported by Matti Lehtimäki). - Added a missing 'default' case in cPixmapMemory::DrawEllipse(). - Fixed some direct comparisons of double values. - Fixed detecting frames on channels that broadcast with separate "fields" instead of complete frames. - Made updating the editing marks during replay react faster in case the marks file has just been written (with a patch from Udo Richter). - Fixed horizontal scaling of subtitles (reported by Reinhard Nissl). - Stripped the note "The data returned by this function is only used for informational purposes (if any)" from the description of cDevice::GetVideoSize(). The VideoAspect is now used to properly scale subtitles. - Fixed cUnbufferedFile::Seek() in case it is compiled without USE_FADVISE (thanks to Juergen Lock). - Fixed the Language header of the Serbian translation file (thanks to Ville Skyttä). - Added anti-aliasing when upscaling bitmaps, which improves the display of SD subtitles when replayed on an HD OSD (thanks to Reinhard Nissl for his help in debugging). - Renamed cBitmap::Scale() to Scaled(), because it doesn't modify the bitmap itself, but rather returns a scaled copy. - Fixed the description of cReceiver in PLUGINS.html, regarding detaching a receiver from its device before deleting it (reported by Winfried Köhler). This change in behavior was introduced in version 1.5.7. - Fixed scaling subtitles in case the OSD size is exactly the same as the display size of the subtitles. - Added a missing initialization to sDvbSpuRect (reported by Sergiu Dotenco). - Replaced "%lld" and "%llX" print format specifiers with "PRId64" and "PRIX64" to avoid compiler warnings with gcc 4.5.2 (thanks to Sergiu Dotenco). On a personal note: I find it a step in the totally wrong direction that there have been macros introduced to work around this problem in the first place. There should have been "real" format specifiers defined that address this. These macros are nothing but an ugly workaround. - Added Cancel(3) to ~cTrueColorDemo() in the "osddemo" plugin (thanks to Reinhard Nissl). - Added a missing font deletion in cTrueColorDemo::Action() in the "osddemo" plugin (thanks to Reinhard Nissl). - Fixed a buffer overflow in cFont::Bidi() (thanks to Reinhard Nissl). - Added HD stream content identifiers to vdr.5 (thanks to Christoph Haubrich). - Made cRecordingInfo::Read(FILE *f) private to avoid calls to it from outside cRecordingInfo or cRecording (reported by Mika Laitio). - The dvbhddevice plugin is now part of the VDR distribution archive (thanks to Andreas Regel). - Removed an obsolete local variable in dvbsdffosd.c (thanks to Paul Menzel). - Fixed a possible NULL pointer dereference in osddemo.c (reported by Paul Menzel). - Now using pkg-config to get fribidi, freetype and fontconfig cflags and libs (thanks to Ville Skyttä). - The Makefile now also installs the include files (thanks to Ville Skyttä). - Added handling of "ANSI/SCTE 57" descriptors (thanks too Rolf Ahrenberg). - Avoiding an unecessary call to Recordings.ResetResume() (thanks to Reinhard Nissl).
304 lines
7.9 KiB
C++
304 lines
7.9 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.30 2011/03/13 12:02:31 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.18"
|
|
#define VDRVERSNUM 10718 // Version * 10000 + Major * 100 + Minor
|
|
|
|
// The plugin API's version number:
|
|
|
|
#define APIVERSION "1.7.18"
|
|
#define APIVERSNUM 10718 // 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 FoldersInTimerMenu;
|
|
int NumberKeysForChars;
|
|
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 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
|