// Copyright (c) 2003-2004 Charles Samuels // See the file COPYING for redistribution terms. #include "file.h" #include "selector.h" #include "query.h" #include #include #include #include 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; } TQString 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 } }; TQString File::property(const TQString &property) const { TQString str = base()->property(id(), property); if (!str) { TQString 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++) { TQString kname(propertyMap[i].kfmi); if (info.isValid() && kname.length()) { TQString 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 TQString &key, const TQString &value) { if (property(key) == value) return; base()->setProperty(id(), key, value); PlaylistItem p=new Item(*this); p.data()->modified(); } void File::clearProperty(const TQString &key) { if (property(key).isNull()) return; base()->clearProperty(id(), key); PlaylistItem p=new Item(*this); p.data()->modified(); } TQStringList File::properties() const { TQStringList 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() + '_', TQString::number(after.id()) ); } bool File::getPosition(const Query *query, File *after) const { assert(query); assert(after); TQString name = "Oblique:after_" + query->name() + '_'; if (name.isEmpty()) return false; TQString 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) { TQString slices = property("Oblique:slices_"); slices += "\n" + TQString::number(slice->id(), 16); setProperty("Oblique:slices_", slices); emit mBase->addedTo(slice, *this); } void File::removeFrom(Slice *slice) { TQString slices = property("Oblique:slices_"); TQStringList sliceList = TQStringList::split('\n', slices); TQString sid = TQString::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; TQString slices = property("Oblique:slices_"); TQStringList sliceList = TQStringList::split('\n', slices); for (TQStringList::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 TQString &name) { mId = id; mBase = base; mName = name; } TQString Slice::name() const { if (mId == 0) return i18n("Complete Collection"); return mName; } void Slice::setName(const TQString &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(); }