diff options
-rw-r--r-- | CONTRIBUTORS | 2 | ||||
-rw-r--r-- | HISTORY | 3 | ||||
-rw-r--r-- | epg.c | 33 | ||||
-rw-r--r-- | epg.h | 8 | ||||
-rw-r--r-- | svdrp.c | 70 |
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 @@ -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). @@ -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; @@ -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; @@ -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); |