mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- The CAM handling has been refactored. Instead of a cCiHandler per device there is now an abstract cCiAdapter and a cCamSlot. This allows each slot to be accessed individually. - The general 15 seconds workaround time before opening the CAM menu has been removed. If the CAM menu doesn't open within a timeout, the enter menu command is now sent again. - If a CAM is reset or pulled and reinserted, it now automatically starts decrypting the current channel again. - The Setup/CAM menu now dynamically refreshes its items and displays whether a CAM is present or ready. The 'Reset' function no longer leaves the menu. - The CAM menu will now be openend when pressing the Ok key on a slot entry. - The CAM menu now stays within the current menu context and doesn't close and reopen the menu every time an option is selected. - When an encrypted channel is switched to for the first time, VDR now checks explicitly whether a CAM can actually decrypt that channel. If there is more than one CAM in the system that claims to be able to decrypt the channel, they are all tried in turn. To make this possible, an encrypted channel needs to be received in Transfer Mode when it is switched to for the first time, so that VDR can determine whether the TS packets are actually decrypted. Once a channel is known to be decrypted by a particular CAM, the next time it is switched to it will be shown in normal live viewing mode. - A cDevice now automatically detaches all cReceiver objects that receive PIDs that can't be decrypted with the current CAM. A plugin that attaches a cReceiver to a device should therefore watch the receiver's IsAttached() function to see if it is still attached to the device. - The cReceiver constructor no longer takes an 'int Ca' as its first parameter, but rather a 'tChannelID ChannelID'. This is necessary for the device to be able to determine which CAM a particular channel can be decrypted with. If the channel is known to be unencrypted, or a plugin doesn't want to provide the channel id for other reasons, an invalid tChannelID() can be given. - The cThread::Start() function now waits until a previous incarnation of this thread has actually stopped. Before this it could happen that a thread's Cancel(-1) function was called and immediately after that it was started again, but the Start() function still found it to be 'active'. - The parameter NeedsDetachReceivers in cDevice::GetDevice(const cChannel *Channel, ...) has been removed. A call to this function will automatically detach all receivers from the device if it returns a non-NULL pointer. - The cTimeMs class now accepts an initial timeout value in its constructor. - A CAM is now explicitly instructed to stop decrypting when switching away from an encrypted channel. - If the CAM in use can decrypt several channels at the same time, VDR can now make use if this capability. Whether or not a CAM can decrypt more than one channel is determined by sending it an initial empty QUERY command and testing whether it replies to it. - Ca values in the range 0...F in channels.conf can still be used to assign a channel to a particular device, but this will no longer work with encrypted channels because without valid CA ids VDR can't decide which CAM slot to use. However, since VDR now automatically determines which CAM can decrypt which channel, setting fixed channel/device relations should no longer be necessary. IF AN ENCRYPTED CHANNEL CAN'T BE DECRYPTED AND YOU HAVE A CA VALUE IN THE RANGE 0...F FOR THAT CHANNEL, SET IT TO 0 (FTA) AND TUNE TO THE CHANNEL AGAIN.
265 lines
6.6 KiB
C++
265 lines
6.6 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.283 2007/01/07 14:09: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 "tools.h"
|
|
|
|
// VDR's own version number:
|
|
|
|
#define VDRVERSION "1.5.0"
|
|
#define VDRVERSNUM 10500 // Version * 10000 + Major * 100 + Minor
|
|
|
|
// The plugin API's version number:
|
|
|
|
#define APIVERSION "1.5.0"
|
|
#define APIVERSNUM 10500 // 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 672
|
|
#define MINOSDHEIGHT 324
|
|
#define MAXOSDHEIGHT 567
|
|
|
|
#define MaxFileName 256
|
|
#define MaxSkinName 16
|
|
#define MaxThemeName 16
|
|
|
|
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);
|
|
};
|
|
|
|
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;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
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 cCommands : public cConfig<cCommand> {};
|
|
|
|
class cSVDRPhosts : public cConfig<cSVDRPhost> {
|
|
public:
|
|
bool Acceptable(in_addr_t Address);
|
|
};
|
|
|
|
extern cCommands Commands;
|
|
extern cCommands 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);
|
|
public:
|
|
// Also adjust cMenuSetup (menu.c) when adding parameters here!
|
|
int __BeginData__;
|
|
int OSDLanguage;
|
|
char OSDSkin[MaxSkinName];
|
|
char OSDTheme[MaxThemeName];
|
|
int PrimaryDVB;
|
|
int ShowInfoOnChSwitch;
|
|
int TimeoutRequChInfo;
|
|
int MenuScrollPage;
|
|
int MenuScrollWrap;
|
|
int MenuButtonCloses;
|
|
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[I18nNumLanguages + 1];
|
|
int EPGLanguages[I18nNumLanguages + 1];
|
|
int EPGScanTimeout;
|
|
int EPGBugfixLevel;
|
|
int EPGLinger;
|
|
int SVDRPTimeout;
|
|
int ZapTimeout;
|
|
int PrimaryLimit;
|
|
int DefaultPriority, DefaultLifetime;
|
|
int PausePriority, PauseLifetime;
|
|
int UseSubtitle;
|
|
int UseVps;
|
|
int VpsMargin;
|
|
int RecordingDirs;
|
|
int VideoDisplayFormat;
|
|
int VideoFormat;
|
|
int UpdateChannels;
|
|
int UseDolbyDigital;
|
|
int ChannelInfoPos;
|
|
int ChannelInfoTime;
|
|
int OSDLeft, OSDTop, OSDWidth, OSDHeight;
|
|
int OSDMessageTime;
|
|
int UseSmallFont;
|
|
int MaxVideoFileSize;
|
|
int SplitEditedFiles;
|
|
int MinEventTimeout, MinUserInactivity;
|
|
int MultiSpeedMode;
|
|
int ShowReplayMode;
|
|
int ResumeID;
|
|
int CurrentChannel;
|
|
int CurrentVolume;
|
|
int CurrentDolby;
|
|
int InitialChannel;
|
|
int InitialVolume;
|
|
int __EndData__;
|
|
cSetup(void);
|
|
cSetup& operator= (const cSetup &s);
|
|
bool Load(const char *FileName);
|
|
bool Save(void);
|
|
};
|
|
|
|
extern cSetup Setup;
|
|
|
|
#endif //__CONFIG_H
|