diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 2a122d57..c457b196 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1006,6 +1006,8 @@ Andreas Mair for fixing the type of MBperMinute in cVideoDiskUsage::HasChanged() for reporting a bug in sorting recordings in case two folders have the same name, but one of them ends in an additional digit, as in "abc" and "abc2" + for reporting multiple occurrences of the same directory in the recordings list ini + case there are directories that only differ in non-alphanumeric characters Olivier Jacques ) for translating OSD texts to the French language diff --git a/HISTORY b/HISTORY index 05469c6e..4213ccdf 100644 --- a/HISTORY +++ b/HISTORY @@ -7494,7 +7494,7 @@ Video Disk Recorder Revision History use it. - Added maximum SNR value for PCTV Systems PCTV 73ESE (thanks to Cedric Dewijs). -2013-01-15: Version 1.7.36 +2013-01-16: Version 1.7.36 - Added maximum SNR value for PCTV Systems nanoStick T2 290e (thanks to Antti Hartikainen). @@ -7520,3 +7520,6 @@ Video Disk Recorder Revision History - The SVDRP command LSTR now knows the additional parameter "path", which can be given to get the actual file name of a recording's directory (suggested by Stefan Stolz). +- Fixed multiple occurrences of the same directory in the recordings list in case there + are directories that only differ in non-alphanumeric characters (reported by Andreas + Mair). diff --git a/menu.c b/menu.c index 6c278b55..b42aa4da 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 2.72 2012/12/21 11:11:14 kls Exp $ + * $Id: menu.c 2.73 2013/01/16 15:58:58 kls Exp $ */ #include "menu.h" @@ -2273,7 +2273,6 @@ void cMenuRecordings::Set(bool Refresh) { const char *CurrentRecording = cReplayControl::LastReplayed(); cMenuRecordingItem *LastItem = NULL; - char *LastItemText = NULL; cThreadLock RecordingsLock(&Recordings); if (Refresh) { if (cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current())) @@ -2285,23 +2284,32 @@ void cMenuRecordings::Set(bool Refresh) for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) { if (!base || (strstr(recording->Name(), base) == recording->Name() && recording->Name()[strlen(base)] == FOLDERDELIMCHAR)) { cMenuRecordingItem *Item = new cMenuRecordingItem(recording, level); - if (*Item->Text() && (!Item->IsDirectory() || (!LastItem || !LastItem->IsDirectory() || strcmp(Item->Text(), LastItemText) != 0))) { + cMenuRecordingItem *LastDir = NULL; + if (Item->IsDirectory()) { + // Sorting may ignore non-alphanumeric characters, so we need to explicitly handle directories in case they only differ in such characters: + for (cMenuRecordingItem *p = LastItem; p; p = dynamic_cast(p->Prev())) { + if (p->Name() && strcmp(p->Name(), Item->Name()) == 0) { + LastDir = p; + break; + } + } + } + if (*Item->Text() && !LastDir) { Add(Item); LastItem = Item; - free(LastItemText); - LastItemText = strdup(LastItem->Text()); // must use a copy because of the counters! + if (Item->IsDirectory()) + LastDir = Item; } else delete Item; if (LastItem) { if (CurrentRecording && strcmp(CurrentRecording, recording->FileName()) == 0) SetCurrent(LastItem); - if (LastItem->IsDirectory()) - LastItem->IncrementCounter(recording->IsNew()); } + if (LastDir) + LastDir->IncrementCounter(recording->IsNew()); } } - free(LastItemText); if (Refresh) Display(); }