2000-02-19 13:36:48 +01:00
|
|
|
/*
|
|
|
|
* config.h: Configuration file handling
|
|
|
|
*
|
2000-04-24 09:46:05 +02:00
|
|
|
* See the main source file 'vdr.c' for copyright information and
|
2000-02-19 13:36:48 +01:00
|
|
|
* how to reach the author.
|
|
|
|
*
|
2002-02-25 16:32:34 +01:00
|
|
|
* $Id: config.h 1.100 2002/02/25 16:29:09 kls Exp $
|
2000-02-19 13:36:48 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __CONFIG_H
|
|
|
|
#define __CONFIG_H
|
|
|
|
|
2002-02-02 17:20:54 +01:00
|
|
|
#include <arpa/inet.h>
|
2000-02-19 13:36:48 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2000-03-11 11:22:37 +01:00
|
|
|
#include <time.h>
|
2000-12-28 12:57:16 +01:00
|
|
|
#include <unistd.h>
|
2000-05-01 16:29:46 +02:00
|
|
|
#include "dvbapi.h"
|
2000-10-29 13:17:22 +01:00
|
|
|
#include "eit.h"
|
2000-02-19 13:36:48 +01:00
|
|
|
#include "tools.h"
|
|
|
|
|
2002-02-25 16:32:34 +01:00
|
|
|
#define VDRVERSION "1.0.0pre2"
|
2000-07-29 18:19:49 +02:00
|
|
|
|
2001-06-02 10:47:40 +02:00
|
|
|
#define MAXPRIORITY 99
|
|
|
|
#define MAXLIFETIME 99
|
|
|
|
|
2001-07-27 11:51:42 +02:00
|
|
|
#define MINOSDWIDTH 40
|
|
|
|
#define MAXOSDWIDTH 56
|
|
|
|
#define MINOSDHEIGHT 12
|
|
|
|
#define MAXOSDHEIGHT 21
|
|
|
|
|
2000-02-19 13:36:48 +01:00
|
|
|
enum eKeys { // "Up" and "Down" must be the first two keys!
|
|
|
|
kUp,
|
|
|
|
kDown,
|
|
|
|
kMenu,
|
|
|
|
kOk,
|
|
|
|
kBack,
|
|
|
|
kLeft,
|
|
|
|
kRight,
|
2000-03-11 11:22:37 +01:00
|
|
|
kRed,
|
|
|
|
kGreen,
|
|
|
|
kYellow,
|
|
|
|
kBlue,
|
2000-05-27 16:10:47 +02:00
|
|
|
k0, k1, k2, k3, k4, k5, k6, k7, k8, k9,
|
2001-09-01 11:44:08 +02:00
|
|
|
kPower,
|
2001-09-16 15:06:54 +02:00
|
|
|
kVolUp,
|
|
|
|
kVolDn,
|
|
|
|
kMute,
|
2000-10-08 11:39:11 +02:00
|
|
|
kNone,
|
|
|
|
// The following flags are OR'd with the above codes:
|
|
|
|
k_Repeat = 0x8000,
|
|
|
|
k_Release = 0x4000,
|
|
|
|
k_Flags = k_Repeat | k_Release,
|
2000-02-19 13:36:48 +01:00
|
|
|
};
|
|
|
|
|
2000-12-28 12:57:16 +01:00
|
|
|
// This is in preparation for having more key codes:
|
|
|
|
#define kMarkToggle k0
|
|
|
|
#define kMarkMoveBack k4
|
|
|
|
#define kMarkMoveForward k6
|
|
|
|
#define kMarkJumpBack k7
|
|
|
|
#define kMarkJumpForward k9
|
|
|
|
#define kEditCut k2
|
|
|
|
#define kEditTest k8
|
|
|
|
|
2001-09-08 14:39:09 +02:00
|
|
|
#define RAWKEY(k) (eKeys((k) & ~k_Flags))
|
2000-10-08 16:34:17 +02:00
|
|
|
#define ISRAWKEY(k) ((k) != kNone && ((k) & k_Flags) == 0)
|
2001-09-08 14:39:09 +02:00
|
|
|
#define NORMALKEY(k) (eKeys((k) & ~k_Repeat))
|
2000-10-08 11:39:11 +02:00
|
|
|
|
2002-02-03 15:55:04 +01:00
|
|
|
#define MaxFileName 256
|
|
|
|
|
2000-02-19 13:36:48 +01:00
|
|
|
struct tKey {
|
|
|
|
eKeys type;
|
|
|
|
char *name;
|
|
|
|
unsigned int code;
|
|
|
|
};
|
|
|
|
|
|
|
|
class cKeys {
|
|
|
|
private:
|
|
|
|
char *fileName;
|
|
|
|
public:
|
|
|
|
unsigned char code;
|
|
|
|
unsigned short address;
|
|
|
|
tKey *keys;
|
|
|
|
cKeys(void);
|
|
|
|
void Clear(void);
|
2000-07-15 16:35:18 +02:00
|
|
|
void SetDummyValues(void);
|
2000-07-23 15:01:31 +02:00
|
|
|
bool Load(const char *FileName = NULL);
|
2000-02-19 13:36:48 +01:00
|
|
|
bool Save(void);
|
2000-09-17 09:36:50 +02:00
|
|
|
eKeys Translate(const char *Command);
|
2000-07-15 12:39:20 +02:00
|
|
|
unsigned int Encode(const char *Command);
|
2000-02-19 13:36:48 +01:00
|
|
|
eKeys Get(unsigned int Code);
|
|
|
|
void Set(eKeys Key, unsigned int Code);
|
|
|
|
};
|
|
|
|
|
|
|
|
class cChannel : public cListObject {
|
2000-07-23 15:01:31 +02:00
|
|
|
private:
|
|
|
|
static char *buffer;
|
|
|
|
static const char *ToText(cChannel *Channel);
|
2000-02-19 13:36:48 +01:00
|
|
|
public:
|
|
|
|
enum { MaxChannelName = 32 }; // 31 chars + terminating 0!
|
|
|
|
char name[MaxChannelName];
|
|
|
|
int frequency; // MHz
|
|
|
|
char polarization;
|
|
|
|
int diseqc;
|
|
|
|
int srate;
|
|
|
|
int vpid;
|
2001-06-03 13:07:20 +02:00
|
|
|
int apid1, apid2;
|
2001-06-24 17:42:19 +02:00
|
|
|
int dpid1, dpid2;
|
2001-02-03 16:28:03 +01:00
|
|
|
int tpid;
|
2000-04-15 17:38:11 +02:00
|
|
|
int ca;
|
|
|
|
int pnr;
|
2000-09-09 14:57:43 +02:00
|
|
|
int number; // Sequence number assigned on load
|
|
|
|
bool groupSep;
|
2000-02-19 13:36:48 +01:00
|
|
|
cChannel(void);
|
2000-03-11 11:22:37 +01:00
|
|
|
cChannel(const cChannel *Channel);
|
2000-07-23 15:01:31 +02:00
|
|
|
const char *ToText(void);
|
|
|
|
bool Parse(const char *s);
|
2000-02-19 13:36:48 +01:00
|
|
|
bool Save(FILE *f);
|
2000-11-18 13:57:32 +01:00
|
|
|
bool Switch(cDvbApi *DvbApi = NULL, bool Log = true);
|
2000-02-19 13:36:48 +01:00
|
|
|
};
|
|
|
|
|
2002-02-17 16:03:49 +01:00
|
|
|
enum eTimerActive { taInactive = 0,
|
|
|
|
taActive = 1,
|
|
|
|
taInstant = 2,
|
|
|
|
taActInst = (taActive | taInstant)
|
|
|
|
};
|
|
|
|
|
2000-02-19 13:36:48 +01:00
|
|
|
class cTimer : public cListObject {
|
2000-03-11 11:22:37 +01:00
|
|
|
private:
|
|
|
|
time_t startTime, stopTime;
|
2000-07-23 15:01:31 +02:00
|
|
|
static char *buffer;
|
|
|
|
static const char *ToText(cTimer *Timer);
|
2000-02-19 13:36:48 +01:00
|
|
|
public:
|
2001-08-11 15:48:54 +02:00
|
|
|
bool recording, pending;
|
2000-02-19 13:36:48 +01:00
|
|
|
int active;
|
|
|
|
int channel;
|
|
|
|
int day;
|
|
|
|
int start;
|
|
|
|
int stop;
|
|
|
|
//TODO VPS???
|
|
|
|
int priority;
|
|
|
|
int lifetime;
|
|
|
|
char file[MaxFileName];
|
2002-02-17 13:05:05 +01:00
|
|
|
time_t firstday;
|
2000-07-24 16:43:04 +02:00
|
|
|
char *summary;
|
2000-04-15 17:38:11 +02:00
|
|
|
cTimer(bool Instant = false);
|
2000-10-29 13:17:22 +01:00
|
|
|
cTimer(const cEventInfo *EventInfo);
|
2000-11-11 16:38:41 +01:00
|
|
|
virtual ~cTimer();
|
2000-07-24 16:43:04 +02:00
|
|
|
cTimer& operator= (const cTimer &Timer);
|
2001-08-26 14:17:20 +02:00
|
|
|
bool operator< (const cTimer &Timer);
|
2000-07-23 15:01:31 +02:00
|
|
|
const char *ToText(void);
|
|
|
|
bool Parse(const char *s);
|
2000-02-19 13:36:48 +01:00
|
|
|
bool Save(FILE *f);
|
2000-03-11 11:22:37 +01:00
|
|
|
bool IsSingleEvent(void);
|
2001-08-26 14:17:20 +02:00
|
|
|
int GetMDay(time_t t);
|
|
|
|
int GetWDay(time_t t);
|
|
|
|
bool DayMatches(time_t t);
|
2002-02-17 13:05:05 +01:00
|
|
|
static time_t IncDay(time_t t, int Days);
|
|
|
|
static time_t SetTime(time_t t, int SecondsFromMidnight);
|
2002-02-03 15:55:04 +01:00
|
|
|
char *SetFile(const char *File);
|
2000-07-16 13:37:30 +02:00
|
|
|
bool Matches(time_t t = 0);
|
2000-03-11 11:22:37 +01:00
|
|
|
time_t StartTime(void);
|
|
|
|
time_t StopTime(void);
|
|
|
|
void SetRecording(bool Recording);
|
2001-08-11 15:48:54 +02:00
|
|
|
void SetPending(bool Pending);
|
2002-02-17 13:05:05 +01:00
|
|
|
void SkipToday(void);
|
|
|
|
const char *PrintFirstDay(void);
|
2000-02-19 13:36:48 +01:00
|
|
|
static int TimeToInt(int t);
|
2002-02-17 13:05:05 +01:00
|
|
|
static int ParseDay(const char *s, time_t *FirstDay = NULL);
|
|
|
|
static const char *PrintDay(int d, time_t FirstDay = 0);
|
2000-02-19 13:36:48 +01:00
|
|
|
};
|
|
|
|
|
2000-11-11 16:38:41 +01:00
|
|
|
class cCommand : public cListObject {
|
|
|
|
private:
|
|
|
|
char *title;
|
|
|
|
char *command;
|
|
|
|
static char *result;
|
|
|
|
public:
|
|
|
|
cCommand(void);
|
|
|
|
virtual ~cCommand();
|
|
|
|
bool Parse(const char *s);
|
|
|
|
const char *Title(void) { return title; }
|
|
|
|
const char *Execute(void);
|
|
|
|
};
|
|
|
|
|
2002-02-09 16:03:22 +01:00
|
|
|
typedef uint32_t in_addr_t; //XXX from /usr/include/netinet/in.h (apparently this is not defined on systems with glibc < 2.2)
|
|
|
|
|
2002-02-02 17:20:54 +01:00
|
|
|
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);
|
|
|
|
};
|
|
|
|
|
2000-02-19 13:36:48 +01:00
|
|
|
template<class T> class cConfig : public cList<T> {
|
|
|
|
private:
|
|
|
|
char *fileName;
|
|
|
|
void Clear(void)
|
|
|
|
{
|
|
|
|
delete fileName;
|
|
|
|
cList<T>::Clear();
|
|
|
|
}
|
|
|
|
public:
|
2000-12-28 12:57:16 +01:00
|
|
|
cConfig(void) { fileName = NULL; }
|
|
|
|
virtual ~cConfig() { delete fileName; }
|
2002-02-02 15:57:48 +01:00
|
|
|
virtual bool Load(const char *FileName, bool AllowComments = false)
|
2000-02-19 13:36:48 +01:00
|
|
|
{
|
|
|
|
Clear();
|
|
|
|
fileName = strdup(FileName);
|
2000-12-28 12:57:16 +01:00
|
|
|
bool result = false;
|
|
|
|
if (access(FileName, F_OK) == 0) {
|
|
|
|
isyslog(LOG_INFO, "loading %s", FileName);
|
|
|
|
FILE *f = fopen(fileName, "r");
|
|
|
|
if (f) {
|
|
|
|
int line = 0;
|
2001-09-14 14:35:40 +02:00
|
|
|
char buffer[MAXPARSEBUFFER];
|
2000-12-28 12:57:16 +01:00
|
|
|
result = true;
|
|
|
|
while (fgets(buffer, sizeof(buffer), f) > 0) {
|
|
|
|
line++;
|
2002-02-02 15:57:48 +01:00
|
|
|
if (AllowComments) {
|
|
|
|
char *p = strchr(buffer, '#');
|
|
|
|
if (p)
|
|
|
|
*p = 0;
|
|
|
|
}
|
2001-04-01 14:44:40 +02:00
|
|
|
if (!isempty(buffer)) {
|
|
|
|
T *l = new T;
|
|
|
|
if (l->Parse(buffer))
|
|
|
|
Add(l);
|
|
|
|
else {
|
|
|
|
esyslog(LOG_ERR, "error in %s, line %d\n", fileName, line);
|
|
|
|
delete l;
|
|
|
|
result = false;
|
|
|
|
break;
|
|
|
|
}
|
2000-12-28 12:57:16 +01:00
|
|
|
}
|
2000-02-19 13:36:48 +01:00
|
|
|
}
|
2000-12-28 12:57:16 +01:00
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
LOG_ERROR_STR(fileName);
|
2000-02-19 13:36:48 +01:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
bool Save(void)
|
|
|
|
{
|
|
|
|
bool result = true;
|
|
|
|
T *l = (T *)First();
|
2001-01-13 15:36:31 +01:00
|
|
|
cSafeFile f(fileName);
|
|
|
|
if (f.Open()) {
|
2000-02-19 13:36:48 +01:00
|
|
|
while (l) {
|
|
|
|
if (!l->Save(f)) {
|
|
|
|
result = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
l = (T *)l->Next();
|
|
|
|
}
|
2001-09-16 08:57:58 +02:00
|
|
|
if (!f.Close())
|
|
|
|
result = false;
|
2000-02-19 13:36:48 +01:00
|
|
|
}
|
2001-01-13 15:36:31 +01:00
|
|
|
else
|
2000-02-19 13:36:48 +01:00
|
|
|
result = false;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2000-09-09 14:57:43 +02:00
|
|
|
class cChannels : public cConfig<cChannel> {
|
|
|
|
protected:
|
|
|
|
int maxNumber;
|
|
|
|
public:
|
|
|
|
cChannels(void) { maxNumber = 0; }
|
2002-02-02 15:57:48 +01:00
|
|
|
virtual bool Load(const char *FileName, bool AllowComments = false);
|
2000-09-09 14:57:43 +02:00
|
|
|
int GetNextGroup(int Idx); // Get next channel group
|
|
|
|
int GetPrevGroup(int Idx); // Get previous channel group
|
|
|
|
int GetNextNormal(int Idx); // Get next normal channel (not group)
|
|
|
|
void ReNumber(void); // Recalculate 'number' based on channel type
|
|
|
|
cChannel *GetByNumber(int Number);
|
2000-10-29 13:17:22 +01:00
|
|
|
cChannel *GetByServiceID(unsigned short ServiceId);
|
2000-09-09 14:57:43 +02:00
|
|
|
const char *GetChannelNameByNumber(int Number);
|
|
|
|
bool SwitchTo(int Number, cDvbApi *DvbApi = NULL);
|
|
|
|
int MaxNumber(void) { return maxNumber; }
|
|
|
|
};
|
2001-06-02 10:47:40 +02:00
|
|
|
|
2000-08-06 12:56:49 +02:00
|
|
|
class cTimers : public cConfig<cTimer> {
|
|
|
|
public:
|
|
|
|
cTimer *GetTimer(cTimer *Timer);
|
2001-09-01 15:04:14 +02:00
|
|
|
cTimer *GetMatch(time_t t);
|
2001-08-26 15:02:00 +02:00
|
|
|
cTimer *GetNextActiveTimer(void);
|
2000-08-06 12:56:49 +02:00
|
|
|
};
|
2000-02-19 13:36:48 +01:00
|
|
|
|
2000-11-11 16:38:41 +01:00
|
|
|
class cCommands : public cConfig<cCommand> {};
|
|
|
|
|
2002-02-02 17:20:54 +01:00
|
|
|
class cSVDRPhosts : public cConfig<cSVDRPhost> {
|
|
|
|
public:
|
|
|
|
bool Acceptable(in_addr_t Address);
|
|
|
|
};
|
|
|
|
|
2000-02-19 13:36:48 +01:00
|
|
|
extern cChannels Channels;
|
|
|
|
extern cTimers Timers;
|
|
|
|
extern cKeys Keys;
|
2000-11-11 16:38:41 +01:00
|
|
|
extern cCommands Commands;
|
2002-02-02 17:20:54 +01:00
|
|
|
extern cSVDRPhosts SVDRPhosts;
|
2000-02-19 13:36:48 +01:00
|
|
|
|
2000-09-10 10:51:58 +02:00
|
|
|
class cSetup {
|
|
|
|
private:
|
|
|
|
static char *fileName;
|
|
|
|
bool Parse(char *s);
|
|
|
|
public:
|
|
|
|
// Also adjust cMenuSetup (menu.c) when adding parameters here!
|
2000-11-11 10:39:27 +01:00
|
|
|
int OSDLanguage;
|
2000-09-10 10:51:58 +02:00
|
|
|
int PrimaryDVB;
|
|
|
|
int ShowInfoOnChSwitch;
|
|
|
|
int MenuScrollPage;
|
2000-10-08 13:08:13 +02:00
|
|
|
int MarkInstantRecord;
|
2002-02-03 15:55:04 +01:00
|
|
|
char NameInstantRecord[MaxFileName];
|
2001-06-02 10:47:40 +02:00
|
|
|
int LnbSLOF;
|
2000-10-08 16:18:23 +02:00
|
|
|
int LnbFrequLo;
|
|
|
|
int LnbFrequHi;
|
2001-07-27 13:45:55 +02:00
|
|
|
int DiSEqC;
|
2000-10-29 13:17:22 +01:00
|
|
|
int SetSystemTime;
|
|
|
|
int MarginStart, MarginStop;
|
2000-11-18 13:57:32 +01:00
|
|
|
int EPGScanTimeout;
|
2001-08-17 13:19:10 +02:00
|
|
|
int EPGBugfixLevel;
|
2001-02-18 14:18:13 +01:00
|
|
|
int SVDRPTimeout;
|
2001-08-26 14:17:20 +02:00
|
|
|
int SortTimers;
|
2001-02-24 14:03:39 +01:00
|
|
|
int PrimaryLimit;
|
2001-06-02 10:47:40 +02:00
|
|
|
int DefaultPriority, DefaultLifetime;
|
2001-09-02 15:21:54 +02:00
|
|
|
int UseSubtitle;
|
2002-01-20 14:05:28 +01:00
|
|
|
int RecordingDirs;
|
2001-06-16 14:31:14 +02:00
|
|
|
int VideoFormat;
|
2002-02-24 11:55:24 +01:00
|
|
|
int RecordDolbyDigital;
|
2001-07-27 10:59:50 +02:00
|
|
|
int ChannelInfoPos;
|
2001-07-27 11:51:42 +02:00
|
|
|
int OSDwidth, OSDheight;
|
2001-09-01 15:23:27 +02:00
|
|
|
int OSDMessageTime;
|
2001-08-25 13:52:38 +02:00
|
|
|
int MaxVideoFileSize;
|
2001-09-30 11:31:43 +02:00
|
|
|
int SplitEditedFiles;
|
2001-09-01 09:04:37 +02:00
|
|
|
int MinEventTimeout, MinUserInactivity;
|
2001-09-09 12:52:41 +02:00
|
|
|
int MultiSpeedMode;
|
2001-09-14 14:06:43 +02:00
|
|
|
int ShowReplayMode;
|
2001-01-14 15:29:51 +01:00
|
|
|
int CurrentChannel;
|
2001-09-22 13:41:49 +02:00
|
|
|
int CurrentVolume;
|
2000-09-10 10:51:58 +02:00
|
|
|
cSetup(void);
|
|
|
|
bool Load(const char *FileName);
|
|
|
|
bool Save(const char *FileName = NULL);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern cSetup Setup;
|
|
|
|
|
2000-02-19 13:36:48 +01:00
|
|
|
#endif //__CONFIG_H
|