diff options
author | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2008-01-13 18:00:00 +0100 |
---|---|---|
committer | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2008-01-13 18:00:00 +0100 |
commit | fc4c8740a72e6c7cea5a001e19fdacb63c3cc538 (patch) | |
tree | 6ab0ae16b8d588e34d86f8a1a69c101ce8ba2809 /PLUGINS/src/pictures/entry.c | |
parent | 29b2d48bb53df75f1cb978e72bc709a6658d6e5c (diff) | |
download | vdr-patch-lnbsharing-fc4c8740a72e6c7cea5a001e19fdacb63c3cc538.tar.gz vdr-patch-lnbsharing-fc4c8740a72e6c7cea5a001e19fdacb63c3cc538.tar.bz2 |
Version 1.5.13vdr-1.5.13
- Fixed the declaration of cSubtitleObject::Decode8BppCodeString() (thanks to
Gregoire Favre).
- The new setup option "Miscellaneous/Emergency exit" can be used to turn off
the automatic restart of VDR in case a recording fails for some reason.
- The kInfo key is now propagated to any open menu, so that it can react to it
in a context sensitive manner (suggested by Andreas Brugger). If there is
no menu open it will show the info of the current broadcast or replay.
- cTimeMs now uses the monotonic clock, if available (thanks to Petri Hintukainen).
- Fixed cVector::Clear() and cStringList::Clear().
- Added cString::Truncate().
- Fixed the "i18n:" target in the "newplugin" script, so that it can create the
initial *.pot file.
- Fixed handling the '-l' option.
- Fixed error handling in cCuttingThread::Action() (thanks to Udo Richter).
- Fixed a loss of the date display in the "classic" skin's main menu (reported by
Andreas Brugger).
- Added a missing setting of lastFreeMB in cMenuMain::Update() (reported by
Andreas Brugger).
- Added '-Wno-parentheses' to the compiler options in order to avoid silly compiler
warnings for expressions like 'a || b && c', where GCC 4.3 wants to force the
programmer to write 'a || (b && c)', while everybody knows that '&&' links
stronger than '||' (reported by Tobias Grimm).
- Updated the Hungarian language texts (thanks to István Füley).
- Fixed displaying weekday names in the Schedule menu if the system uses UTF-8
(reported by Jiri Dobry).
- The new plugin "pictures" implements a simple picture viewer.
See PLUGINS/src/pictures/README for details.
- The automatic shutdown is now suppressed if the remote control is currently
disabled (suggested by Helmut Auer, implemented by Udo Richter).
- Added a section about "Logging" to PLUGINS.html (suggested by Torsten Kunkel).
- Enhanced the SVDRP command CLRE to allow clearing the EPG data of a particular
channel (thanks to Benjamin Hess).
Diffstat (limited to 'PLUGINS/src/pictures/entry.c')
-rw-r--r-- | PLUGINS/src/pictures/entry.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/PLUGINS/src/pictures/entry.c b/PLUGINS/src/pictures/entry.c new file mode 100644 index 0000000..006a359 --- /dev/null +++ b/PLUGINS/src/pictures/entry.c @@ -0,0 +1,144 @@ +/* + * entry.c: Data structure to handle still pictures + * + * See the README file for copyright information and how to reach the author. + * + * $Id: entry.c 1.1 2008/01/06 09:52:41 kls Exp $ + */ + +#include "entry.h" + +cPictureEntry::cPictureEntry(const char *Name, const cPictureEntry *Parent, bool IsDirectory) +{ + name = strdup(Name); + parent = Parent; + isDirectory = IsDirectory; + entries = NULL; +} + +cPictureEntry::~cPictureEntry() +{ + free(name); + delete entries; +} + +int cPictureEntry::Compare(const cListObject &ListObject) const +{ + cPictureEntry *p = (cPictureEntry *)&ListObject; + if (IsDirectory() && !p->IsDirectory()) + return -1; + if (!IsDirectory() && p->IsDirectory()) + return +1; + if (IsDirectory()) + return strcoll(name, p->name); + else + return strcmp(name, p->name); // correctly sorts dsc01234.jpg and dsc01234a.jpg in case pictures have been "squeezed in" +} + +cString cPictureEntry::Path(void) const +{ + return parent ? AddDirectory(parent->Path(), name) : name; +} + +void cPictureEntry::Load(void) const +{ + if (isDirectory && !entries) { + cString Directory = Path(); + cReadDir d(Directory); + if (d.Ok()) { + struct dirent *e; + while ((e = d.Next()) != NULL) { + if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) { + struct stat ds; + if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) { + if (!entries) + entries = new cList<cPictureEntry>; + entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode))); + } + } + } + if (entries) + entries->Sort(); + } + else + LOG_ERROR_STR(*Directory); + } +} + +const cList<cPictureEntry> *cPictureEntry::Entries(void) const +{ + Load(); + return entries; +} + +const cPictureEntry *cPictureEntry::FirstPicture(void) const +{ + Load(); + if (entries) { + for (cPictureEntry *pe = entries->First(); pe; pe = entries->Next(pe)) { + if (pe->IsDirectory()) { + const cPictureEntry *p = pe->FirstPicture(); + if (p) + return p; + } + else + return pe; + } + } + return NULL; +} + +const cPictureEntry *cPictureEntry::LastPicture(void) const +{ + Load(); + if (entries) { + for (cPictureEntry *pe = entries->Last(); pe; pe = entries->Prev(pe)) { + if (pe->IsDirectory()) { + const cPictureEntry *p = pe->LastPicture(); + if (p) + return p; + } + else + return pe; + } + } + return NULL; +} + +const cPictureEntry *cPictureEntry::PrevPicture(const cPictureEntry *This) const +{ + if (This) { + const cPictureEntry *pe = (cPictureEntry *)entries->Prev(This); + if (pe) { + if (pe->IsDirectory()) { + const cPictureEntry *p = pe->LastPicture(); + if (p) + return p; + return PrevPicture(pe); + } + return pe; + } + } + if (parent) + return parent->PrevPicture(this); + return NULL; +} + +const cPictureEntry *cPictureEntry::NextPicture(const cPictureEntry *This) const +{ + if (This) { + cPictureEntry *pe = (cPictureEntry *)entries->Next(This); + if (pe) { + if (pe->IsDirectory()) { + const cPictureEntry *p = pe->FirstPicture(); + if (p) + return p; + return NextPicture(pe); + } + return pe; + } + } + if (parent) + return parent->NextPicture(this); + return NULL; +} |