mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- The CAM is now accessed only if the current channel actually has a non-zero Ca value, and CAM access is completely suppressed during replay, which avoids problems in case the CAM is attached to the primary DVB device. - The "Left" and "Right" buttons now set the cursor to the first or last list item even if the list consist only of a single page, like, for instance, the Main menu (thanks to Oliver Endriss). - Made the log message "OSD window width must be a multiple of 4..." a debug message instead of an error message, so it can be avoided by using a log level less than 3. - Updated Greek language texts (thanks to Dimitrios Dimitrakos). - Fixed faulty behaviour of the "Mute" key in case the channel display is visible (thanks to Florian Bartels for reporting this one and Sascha Volkenandt for helping to fix it). - Modified LOF handling to allow for C-band reception (thanks to Malcolm Caldwell). - Added some missing cAudio handling calls (thanks to Werner Fink). - Replaced the 'for' loops in StripAudioPackets() with memset() calls (thanks to Werner Fink). - Further increased the timeout until an index file is considerd no longer to be written. - Fixed a crash in case the index file can't be accessed any more during replay (thanks to Stefan Huelswitt for reporting this one). - Fixed displaying messages in the status line in case they exceed the OSD width (thanks to Gerhard Steiner for reporting this one). - Avoiding high CPU load in case the connection to LIRC gets lost (thanks to Ludwig Nussel). - Fixed handling repeat function with LIRC (thanks to Ludwig Nussel). - Fixed handling min/max borders when entering integer values (thanks to Andy Grobb for reporting this one). - Implemented a "resume ID" which allows several users to each have their own resume.vdr files (thanks to Martin Hammerschmid). This parameter can be set in the "Setup/Replay" menu (see MANUAL for details). - Now using 'libdtv' version 0.0.5 (thanks to Rolf Hakenes for the new version and Stefan Huelswitt for adapting VDR to it). - If no device with an MPEG decoder can be found at startup, the first device is now used as primary device (just to have some device). - Adjusted some Premiere channels in 'channels.conf' (thanks to Thomas Koch). - Updated 'channels.conf.cable' (thanks to Stefan Hußfeldt). - The 'epg.data' file is now read after all plugins have been started (thanks to Sascha Volkenandt). - The LIRC remote control no longer tries to learn keys if it can't connect to the LIRC daemon (thanks to Ludwig Nussel for reporting this one). The same applies to the RCU remote control in case of errors during startup. - Fixed handling of Ca parameters with values <= MAXDEVICES, which don't indicate an actual encrypted channel (thanks to Stefan Huelswitt for reporting this one).
246 lines
5.9 KiB
C++
246 lines
5.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 1.152 2003/04/12 09:35:50 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 "device.h"
|
|
#include "tools.h"
|
|
|
|
#define VDRVERSION "1.1.27"
|
|
|
|
#define MAXPRIORITY 99
|
|
#define MAXLIFETIME 99
|
|
|
|
#define MINOSDWIDTH 40
|
|
#define MAXOSDWIDTH 56
|
|
#define MINOSDHEIGHT 12
|
|
#define MAXOSDHEIGHT 21
|
|
|
|
#define MaxFileName 256
|
|
|
|
class cCommand : public cListObject {
|
|
private:
|
|
char *title;
|
|
char *command;
|
|
bool confirm;
|
|
static char *result;
|
|
public:
|
|
cCommand(void);
|
|
virtual ~cCommand();
|
|
bool Parse(const char *s);
|
|
const char *Title(void) { return title; }
|
|
bool Confirm(void) { return confirm; }
|
|
const char *Execute(const char *Parameters = NULL);
|
|
};
|
|
|
|
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 Accepts(in_addr_t Address);
|
|
};
|
|
|
|
#define CACONFBASE 100
|
|
|
|
class cCaDefinition : public cListObject {
|
|
private:
|
|
int number;
|
|
char *description;
|
|
public:
|
|
cCaDefinition(void);
|
|
~cCaDefinition();
|
|
bool Parse(const char *s);
|
|
int Number(void) const { return number; }
|
|
const char *Description(void) const { return description; }
|
|
};
|
|
|
|
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)
|
|
{
|
|
Clear();
|
|
if (FileName) {
|
|
free(fileName);
|
|
fileName = strdup(FileName);
|
|
allowComments = AllowComments;
|
|
}
|
|
bool result = false;
|
|
if (fileName && access(fileName, F_OK) == 0) {
|
|
isyslog("loading %s", fileName);
|
|
FILE *f = fopen(fileName, "r");
|
|
if (f) {
|
|
int line = 0;
|
|
char buffer[MAXPARSEBUFFER];
|
|
result = true;
|
|
while (fgets(buffer, sizeof(buffer), f) > 0) {
|
|
line++;
|
|
if (allowComments) {
|
|
char *p = strchr(buffer, '#');
|
|
if (p)
|
|
*p = 0;
|
|
}
|
|
stripspace(buffer);
|
|
if (!isempty(buffer)) {
|
|
T *l = new T;
|
|
if (l->Parse(buffer))
|
|
Add(l);
|
|
else {
|
|
esyslog("ERROR: error in %s, line %d\n", fileName, line);
|
|
delete l;
|
|
result = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
fclose(f);
|
|
}
|
|
else
|
|
LOG_ERROR_STR(fileName);
|
|
}
|
|
return result;
|
|
}
|
|
bool Save(void)
|
|
{
|
|
bool result = true;
|
|
T *l = (T *)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 cCommands : public cConfig<cCommand> {};
|
|
|
|
class cSVDRPhosts : public cConfig<cSVDRPhost> {
|
|
public:
|
|
bool Acceptable(in_addr_t Address);
|
|
};
|
|
|
|
class cCaDefinitions : public cConfig<cCaDefinition> {
|
|
public:
|
|
const cCaDefinition *Get(int Number);
|
|
};
|
|
|
|
extern cCommands Commands;
|
|
extern cCommands RecordingCommands;
|
|
extern cSVDRPhosts SVDRPhosts;
|
|
extern cCaDefinitions CaDefinitions;
|
|
|
|
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 bool operator< (const cListObject &ListObject);
|
|
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 StoreCaCaps(const char *Name);
|
|
bool ParseCaCaps(const char *Value);
|
|
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);
|
|
public:
|
|
// Also adjust cMenuSetup (menu.c) when adding parameters here!
|
|
int __BeginData__;
|
|
int OSDLanguage;
|
|
int PrimaryDVB;
|
|
int ShowInfoOnChSwitch;
|
|
int MenuScrollPage;
|
|
int MarkInstantRecord;
|
|
char NameInstantRecord[MaxFileName];
|
|
int InstantRecordTime;
|
|
int LnbSLOF;
|
|
int LnbFrequLo;
|
|
int LnbFrequHi;
|
|
int DiSEqC;
|
|
int SetSystemTime;
|
|
int TimeTransponder;
|
|
int MarginStart, MarginStop;
|
|
int EPGScanTimeout;
|
|
int EPGBugfixLevel;
|
|
int SVDRPTimeout;
|
|
int SortTimers;
|
|
int PrimaryLimit;
|
|
int DefaultPriority, DefaultLifetime;
|
|
int UseSubtitle;
|
|
int RecordingDirs;
|
|
int VideoFormat;
|
|
int RecordDolbyDigital;
|
|
int ChannelInfoPos;
|
|
int OSDwidth, OSDheight;
|
|
int OSDMessageTime;
|
|
int MaxVideoFileSize;
|
|
int SplitEditedFiles;
|
|
int MinEventTimeout, MinUserInactivity;
|
|
int MultiSpeedMode;
|
|
int ShowReplayMode;
|
|
int ResumeID;
|
|
int CaCaps[MAXDEVICES][MAXCACAPS];
|
|
int CurrentChannel;
|
|
int CurrentVolume;
|
|
int __EndData__;
|
|
cSetup(void);
|
|
cSetup& operator= (const cSetup &s);
|
|
bool Load(const char *FileName);
|
|
bool Save(void);
|
|
};
|
|
|
|
extern cSetup Setup;
|
|
|
|
#endif //__CONFIG_H
|