2003-12-22 13:29:24 +01:00
|
|
|
/*
|
|
|
|
* epg.h: Electronic Program Guide
|
|
|
|
*
|
|
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
|
|
* how to reach the author.
|
|
|
|
*
|
|
|
|
* Original version (as used in VDR before 1.3.0) written by
|
|
|
|
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
|
|
|
*
|
2004-03-14 13:27:57 +01:00
|
|
|
* $Id: epg.h 1.15 2004/03/14 13:25:39 kls Exp $
|
2003-12-22 13:29:24 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __EPG_H
|
|
|
|
#define __EPG_H
|
|
|
|
|
|
|
|
#include "channels.h"
|
|
|
|
#include "thread.h"
|
|
|
|
#include "tools.h"
|
|
|
|
|
|
|
|
#define MAXEPGBUGFIXLEVEL 2
|
|
|
|
|
2004-02-22 15:36:36 +01:00
|
|
|
enum eDumpMode { dmAll, dmPresent, dmFollowing, dmAtTime };
|
|
|
|
|
2003-12-22 13:29:24 +01:00
|
|
|
class cSchedule;
|
|
|
|
|
|
|
|
class cEvent : public cListObject {
|
|
|
|
private:
|
|
|
|
tChannelID channelID; // Channel ID of program for this event
|
|
|
|
u_int16_t eventID; // Event ID of this event
|
|
|
|
uchar tableID; // Table ID this event came from
|
2003-12-25 12:50:22 +01:00
|
|
|
uchar version; // Version number of section this event came from
|
2004-02-21 12:28:17 +01:00
|
|
|
int runningStatus; // 0=undefined, 1=not running, 2=starts in a few seconds, 3=pausing, 4=running
|
2003-12-22 13:29:24 +01:00
|
|
|
char *title; // Title of this event
|
|
|
|
char *shortText; // Short description of this event (typically the episode name in case of a series)
|
|
|
|
char *description; // Description of this event
|
|
|
|
time_t startTime; // Start time of this event
|
|
|
|
int duration; // Duration of this event in seconds
|
2004-02-22 13:33:20 +01:00
|
|
|
time_t vps; // Video Programming Service timestamp (VPS, aka "Programme Identification Label", PIL)
|
2003-12-22 13:29:24 +01:00
|
|
|
public:
|
|
|
|
cEvent(tChannelID ChannelID, u_int16_t EventID);
|
|
|
|
~cEvent();
|
2004-02-21 13:56:20 +01:00
|
|
|
virtual bool operator< (const cListObject &ListObject);
|
2003-12-22 13:29:24 +01:00
|
|
|
tChannelID ChannelID(void) const { return channelID; }
|
|
|
|
u_int16_t EventID(void) const { return eventID; }
|
2003-12-25 12:50:22 +01:00
|
|
|
uchar TableID(void) const { return tableID; }
|
|
|
|
uchar Version(void) const { return version; }
|
2004-02-21 12:28:17 +01:00
|
|
|
int RunningStatus(void) const { return runningStatus; }
|
2003-12-22 13:29:24 +01:00
|
|
|
const char *Title(void) const { return title; }
|
|
|
|
const char *ShortText(void) const { return shortText; }
|
|
|
|
const char *Description(void) const { return description; }
|
|
|
|
time_t StartTime(void) const { return startTime; }
|
2004-03-06 11:27:08 +01:00
|
|
|
time_t EndTime(void) const { return startTime + duration; }
|
2003-12-22 13:29:24 +01:00
|
|
|
int Duration(void) const { return duration; }
|
2004-02-22 13:33:20 +01:00
|
|
|
time_t Vps(void) const { return vps; }
|
2004-02-29 14:21:22 +01:00
|
|
|
bool HasTimer(void) const;
|
2004-03-06 11:27:08 +01:00
|
|
|
bool IsRunning(bool OrAboutToStart = false) const;
|
2003-12-22 13:29:24 +01:00
|
|
|
const char *GetDateString(void) const;
|
|
|
|
const char *GetTimeString(void) const;
|
|
|
|
const char *GetEndTimeString(void) const;
|
2004-02-22 13:33:20 +01:00
|
|
|
const char *GetVpsString(void) const;
|
2003-12-25 12:50:22 +01:00
|
|
|
void SetEventID(u_int16_t EventID);
|
2003-12-22 13:29:24 +01:00
|
|
|
void SetTableID(uchar TableID);
|
2003-12-25 12:50:22 +01:00
|
|
|
void SetVersion(uchar Version);
|
2004-03-13 15:01:05 +01:00
|
|
|
void SetRunningStatus(int RunningStatus, cChannel *Channel = NULL);
|
2003-12-22 13:29:24 +01:00
|
|
|
void SetTitle(const char *Title);
|
|
|
|
void SetShortText(const char *ShortText);
|
|
|
|
void SetDescription(const char *Description);
|
|
|
|
void SetStartTime(time_t StartTime);
|
|
|
|
void SetDuration(int Duration);
|
2004-02-22 13:33:20 +01:00
|
|
|
void SetVps(time_t Vps);
|
2003-12-22 13:29:24 +01:00
|
|
|
void Dump(FILE *f, const char *Prefix = "") const;
|
|
|
|
static bool Read(FILE *f, cSchedule *Schedule);
|
|
|
|
void FixEpgBugs(void);
|
|
|
|
};
|
|
|
|
|
|
|
|
class cSchedules;
|
|
|
|
|
|
|
|
class cSchedule : public cListObject {
|
|
|
|
private:
|
|
|
|
tChannelID channelID;
|
|
|
|
cList<cEvent> events;
|
2004-03-13 15:01:05 +01:00
|
|
|
bool hasRunning;
|
2003-12-22 13:29:24 +01:00
|
|
|
public:
|
|
|
|
cSchedule(tChannelID ChannelID);
|
|
|
|
tChannelID ChannelID(void) const { return channelID; }
|
2004-03-06 14:33:22 +01:00
|
|
|
void SetRunningStatus(cEvent *Event, int RunningStatus, cChannel *Channel = NULL);
|
2004-03-13 15:01:05 +01:00
|
|
|
void ClrRunningStatus(cChannel *Channel = NULL);
|
2004-01-09 15:53:59 +01:00
|
|
|
void ResetVersions(void);
|
2004-02-21 13:56:20 +01:00
|
|
|
void Sort(void);
|
2003-12-22 13:29:24 +01:00
|
|
|
void Cleanup(time_t Time);
|
|
|
|
void Cleanup(void);
|
|
|
|
cEvent *AddEvent(cEvent *Event);
|
2004-03-14 13:27:57 +01:00
|
|
|
const cList<cEvent> *Events(void) const { return &events; }
|
2004-02-22 14:14:55 +01:00
|
|
|
const cEvent *GetPresentEvent(bool CheckRunningStatus = false) const;
|
|
|
|
const cEvent *GetFollowingEvent(bool CheckRunningStatus = false) const;
|
2003-12-22 13:29:24 +01:00
|
|
|
const cEvent *GetEvent(u_int16_t EventID, time_t StartTime = 0) const;
|
|
|
|
const cEvent *GetEventAround(time_t Time) const;
|
2004-02-22 15:36:36 +01:00
|
|
|
void Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0) const;
|
2003-12-22 13:29:24 +01:00
|
|
|
static bool Read(FILE *f, cSchedules *Schedules);
|
|
|
|
};
|
|
|
|
|
|
|
|
class cSchedulesLock {
|
|
|
|
private:
|
|
|
|
bool locked;
|
|
|
|
public:
|
|
|
|
cSchedulesLock(bool WriteLock = false, int TimeoutMs = 0);
|
|
|
|
~cSchedulesLock();
|
|
|
|
bool Locked(void) { return locked; }
|
|
|
|
};
|
|
|
|
|
|
|
|
class cSchedules : public cList<cSchedule> {
|
|
|
|
friend class cSchedule;
|
|
|
|
friend class cSchedulesLock;
|
|
|
|
private:
|
2004-01-04 12:30:00 +01:00
|
|
|
cRwLock rwlock;
|
2003-12-22 13:29:24 +01:00
|
|
|
static cSchedules schedules;
|
|
|
|
static const char *epgDataFileName;
|
|
|
|
static time_t lastCleanup;
|
|
|
|
static time_t lastDump;
|
|
|
|
public:
|
|
|
|
static void SetEpgDataFileName(const char *FileName);
|
|
|
|
static const cSchedules *Schedules(cSchedulesLock &SchedulesLock);
|
|
|
|
///< Caller must provide a cSchedulesLock which has to survive the entire
|
|
|
|
///< time the returned cSchedules is accessed. Once the cSchedules is no
|
|
|
|
///< longer used, the cSchedulesLock must be destroyed.
|
|
|
|
static void Cleanup(bool Force = false);
|
2004-01-09 15:53:59 +01:00
|
|
|
static void ResetVersions(void);
|
2003-12-22 13:29:24 +01:00
|
|
|
static bool ClearAll(void);
|
2004-02-22 15:36:36 +01:00
|
|
|
static bool Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0);
|
2003-12-22 13:29:24 +01:00
|
|
|
static bool Read(FILE *f = NULL);
|
|
|
|
cSchedule *AddSchedule(tChannelID ChannelID);
|
|
|
|
const cSchedule *GetSchedule(tChannelID ChannelID) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
void ReportEpgBugFixStats(bool Reset = false);
|
|
|
|
|
|
|
|
#endif //__EPG_H
|