vdr/eit.h

187 lines
7.1 KiB
C
Raw Normal View History

/***************************************************************************
eit.h - description
-------------------
begin : Fri Aug 25 2000
copyright : (C) 2000 by Robert Schneider
email : Robert.Schneider@web.de
2001-08-15: Adapted to 'libdtv' by Rolf Hakenes <hakenes@hippomi.de>
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* $Id: eit.h 1.29 2003/05/18 12:51:50 kls Exp $
***************************************************************************/
#ifndef __EIT_H
#define __EIT_H
#include "channels.h"
2000-10-29 13:17:22 +01:00
#include "thread.h"
#include "tools.h"
2002-01-13 16:18:40 +01:00
#define MAXEPGBUGFIXLEVEL 2
2000-10-29 13:17:22 +01:00
class cEventInfo : public cListObject {
friend class cSchedule;
friend class cEIT;
private:
unsigned char uTableID; // Table ID this event came from
tChannelID channelID; // Channel ID of program for that event
2000-10-29 13:17:22 +01:00
bool bIsFollowing; // true if this is the next event on this channel
bool bIsPresent; // true if this is the present event running
char *pExtendedDescription; // Extended description of this event
char *pSubtitle; // Subtitle of event
char *pTitle; // Title of event
unsigned short uEventID; // Event ID of this event
long lDuration; // duration of event in seconds
time_t tTime; // Start time
int nChannelNumber; // the actual channel number from VDR's channel list (used in cMenuSchedule for sorting by channel number)
protected:
void SetTableID(unsigned char tableid);
2000-10-29 13:17:22 +01:00
void SetFollowing(bool foll);
void SetPresent(bool pres);
void SetTitle(const char *string);
void SetChannelID(tChannelID channelid);
2000-10-29 13:17:22 +01:00
void SetEventID(unsigned short evid);
void SetDuration(long l);
void SetTime(time_t t);
void SetExtendedDescription(const char *string);
void SetSubtitle(const char *string);
cEventInfo(tChannelID channelid, unsigned short eventid);
public:
2000-10-29 13:17:22 +01:00
~cEventInfo();
const unsigned char GetTableID(void) const;
2000-10-29 13:17:22 +01:00
const char *GetTimeString(void) const;
const char *GetEndTimeString(void) const;
const char *GetDate(void) const;
bool IsFollowing(void) const;
bool IsPresent(void) const;
const char *GetExtendedDescription(void) const;
const char *GetSubtitle(void) const;
const char *GetTitle(void) const;
unsigned short GetEventID(void) const;
long GetDuration(void) const;
time_t GetTime(void) const;
tChannelID GetChannelID(void) const;
2000-10-29 13:17:22 +01:00
int GetChannelNumber(void) const { return nChannelNumber; }
void SetChannelNumber(int ChannelNumber) const { ((cEventInfo *)this)->nChannelNumber = ChannelNumber; } // doesn't modify the EIT data, so it's ok to make it 'const'
void Dump(FILE *f, const char *Prefix = "") const;
2002-02-23 17:11:19 +01:00
static bool Read(FILE *f, cSchedule *Schedule);
2001-08-17 13:19:10 +02:00
void FixEpgBugs(void);
2000-10-29 13:17:22 +01:00
};
class cSchedule : public cListObject {
friend class cSchedules;
friend class cEIT;
private:
cEventInfo *pPresent;
cEventInfo *pFollowing;
tChannelID channelID;
2000-10-29 13:17:22 +01:00
cList<cEventInfo> Events;
protected:
void SetChannelID(tChannelID channelid);
2000-10-29 13:17:22 +01:00
bool SetFollowingEvent(cEventInfo *pEvent);
bool SetPresentEvent(cEventInfo *pEvent);
void Cleanup(time_t tTime);
void Cleanup(void);
cSchedule(tChannelID channelid = tChannelID::InvalidID);
public:
2000-10-29 13:17:22 +01:00
~cSchedule();
2002-02-23 17:11:19 +01:00
cEventInfo *AddEvent(cEventInfo *EventInfo);
2000-10-29 13:17:22 +01:00
const cEventInfo *GetPresentEvent(void) const;
const cEventInfo *GetFollowingEvent(void) const;
tChannelID GetChannelID(void) const;
const cEventInfo *GetEvent(unsigned short uEventID, time_t tTime = 0) const;
const cEventInfo *GetEventAround(time_t tTime) const;
2000-10-29 13:17:22 +01:00
const cEventInfo *GetEventNumber(int n) const { return Events.Get(n); }
int NumEvents(void) const { return Events.Count(); }
void Dump(FILE *f, const char *Prefix = "") const;
2002-02-23 17:11:19 +01:00
static bool Read(FILE *f, cSchedules *Schedules);
2000-10-29 13:17:22 +01:00
};
2000-10-29 13:17:22 +01:00
class cSchedules : public cList<cSchedule> {
2002-02-23 17:11:19 +01:00
friend class cSchedule;
2000-10-29 13:17:22 +01:00
friend class cSIProcessor;
private:
const cSchedule *pCurrentSchedule;
tChannelID currentChannelID;
2000-10-29 13:17:22 +01:00
protected:
const cSchedule *AddChannelID(tChannelID channelid);
const cSchedule *SetCurrentChannelID(tChannelID channelid);
2000-10-29 13:17:22 +01:00
void Cleanup();
public:
2000-10-29 13:17:22 +01:00
cSchedules(void);
~cSchedules();
const cSchedule *GetSchedule(tChannelID channelid) const;
2000-10-29 13:17:22 +01:00
const cSchedule *GetSchedule(void) const;
void Dump(FILE *f, const char *Prefix = "") const;
2002-02-23 17:11:19 +01:00
static bool Read(FILE *f);
2000-10-29 13:17:22 +01:00
};
2000-10-29 13:17:22 +01:00
typedef struct sip_filter {
2003-02-02 15:49:52 +01:00
unsigned short pid;
2000-10-29 13:17:22 +01:00
u_char tid;
int handle;
bool inuse;
2000-10-29 13:17:22 +01:00
}SIP_FILTER;
class cCaDescriptor;
2000-10-29 13:17:22 +01:00
class cSIProcessor : public cThread {
private:
static int numSIProcessors;
static cSchedules *schedules;
static cMutex schedulesMutex;
static cList<cCaDescriptor> caDescriptors;
static cMutex caDescriptorsMutex;
2001-08-11 09:38:12 +02:00
static const char *epgDataFileName;
static time_t lastDump;
bool masterSIProcessor;
int currentSource;
2002-03-10 12:45:58 +01:00
int currentTransponder;
int statusCount;
int pmtIndex;
int pmtPid;
2000-10-29 13:17:22 +01:00
SIP_FILTER *filters;
char *fileName;
bool active;
2000-10-29 13:17:22 +01:00
void Action(void);
bool AddFilter(unsigned short pid, u_char tid, u_char mask = 0xFF);
2003-02-02 15:49:52 +01:00
bool DelFilter(unsigned short pid, u_char tid);
bool ShutDownFilters(void);
void NewCaDescriptor(struct Descriptor *d, int ServiceId);
public:
2000-10-29 13:17:22 +01:00
cSIProcessor(const char *FileName);
~cSIProcessor();
2001-08-11 09:38:12 +02:00
static void SetEpgDataFileName(const char *FileName);
static const char *GetEpgDataFileName(void);
static const cSchedules *Schedules(cMutexLock &MutexLock);
// Caller must provide a cMutexLock which has to survive the entire
// time the returned cSchedules is accessed. Once the cSchedules is no
// longer used, the cMutexLock must be destroyed.
static int GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data);
///< Gets all CA descriptors for a given channel.
///< Copies all available CA descriptors for the given Source, Transponder and ServiceId
///< into the provided buffer at Data (at most BufSize bytes). Only those CA descriptors
///< are copied that match one of the given CA system IDs.
///< \return Returns the number of bytes copied into Data (0 if no CA descriptors are
///< available), or -1 if BufSize was too small to hold all CA descriptors.
2002-02-23 17:11:19 +01:00
static bool Read(FILE *f = NULL);
2002-08-25 10:49:02 +02:00
static void Clear(void);
void SetStatus(bool On);
void SetCurrentTransponder(int CurrentSource, int CurrentTransponder);
static bool SetCurrentChannelID(tChannelID channelid);
static void TriggerDump(void);
2000-10-29 13:17:22 +01:00
};
#endif