summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS2
-rw-r--r--HISTORY3
-rw-r--r--epg.c33
-rw-r--r--epg.h8
-rw-r--r--svdrp.c70
5 files changed, 102 insertions, 14 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index bc19b3ea..3ffb5c96 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -279,6 +279,8 @@ Andy Grobb <Charly98@01019freenet.de>
Thomas Heiligenmann <thomas@heiligenmann.de>
for implementing the SVDRP commands LSTR and DELR
for adding MPEG1 handling to cDvbDevice::StillPicture()
+ for extending the SVDRP command LSTE to allow limiting the listed data to a given
+ channel, the present or following events, or events at a given time
Norbert Schmidt <nschmidt-nrw@t-online.de>
for filling in some missing teletext PIDs
diff --git a/HISTORY b/HISTORY
index 84878be6..a66d29eb 100644
--- a/HISTORY
+++ b/HISTORY
@@ -2696,3 +2696,6 @@ Video Disk Recorder Revision History
in preparation for full VPS support for timers (provided the tv stations
actually broadcast this information). Currently these are just displayed in
the event page if they exist and are different than the event's start time.
+- Extended the SVDRP command LSTE to allow limiting the listed data to a given
+ channel, the present or following events, or events at a given time (thanks to
+ Thomas Heiligenmann).
diff --git a/epg.c b/epg.c
index 05a8713a..ce839751 100644
--- a/epg.c
+++ b/epg.c
@@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
- * $Id: epg.c 1.12 2004/02/22 13:55:12 kls Exp $
+ * $Id: epg.c 1.13 2004/02/22 14:41:37 kls Exp $
*/
#include "epg.h"
@@ -552,13 +552,34 @@ void cSchedule::Cleanup(time_t Time)
}
}
-void cSchedule::Dump(FILE *f, const char *Prefix) const
+void cSchedule::Dump(FILE *f, const char *Prefix, eDumpMode DumpMode, time_t AtTime) const
{
cChannel *channel = Channels.GetByChannelID(channelID, true);
if (channel) {
fprintf(f, "%sC %s %s\n", Prefix, channel->GetChannelID().ToString(), channel->Name());
- for (cEvent *p = events.First(); p; p = events.Next(p))
- p->Dump(f, Prefix);
+ const cEvent *p;
+ switch (DumpMode) {
+ case dmAll: {
+ for (p = events.First(); p; p = events.Next(p))
+ p->Dump(f, Prefix);
+ }
+ break;
+ case dmPresent: {
+ if ((p = GetPresentEvent()) != NULL)
+ p->Dump(f, Prefix);
+ }
+ break;
+ case dmFollowing: {
+ if ((p = GetFollowingEvent()) != NULL)
+ p->Dump(f, Prefix);
+ }
+ break;
+ case dmAtTime: {
+ if ((p = GetEventAround(AtTime)) != NULL)
+ p->Dump(f, Prefix);
+ }
+ break;
+ }
fprintf(f, "%sc\n", Prefix);
}
}
@@ -682,13 +703,13 @@ bool cSchedules::ClearAll(void)
return false;
}
-bool cSchedules::Dump(FILE *f, const char *Prefix)
+bool cSchedules::Dump(FILE *f, const char *Prefix, eDumpMode DumpMode, time_t AtTime)
{
cSchedulesLock SchedulesLock;
cSchedules *s = (cSchedules *)Schedules(SchedulesLock);
if (s) {
for (cSchedule *p = s->First(); p; p = s->Next(p))
- p->Dump(f, Prefix);
+ p->Dump(f, Prefix, DumpMode, AtTime);
return true;
}
return false;
diff --git a/epg.h b/epg.h
index 9cdd6ef3..8b6067d1 100644
--- a/epg.h
+++ b/epg.h
@@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
- * $Id: epg.h 1.9 2004/02/22 13:52:46 kls Exp $
+ * $Id: epg.h 1.10 2004/02/22 14:34:04 kls Exp $
*/
#ifndef __EPG_H
@@ -19,6 +19,8 @@
#define MAXEPGBUGFIXLEVEL 2
+enum eDumpMode { dmAll, dmPresent, dmFollowing, dmAtTime };
+
class cSchedule;
class cEvent : public cListObject {
@@ -89,7 +91,7 @@ public:
const cEvent *GetEventAround(time_t Time) const;
const cEvent *GetEventNumber(int n) const { return events.Get(n); }
int NumEvents(void) const { return events.Count(); }
- void Dump(FILE *f, const char *Prefix = "") const;
+ void Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0) const;
static bool Read(FILE *f, cSchedules *Schedules);
};
@@ -120,7 +122,7 @@ public:
static void Cleanup(bool Force = false);
static void ResetVersions(void);
static bool ClearAll(void);
- static bool Dump(FILE *f, const char *Prefix = "");
+ static bool Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0);
static bool Read(FILE *f = NULL);
cSchedule *AddSchedule(tChannelID ChannelID);
const cSchedule *GetSchedule(tChannelID ChannelID) const;
diff --git a/svdrp.c b/svdrp.c
index 4ade5ec9..f55ad557 100644
--- a/svdrp.c
+++ b/svdrp.c
@@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
- * $Id: svdrp.c 1.59 2004/01/31 10:13:50 kls Exp $
+ * $Id: svdrp.c 1.60 2004/02/22 15:31:23 kls Exp $
*/
#include "svdrp.h"
@@ -205,8 +205,12 @@ const char *HelpPages[] = {
" List channels. Without option, all channels are listed. Otherwise\n"
" only the given channel is listed. If a name is given, all channels\n"
" containing the given string as part of their name are listed.",
- "LSTE\n"
- " List EPG data.",
+ "LSTE [ <channel> ] [ now | next | at <time> ]\n"
+ " List EPG data. Without any parameters all data of all channels is\n"
+ " listed. If a channel is given (either by number of by channel ID),\n",
+ " only data for that channel is listed. 'now', 'next', or 'at <time>'\n"
+ " restricts the returned data to present events, following events, or\n"
+ " events at the given time (which must be in time_t form)."
"LSTR [ <number> ]\n"
" List recordings. Without option, all recordings are listed. Otherwise\n"
" the summary for the given recording is listed.",
@@ -714,9 +718,65 @@ void cSVDRP::CmdLSTE(const char *Option)
cSchedulesLock SchedulesLock;
const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock);
if (Schedules) {
+ const cSchedule* Schedule = NULL;
+ eDumpMode DumpMode = dmAll;
+ time_t AtTime = 0;
+ if (*Option) {
+ char buf[strlen(Option) + 1];
+ strcpy(buf, Option);
+ const char *delim = " \t";
+ char *p = strtok(buf, delim);
+ while (p && DumpMode == dmAll) {
+ if (strcasecmp(p, "NOW") == 0)
+ DumpMode = dmPresent;
+ else if (strcasecmp(p, "NEXT") == 0)
+ DumpMode = dmFollowing;
+ else if (strcasecmp(p, "AT") == 0) {
+ DumpMode = dmAtTime;
+ if ((p = strtok(NULL, delim)) != NULL) {
+ if (isnumber(p))
+ AtTime = strtol(p, NULL, 10);
+ else {
+ Reply(501, "Invalid time");
+ return;
+ }
+ }
+ else {
+ Reply(501, "Missing time");
+ return;
+ }
+ }
+ else if (!Schedule) {
+ cChannel* Channel = NULL;
+ if (isnumber(p))
+ Channel = Channels.GetByNumber(strtol(Option, NULL, 10));
+ else
+ Channel = Channels.GetByChannelID(tChannelID::FromString(Option));
+ if (Channel) {
+ Schedule = Schedules->GetSchedule(Channel->GetChannelID());
+ if (!Schedule) {
+ Reply(550, "No schedule found");
+ return;
+ }
+ }
+ else {
+ Reply(550, "Channel \"%s\" not defined", p);
+ return;
+ }
+ }
+ else {
+ Reply(501, "Unknown option: \"%s\"", p);
+ return;
+ }
+ p = strtok(NULL, delim);
+ }
+ }
FILE *f = fdopen(file, "w");
if (f) {
- Schedules->Dump(f, "215-");
+ if (Schedule)
+ Schedule->Dump(f, "215-", DumpMode, AtTime);
+ else
+ Schedules->Dump(f, "215-", DumpMode, AtTime);
fflush(f);
Reply(215, "End of EPG data");
// don't 'fclose(f)' here!
@@ -741,7 +801,7 @@ void cSVDRP::CmdLSTR(const char *Option)
free(summary);
}
else
- Reply(550, "No summary availabe");
+ Reply(550, "No summary available");
}
else
Reply(550, "Recording \"%s\" not found", Option);