summaryrefslogtreecommitdiffstats
path: root/noatun-plugins/oblique/file.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'noatun-plugins/oblique/file.cpp')
-rw-r--r--noatun-plugins/oblique/file.cpp248
1 files changed, 248 insertions, 0 deletions
diff --git a/noatun-plugins/oblique/file.cpp b/noatun-plugins/oblique/file.cpp
new file mode 100644
index 0000000..b478e0f
--- /dev/null
+++ b/noatun-plugins/oblique/file.cpp
@@ -0,0 +1,248 @@
+// Copyright (c) 2003-2004 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "file.h"
+#include "selector.h"
+#include "query.h"
+
+#include <iostream>
+
+#include <klocale.h>
+#include <kfilemetainfo.h>
+#include <kmimetype.h>
+
+
+File::File(Base *base, FileId id)
+{
+ mBase = base;
+ mId = id;
+
+}
+
+File::File(const File &ref)
+{
+ operator =(ref);
+}
+
+File::File()
+{
+ mBase=0;
+ mId = 0;
+}
+
+File &File::operator=(const File &ref)
+{
+ mBase = ref.mBase;
+ mId = ref.mId;
+
+ return *this;
+}
+
+QString File::file() const
+{
+ return property("file");
+}
+
+KURL File::url() const
+{
+ KURL url;
+ url.setPath(file());
+ return url;
+}
+
+struct Map { const char *kfmi; const char *noatun; };
+static const Map propertyMap[] =
+{
+ { "Title", "ob::title_" },
+ { "Artist", "ob::author_" },
+ { "Album", "ob::album_" },
+ { "Genre", "ob::genre_" },
+ { "Tracknumber", "ob::track_" },
+ { "Date", "ob::date_" },
+ { "Comment", "ob::comment_" },
+ { "Location", "ob::location_" },
+ { "Organization", "ob::organization_" },
+ { "Bitrate", "ob::bitrate_" },
+ { "Sample Rate", "ob::samplerate_" },
+ { "Channels", "ob::channels_" },
+ { 0, 0 }
+};
+
+QString File::property(const QString &property) const
+{
+ QString str = base()->property(id(), property);
+
+ if (!str)
+ {
+ QString mangled = "ob::" + property + "_";
+ str = base()->property(id(), mangled);
+ }
+
+ return str;
+}
+
+
+void File::makeCache()
+{
+ setProperty("ob::mimetype_", KMimeType::findByPath(file())->name());
+ KFileMetaInfo info(file());
+
+ for (int i=0; propertyMap[i].kfmi; i++)
+ {
+ QString kname(propertyMap[i].kfmi);
+ if (info.isValid() && kname.length())
+ {
+ QString val = info.item(kname).string(false);
+ if (val=="---" || !val.stripWhiteSpace().length())
+ { // grr
+ val = "";
+ }
+ if (val.length())
+ {
+ setProperty(propertyMap[i].noatun, val);
+ }
+ }
+ }
+}
+
+
+void File::setProperty(const QString &key, const QString &value)
+{
+ if (property(key) == value) return;
+ base()->setProperty(id(), key, value);
+ PlaylistItem p=new Item(*this);
+ p.data()->modified();
+}
+
+void File::clearProperty(const QString &key)
+{
+ if (property(key).isNull()) return;
+ base()->clearProperty(id(), key);
+ PlaylistItem p=new Item(*this);
+ p.data()->modified();
+}
+
+QStringList File::properties() const
+{
+ QStringList l = base()->properties(id());
+
+ for (int i=0; propertyMap[i].noatun; i++)
+ {
+ if (property(propertyMap[i].noatun).length())
+ {
+ l += propertyMap[i].noatun;
+ }
+ }
+ return l;
+}
+
+void File::setId(FileId id)
+{
+ base()->move(mId, id);
+ mId = id;
+}
+
+
+void File::setPosition(Query *query, const File &after)
+{
+ setProperty(
+ "Oblique:after_" + query->name() + '_',
+ QString::number(after.id())
+ );
+}
+
+bool File::getPosition(const Query *query, File *after) const
+{
+ assert(query);
+ assert(after);
+ QString name = "Oblique:after_" + query->name() + '_';
+ if (name.isEmpty()) return false;
+
+ QString val = property(name);
+ if (val.isEmpty())
+ return false;
+ *after = File(mBase, val.toUInt());
+ return true;
+}
+
+
+void File::remove()
+{
+ PlaylistItem p=new Item(*this);
+ p.data()->removed();
+ mBase->remove(*this);
+}
+
+void File::addTo(Slice *slice)
+{
+ QString slices = property("Oblique:slices_");
+ slices += "\n" + QString::number(slice->id(), 16);
+ setProperty("Oblique:slices_", slices);
+ emit mBase->addedTo(slice, *this);
+}
+
+void File::removeFrom(Slice *slice)
+{
+ QString slices = property("Oblique:slices_");
+ QStringList sliceList = QStringList::split('\n', slices);
+ QString sid = QString::number(slice->id(), 16);
+ sliceList.remove(sid);
+
+ slices = sliceList.join("\n");
+ setProperty("Oblique:slices_", slices);
+ emit mBase->removedFrom(slice, *this);
+}
+
+bool File::isIn(const Slice *slice) const
+{
+ int id = slice->id();
+ if (id==0) return true;
+
+ QString slices = property("Oblique:slices_");
+ QStringList sliceList = QStringList::split('\n', slices);
+ for (QStringList::Iterator i(sliceList.begin()); i!= sliceList.end(); ++i)
+ {
+ if ((*i).toInt(0, 16) == id) return true;
+ }
+ return false;
+}
+
+
+
+Slice::Slice(Base *base, int id, const QString &name)
+{
+ mId = id;
+ mBase = base;
+ mName = name;
+}
+
+QString Slice::name() const
+{
+ if (mId == 0) return i18n("Complete Collection");
+ return mName;
+}
+
+void Slice::setName(const QString &name)
+{
+ if (mId == 0) return;
+ mName = name;
+ emit mBase->slicesModified();
+}
+
+void Slice::remove()
+{
+ if (mId == 0) return;
+ mBase->removeSlice(this);
+ Base *base = mBase;
+
+ for (FileId fi=1; ; fi++)
+ {
+ File f = base->first(fi);
+ f.removeFrom(this);
+ fi = f.id();
+ }
+ emit base->slicesModified();
+}
+
+
+