1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00
vdr/config.h

181 lines
3.7 KiB
C
Raw Normal View History

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.
*
2000-05-27 16:10:47 +02:00
* $Id: config.h 1.6 2000/05/27 14:43:46 kls Exp $
2000-02-19 13:36:48 +01:00
*/
#ifndef __CONFIG_H
#define __CONFIG_H
#define _GNU_SOURCE
2000-02-19 13:36:48 +01:00
#include <stdio.h>
#include <string.h>
#include <time.h>
2000-05-01 16:29:46 +02:00
#include "dvbapi.h"
2000-02-19 13:36:48 +01:00
#include "tools.h"
#define MaxBuffer 1000
enum eKeys { // "Up" and "Down" must be the first two keys!
kUp,
kDown,
kMenu,
kOk,
kBack,
kLeft,
kRight,
kRed,
kGreen,
kYellow,
kBlue,
2000-05-27 16:10:47 +02:00
k0, k1, k2, k3, k4, k5, k6, k7, k8, k9,
2000-02-19 13:36:48 +01:00
kNone
};
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);
bool Load(char *FileName = NULL);
bool Save(void);
eKeys Get(unsigned int Code);
void Set(eKeys Key, unsigned int Code);
};
class cChannel : public cListObject {
public:
enum { MaxChannelName = 32 }; // 31 chars + terminating 0!
char name[MaxChannelName];
int frequency; // MHz
char polarization;
int diseqc;
int srate;
int vpid;
int apid;
int ca;
int pnr;
2000-02-19 13:36:48 +01:00
cChannel(void);
cChannel(const cChannel *Channel);
2000-02-19 13:36:48 +01:00
bool Parse(char *s);
bool Save(FILE *f);
2000-05-01 16:29:46 +02:00
bool Switch(cDvbApi *DvbApi = NULL);
static bool SwitchTo(int i, cDvbApi *DvbApi = NULL);
static const char *GetChannelName(int i);
2000-02-19 13:36:48 +01:00
};
class cTimer : public cListObject {
private:
time_t startTime, stopTime;
2000-02-19 13:36:48 +01:00
public:
enum { MaxFileName = 256 };
bool recording;
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];
cTimer(bool Instant = false);
2000-02-19 13:36:48 +01:00
bool Parse(char *s);
bool Save(FILE *f);
bool IsSingleEvent(void);
2000-02-19 13:36:48 +01:00
bool Matches(void);
time_t StartTime(void);
time_t StopTime(void);
void SetRecording(bool Recording);
2000-02-19 13:36:48 +01:00
static cTimer *GetMatch(void);
static int TimeToInt(int t);
static time_t Day(time_t t);
2000-02-19 13:36:48 +01:00
static int ParseDay(char *s);
static char *PrintDay(int d);
};
template<class T> class cConfig : public cList<T> {
private:
char *fileName;
void Clear(void)
{
delete fileName;
cList<T>::Clear();
}
public:
bool Load(char *FileName)
{
isyslog(LOG_INFO, "loading %s", FileName);
bool result = true;
Clear();
fileName = strdup(FileName);
FILE *f = fopen(fileName, "r");
if (f) {
int line = 0;
char buffer[MaxBuffer];
while (fgets(buffer, sizeof(buffer), f) > 0) {
line++;
T *l = new T;
if (l->Parse(buffer))
Add(l);
else {
esyslog(LOG_ERR, "error in %s, line %d\n", fileName, line);
2000-02-19 13:36:48 +01:00
delete l;
result = false;
break;
}
}
fclose(f);
}
else {
esyslog(LOG_ERR, "can't open '%s'\n", fileName);
2000-02-19 13:36:48 +01:00
result = false;
}
return result;
}
bool Save(void)
{
//TODO make backup copies???
bool result = true;
T *l = (T *)First();
FILE *f = fopen(fileName, "w");
if (f) {
while (l) {
if (!l->Save(f)) {
result = false;
break;
}
l = (T *)l->Next();
}
fclose(f);
}
else
result = false;
return result;
}
};
class cChannels : public cConfig<cChannel> {};
class cTimers : public cConfig<cTimer> {};
extern int CurrentChannel;
extern cChannels Channels;
extern cTimers Timers;
extern cKeys Keys;
#endif //__CONFIG_H