mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Fixed some faulty default parameter initializations (thanks to Robert Schiele). - Added further satellites to 'sources.conf' (thanks to Reinhard Walter Buchner and Oliver Endriss). - Updated Finnish OSD texts (thanks to Jaakko Hyvätti). - Fixed a small glitch when switching channels (thanks to Dennis Noordsij for reporting this one). - Fixed handling multiple 'CaCaps' entries in 'setup.conf'. - Group separators in 'channels.conf' may now be given like ':@201 My Channels', where '@201' indicates the number to be given to the next channel. This can be used to create 'gaps' in the channel numbering (see 'man 5 vdr'). BE CAREFUL TO UPDATE YOUR 'timers.conf' ACCORDINGLY IF INSERTING THIS NEW FEATURE INTO YOUR 'channels.conf' FILE! - Timers now internally have a pointer to their channel (this is necessary to handle gaps in channel numbers, and in preparation for unique channel ids). - Fixed slow reaction on SVDRP input (thanks to Guido Fiala for reporting this one). - Added KI.KA to channels.conf.cable (thanks to Robert Schiele). - Frequency values for cable and terrestrial channels in 'channels.conf' can now be given either in MHz, kHz or Hz. The actual value given will be multiplied by 1000 until it is larger than 1000000. - Fixed skipping unavailable channels when zapping downwards. - Fixed checking the Ca() status of a cDevice (thanks to Stefan Huelswitt). - Fixed switching audio tracks in 'Transfer Mode' on the primary DVB device (thanks to Steffen Barszus and Stefan Huelswitt for reporting this one and helping to fix it). - Fixed channel switching in case of an active 'Transfer Mode' on the primary device ('Transfer Mode' is now launched with priority '-1'). - Fixed a ternary expression in dvbspu.c. - Fixed handling 'Transfer Mode' on single device systems when recording an encrypted channel (thanks to Stefan Huelswitt). - Fixed blocking replaying in case an encrypted channel is being recorded on the primary device. - Now the name of the remote control is displayed when learning the keys. - Fixed learning remote control keys in case there is more than one remote control (thanks to Oliver Endriss for reporting this one). - Implemented additional dedicated keys for "Play", "Pause", "Stop", "Record", "FastFwd", "FastRew", "Channel+" and "Channel-". If your remote control supports any of these keys you can delete your 'remote.conf' file and restart VDR to go through the key learning procedure again in order to assign these new keys. See MANUAL for more information. Authors of player plugins should update their ProcessKey() functions so that the new player keys have the same functionality as the "Up", "Down", "Left", "Right" and "Blue" keys, respectively. Note that the existing functionality of these keys should by all means be retained, since VDR (and any plugins) shall be fully usable with just the basic set of keys. These new keys are only for additional comfort in case the remote control in use supports them. - Implemented new keys to directly access the VDR main menu functions "Schedule", "Channels", "Timers", "Recordings", "Setup" and "Commands". If your remote control provides keys you want to assign these functions to, you can delete your 'remote.cof' file and restart VDR to go through the key learning procedure again in order to assign these new keys. See MANUAL for more information. - The new configuration file 'keymacros.conf' can be used to assign macros to the color buttons in normal viewing mode, as well as to up to 9 user defined keys. See MANUAL and man vdr(5) for more information. The default 'keymacros.conf' implements the functionality of the "color button patch". - Fixed a crash when learning the keys of several remote controls and pressing buttons of those that have already been learned (thanks to Oliver Endriss for reporting this one).
178 lines
5.5 KiB
C++
178 lines
5.5 KiB
C++
/*
|
|
* tools.h: Various tools
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: tools.h 1.51 2002/10/19 12:31:50 kls Exp $
|
|
*/
|
|
|
|
#ifndef __TOOLS_H
|
|
#define __TOOLS_H
|
|
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <poll.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <syslog.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
|
|
typedef unsigned char uchar;
|
|
|
|
extern int SysLogLevel;
|
|
|
|
#define esyslog(a...) void( (SysLogLevel > 0) ? syslog(LOG_ERR, a) : void() )
|
|
#define isyslog(a...) void( (SysLogLevel > 1) ? syslog(LOG_INFO, a) : void() )
|
|
#define dsyslog(a...) void( (SysLogLevel > 2) ? syslog(LOG_DEBUG, a) : void() )
|
|
|
|
#define LOG_ERROR esyslog("ERROR (%s,%d): %m", __FILE__, __LINE__)
|
|
#define LOG_ERROR_STR(s) esyslog("ERROR: %s: %m", s)
|
|
|
|
#define SECSINDAY 86400
|
|
|
|
#define KILOBYTE(n) ((n) * 1024)
|
|
#define MEGABYTE(n) ((n) * 1024 * 1024)
|
|
|
|
#define MAXPARSEBUFFER KILOBYTE(10)
|
|
|
|
#define MALLOC(type, size) (type *)malloc(sizeof(type) * (size))
|
|
|
|
#define DELETENULL(p) (delete (p), p = NULL)
|
|
|
|
#define CHECK(s) { if ((s) < 0) LOG_ERROR; } // used for 'ioctl()' calls
|
|
#define FATALERRNO (errno != EAGAIN && errno != EINTR)
|
|
|
|
template<class T> inline T min(T a, T b) { return a <= b ? a : b; }
|
|
template<class T> inline T max(T a, T b) { return a >= b ? a : b; }
|
|
template<class T> inline int sgn(T a) { return a < 0 ? -1 : a > 0 ? 1 : 0; }
|
|
template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; }
|
|
|
|
ssize_t safe_read(int filedes, void *buffer, size_t size);
|
|
ssize_t safe_write(int filedes, const void *buffer, size_t size);
|
|
void writechar(int filedes, char c);
|
|
char *readline(FILE *f);
|
|
char *strcpyrealloc(char *dest, const char *src);
|
|
char *strn0cpy(char *dest, const char *src, size_t n);
|
|
char *strreplace(char *s, char c1, char c2);
|
|
char *strreplace(char *s, const char *s1, const char *s2); // re-allocates 's' and deletes the original string if necessary!
|
|
char *skipspace(const char *s);
|
|
char *stripspace(char *s);
|
|
char *compactspace(char *s);
|
|
const char *strescape(const char *s, const char *chars); // returns a statically allocated string!
|
|
bool startswith(const char *s, const char *p);
|
|
bool endswith(const char *s, const char *p);
|
|
bool isempty(const char *s);
|
|
int numdigits(int n);
|
|
int time_ms(void);
|
|
void delay_ms(int ms);
|
|
bool isnumber(const char *s);
|
|
const char *AddDirectory(const char *DirName, const char *FileName); // returns a statically allocated string!
|
|
int FreeDiskSpaceMB(const char *Directory, int *UsedMB = NULL);
|
|
bool DirectoryOk(const char *DirName, bool LogErrors = false);
|
|
bool MakeDirs(const char *FileName, bool IsDirectory = false);
|
|
bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks = false);
|
|
bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false);
|
|
char *ReadLink(const char *FileName);
|
|
bool SpinUpDisk(const char *FileName);
|
|
const char *WeekDayName(int WeekDay); // returns a statically allocated string!
|
|
const char *DayDateTime(time_t t = 0); // returns a statically allocated string!
|
|
|
|
class cPoller {
|
|
private:
|
|
enum { MaxPollFiles = 16 };
|
|
pollfd pfd[MaxPollFiles];
|
|
int numFileHandles;
|
|
public:
|
|
cPoller(int FileHandle = -1, bool Out = false);
|
|
bool Add(int FileHandle, bool Out);
|
|
bool Poll(int TimeoutMs = 0);
|
|
};
|
|
|
|
class cFile {
|
|
private:
|
|
static bool files[];
|
|
static int maxFiles;
|
|
int f;
|
|
public:
|
|
cFile(void);
|
|
~cFile();
|
|
operator int () { return f; }
|
|
bool Open(const char *FileName, int Flags, mode_t Mode = S_IRUSR | S_IWUSR | S_IRGRP);
|
|
bool Open(int FileDes);
|
|
void Close(void);
|
|
bool IsOpen(void) { return f >= 0; }
|
|
bool Ready(bool Wait = true);
|
|
static bool AnyFileReady(int FileDes = -1, int TimeoutMs = 1000);
|
|
static bool FileReady(int FileDes, int TimeoutMs = 1000);
|
|
static bool FileReadyForWriting(int FileDes, int TimeoutMs = 1000);
|
|
};
|
|
|
|
class cSafeFile {
|
|
private:
|
|
FILE *f;
|
|
char *fileName;
|
|
char *tempName;
|
|
public:
|
|
cSafeFile(const char *FileName);
|
|
~cSafeFile();
|
|
operator FILE* () { return f; }
|
|
bool Open(void);
|
|
bool Close(void);
|
|
};
|
|
|
|
class cLockFile {
|
|
private:
|
|
char *fileName;
|
|
int f;
|
|
public:
|
|
cLockFile(const char *Directory);
|
|
~cLockFile();
|
|
bool Lock(int WaitSeconds = 0);
|
|
void Unlock(void);
|
|
};
|
|
|
|
class cListObject {
|
|
private:
|
|
cListObject *prev, *next;
|
|
public:
|
|
cListObject(void);
|
|
virtual ~cListObject();
|
|
virtual bool operator< (const cListObject &ListObject) { return false; }
|
|
void Append(cListObject *Object);
|
|
void Insert(cListObject *Object);
|
|
void Unlink(void);
|
|
int Index(void);
|
|
cListObject *Prev(void) const { return prev; }
|
|
cListObject *Next(void) const { return next; }
|
|
};
|
|
|
|
class cListBase {
|
|
protected:
|
|
cListObject *objects, *lastObject;
|
|
cListBase(void);
|
|
public:
|
|
virtual ~cListBase();
|
|
void Add(cListObject *Object, cListObject *After = NULL);
|
|
void Ins(cListObject *Object, cListObject *Before = NULL);
|
|
void Del(cListObject *Object, bool DeleteObject = true);
|
|
virtual void Move(int From, int To);
|
|
void Move(cListObject *From, cListObject *To);
|
|
virtual void Clear(void);
|
|
cListObject *Get(int Index) const;
|
|
int Count(void) const;
|
|
void Sort(void);
|
|
};
|
|
|
|
template<class T> class cList : public cListBase {
|
|
public:
|
|
T *Get(int Index) const { return (T *)cListBase::Get(Index); }
|
|
T *First(void) const { return (T *)objects; }
|
|
T *Last(void) const { return (T *)lastObject; }
|
|
T *Prev(const T *object) const { return (T *)object->cListObject::Prev(); } // need to call cListObject's members to
|
|
T *Next(const T *object) const { return (T *)object->cListObject::Next(); } // avoid ambiguities in case of a "list of lists"
|
|
};
|
|
|
|
#endif //__TOOLS_H
|