summaryrefslogtreecommitdiff
path: root/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'cache.c')
-rw-r--r--cache.c232
1 files changed, 232 insertions, 0 deletions
diff --git a/cache.c b/cache.c
new file mode 100644
index 0000000..66f1bef
--- /dev/null
+++ b/cache.c
@@ -0,0 +1,232 @@
+/*
+ * cache.c
+ */
+
+#include "cache.h"
+#include "audiorecorder.h"
+
+#include <vdr/skins.h>
+#include <vdr/tools.h>
+
+
+#define CACHEFILE "cache.xml"
+
+using namespace std;
+
+cCache Cache;
+
+/* --- cCache --------------------------------------------------------------- */
+
+const cColumn *cCache::sort_order = NULL;
+
+cCache::cCache()
+:cThread()
+{
+ what_to_do = 0;
+ active = false;
+}
+
+
+cCache::~cCache()
+{
+ Activate(false);
+}
+
+
+void cCache::Activate(bool on)
+{
+ if (on) {
+ if (! active) {
+ active = true;
+ Start();
+ }
+ }
+ else if (active) {
+ active = false;
+ Cancel(0);
+ }
+}
+
+
+void cCache::Action(void)
+{
+ if (what_to_do & REBUILD) {
+ dsyslog("[audiorecorder]: rebuilding cache thread started (%s, %s())",
+ __FILE__, __func__);
+
+ Lock();
+ tracklist.clear();
+ xmlcache.rebuild();
+ Unlock();
+
+ Skins.QueueMessage(mtInfo, tr("Audiorecorder: rebuilding cache finished"));
+ dsyslog("[audiorecorder]: rebuilding cache thread finished (%s, %s())",
+ __FILE__, __func__);
+
+ what_to_do ^= REBUILD;
+
+ active = false;
+ } else if (what_to_do & LOAD) {
+ string path = cPluginAudiorecorder::get_recdir();
+ path.append(CACHEFILE);
+
+ Lock();
+ xmlcache.load(path);
+ Unlock();
+ Skins.QueueMessage(mtInfo, tr("Audiorecorder: loading of cache finished"));
+ dsyslog("[audiorecorder]: loading of cache finished (%s, %s())",
+ __FILE__, __func__);
+
+ what_to_do ^= LOAD;
+ active = false;
+ }
+}
+
+/*
+void cCache::load()
+{
+ string path = cPluginAudiorecorder::get_recdir();
+ path.append(CACHEFILE);
+
+ Lock();
+ xmlcache.load(path);
+ Unlock();
+}
+*/
+
+void cCache::sort(const cColumn *columns)
+{
+ if (! columns)
+ return;
+
+ sort_order = columns;
+
+ Lock();
+ tracklist.sort(cCache::sort_tracklist);
+ Unlock();
+}
+
+
+void cCache::add_track(const cTrackInfo &trackinfo, bool add_xmlcache)
+{
+ if (trackinfo.get_artist().empty() || trackinfo.get_title().empty())
+ return;
+
+ Lock();
+ tracklist.push_back(trackinfo);
+
+ if (add_xmlcache)
+ xmlcache.add_track(trackinfo);
+ Unlock();
+}
+
+
+int cCache::get_num_cached(void)
+{
+ int num;
+ Lock();
+ num = tracklist.size();
+ Unlock();
+
+ return num;
+}
+
+
+const cTrackInfo *cCache::get_next_track(bool reset)
+{
+ if (reset)
+ track = tracklist.begin();
+
+ if (track == tracklist.end())
+ return NULL;
+
+ cTrackInfo *trackinfo = &(*track);
+ ++track;
+
+ return trackinfo;
+}
+
+
+bool cCache::sort_tracklist(const cTrackInfo &lhs, const cTrackInfo &rhs)
+{
+ for (int c = 0; sort_order[c].get_type() != colEnd; ++c) {
+ switch(sort_order[c].get_type()) {
+ case colArtist:
+ if (lhs.get_artist() > rhs.get_artist())
+ return false;
+ if (lhs.get_artist() < rhs.get_artist())
+ return true;
+ break;
+ case colTitle:
+ if (lhs.get_title() > rhs.get_title())
+ return false;
+ if (lhs.get_title() < rhs.get_title())
+ return true;
+ break;
+ case colArtistTitle:
+ if (lhs.get_artist() > rhs.get_artist())
+ return false;
+ if (lhs.get_artist() < rhs.get_artist())
+ return true;
+ if (lhs.get_title() > rhs.get_title())
+ return false;
+ if (lhs.get_title() < rhs.get_title())
+ return true;
+ break;
+ case colAlbum:
+ if (lhs.get_album() > rhs.get_album())
+ return false;
+ if (lhs.get_album() < rhs.get_album())
+ return true;
+ break;
+ case colTrack:
+ if (lhs.get_track() > rhs.get_track())
+ return false;
+ if (lhs.get_track() < rhs.get_track())
+ return true;
+ break;
+ case colYear:
+ if (lhs.get_year() > rhs.get_year())
+ return false;
+ if (lhs.get_year() < rhs.get_year())
+ return true;
+ break;
+ case colGenre:
+ if (lhs.get_genre() > rhs.get_genre())
+ return false;
+ if (lhs.get_genre() < rhs.get_genre())
+ return true;
+ break;
+ case colChannel:
+ if (lhs.get_channel() > rhs.get_channel())
+ return false;
+ if (lhs.get_channel() < rhs.get_channel())
+ return true;
+ break;
+ case colEvent:
+ if (lhs.get_event() > rhs.get_event())
+ return false;
+ if (lhs.get_event() < rhs.get_event())
+ return true;
+ break;
+ case colDate:
+ /* up-to-date date's first */
+ if (lhs.get_date() > rhs.get_date())
+ return true;
+ if (lhs.get_date() < rhs.get_date())
+ return false;
+ break;
+ case colTime:
+ /* up-to-date time's first */
+ if (lhs.get_time() > rhs.get_time())
+ return true;
+ if (lhs.get_time() < rhs.get_time())
+ return false;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return false;
+}