diff --git a/HISTORY b/HISTORY index 2debe99b..da4473c6 100644 --- a/HISTORY +++ b/HISTORY @@ -3491,3 +3491,6 @@ Video Disk Recorder Revision History Reinhard Nissl). - Fixed a bug in libsi's SubtitlingDescriptor::getLength() (thanks to Marco Schlüßler). +- When reading the channels.conf file, duplicate channels (i.e. ones that have + the same channel ID) are now automatically deleted and only the first one is + actually stored. diff --git a/channels.c b/channels.c index 3392d9aa..9f1a35ad 100644 --- a/channels.c +++ b/channels.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.c 1.36 2005/03/19 15:56:38 kls Exp $ + * $Id: channels.c 1.37 2005/05/06 13:46:57 kls Exp $ */ #include "channels.h" @@ -648,7 +648,7 @@ cString cChannel::ToText(void) const return ToText(this); } -bool cChannel::Parse(const char *s, bool AllowNonUniqueID) +bool cChannel::Parse(const char *s) { bool ok = true; if (*s == ':') { @@ -791,10 +791,6 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID) esyslog("ERROR: channel data results in invalid ID!"); return false; } - if (!AllowNonUniqueID && Channels.GetByChannelID(GetChannelID())) { - esyslog("ERROR: channel data not unique!"); - return false; - } } else return false; @@ -817,9 +813,30 @@ cChannels::cChannels(void) modified = CHANNELSMOD_NONE; } +void cChannels::DeleteDuplicateChannels(void) +{ + for (cChannel *channel = First(); channel; channel = Next(channel)) { + if (!channel->GroupSep()) { + tChannelID ChannelID = channel->GetChannelID(); + cChannel *other = Next(channel); + while (other) { + cChannel *d = NULL; + if (!other->GroupSep() && other->GetChannelID() == ChannelID) + d = other; + other = Next(other); + if (d) { + dsyslog("deleting duplicate channel %s", *d->ToText()); + Del(d); + } + } + } + } +} + bool cChannels::Load(const char *FileName, bool AllowComments, bool MustExist) { if (cConfig::Load(FileName, AllowComments, MustExist)) { + DeleteDuplicateChannels(); ReNumber(); return true; } diff --git a/channels.h b/channels.h index e94be176..763919f5 100644 --- a/channels.h +++ b/channels.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.h 1.26 2005/02/20 14:05:24 kls Exp $ + * $Id: channels.h 1.27 2005/05/06 13:47:06 kls Exp $ */ #ifndef __CHANNELS_H @@ -135,7 +135,7 @@ public: ~cChannel(); cChannel& operator= (const cChannel &Channel); cString ToText(void) const; - bool Parse(const char *s, bool AllowNonUniqueID = false); + bool Parse(const char *s); bool Save(FILE *f); const char *Name(void) const { return name; } const char *ShortName(bool OrName = false) const { return (OrName && isempty(shortName)) ? name : shortName; } @@ -198,6 +198,7 @@ private: int maxNumber; int modified; int beingEdited; + void DeleteDuplicateChannels(void); public: cChannels(void); bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false); diff --git a/svdrp.c b/svdrp.c index 71015023..5104026f 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.69 2005/03/20 15:04:00 kls Exp $ + * $Id: svdrp.c 1.70 2005/05/06 13:47:39 kls Exp $ */ #include "svdrp.h" @@ -875,7 +875,7 @@ void cSVDRP::CmdMODC(const char *Option) cChannel *channel = Channels.GetByNumber(n); if (channel) { cChannel ch; - if (ch.Parse(tail, true)) { + if (ch.Parse(tail)) { if (Channels.HasUniqueChannelID(&ch, channel)) { *channel = ch; Channels.ReNumber(); @@ -948,7 +948,7 @@ void cSVDRP::CmdNEWC(const char *Option) { if (*Option) { cChannel ch; - if (ch.Parse(Option, true)) { + if (ch.Parse(Option)) { if (Channels.HasUniqueChannelID(&ch)) { cChannel *channel = new cChannel; *channel = ch;