summaryrefslogtreecommitdiff
path: root/libs/taglib/taglib/fileref.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/taglib/taglib/fileref.cpp')
-rw-r--r--libs/taglib/taglib/fileref.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/libs/taglib/taglib/fileref.cpp b/libs/taglib/taglib/fileref.cpp
new file mode 100644
index 0000000000..eee62f2cfc
--- /dev/null
+++ b/libs/taglib/taglib/fileref.cpp
@@ -0,0 +1,203 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library is distributed in the hope that it will be useful, but *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include <tfile.h>
+#include <tstring.h>
+
+#include "fileref.h"
+#include "mpegfile.h"
+#include "vorbisfile.h"
+#include "flacfile.h"
+#include "oggflacfile.h"
+#include "mpcfile.h"
+#include "wavpackfile.h"
+#include "speexfile.h"
+#include "trueaudiofile.h"
+
+using namespace TagLib;
+
+class FileRef::FileRefPrivate : public RefCounter
+{
+public:
+ FileRefPrivate(File *f) : RefCounter(), file(f) {}
+ ~FileRefPrivate() {
+ delete file;
+ }
+
+ File *file;
+ static List<const FileTypeResolver *> fileTypeResolvers;
+};
+
+List<const FileRef::FileTypeResolver *> FileRef::FileRefPrivate::fileTypeResolvers;
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+FileRef::FileRef()
+{
+ d = new FileRefPrivate(0);
+}
+
+FileRef::FileRef(FileName fileName, bool readAudioProperties,
+ AudioProperties::ReadStyle audioPropertiesStyle)
+{
+ d = new FileRefPrivate(create(fileName, readAudioProperties, audioPropertiesStyle));
+}
+
+FileRef::FileRef(File *file)
+{
+ d = new FileRefPrivate(file);
+}
+
+FileRef::FileRef(const FileRef &ref) : d(ref.d)
+{
+ d->ref();
+}
+
+FileRef::~FileRef()
+{
+ if(d->deref())
+ delete d;
+}
+
+Tag *FileRef::tag() const
+{
+ return d->file->tag();
+}
+
+AudioProperties *FileRef::audioProperties() const
+{
+ return d->file->audioProperties();
+}
+
+File *FileRef::file() const
+{
+ return d->file;
+}
+
+bool FileRef::save()
+{
+ return d->file->save();
+}
+
+const FileRef::FileTypeResolver *FileRef::addFileTypeResolver(const FileRef::FileTypeResolver *resolver) // static
+{
+ FileRefPrivate::fileTypeResolvers.prepend(resolver);
+ return resolver;
+}
+
+StringList FileRef::defaultFileExtensions()
+{
+ StringList l;
+
+ l.append("ogg");
+ l.append("flac");
+ l.append("oga");
+ l.append("mp3");
+ l.append("mpc");
+ l.append("wv");
+ l.append("spx");
+ l.append("tta");
+
+ return l;
+}
+
+bool FileRef::isNull() const
+{
+ return !d->file || !d->file->isValid();
+}
+
+FileRef &FileRef::operator=(const FileRef &ref)
+{
+ if(&ref == this)
+ return *this;
+
+ if(d->deref())
+ delete d;
+
+ d = ref.d;
+ d->ref();
+
+ return *this;
+}
+
+bool FileRef::operator==(const FileRef &ref) const
+{
+ return ref.d->file == d->file;
+}
+
+bool FileRef::operator!=(const FileRef &ref) const
+{
+ return ref.d->file != d->file;
+}
+
+File *FileRef::create(FileName fileName, bool readAudioProperties,
+ AudioProperties::ReadStyle audioPropertiesStyle) // static
+{
+
+ List<const FileTypeResolver *>::ConstIterator it = FileRefPrivate::fileTypeResolvers.begin();
+
+ for(; it != FileRefPrivate::fileTypeResolvers.end(); ++it) {
+ File *file = (*it)->createFile(fileName, readAudioProperties, audioPropertiesStyle);
+ if(file)
+ return file;
+ }
+
+ // Ok, this is really dumb for now, but it works for testing.
+
+ String s;
+
+#ifdef _WIN32
+ s = (wcslen((const wchar_t *) fileName) > 0) ? String((const wchar_t *) fileName) : String((const char *) fileName);
+#else
+ s = fileName;
+#endif
+
+ // If this list is updated, the method defaultFileExtensions() should also be
+ // updated. However at some point that list should be created at the same time
+ // that a default file type resolver is created.
+
+ if(s.size() > 4) {
+ if(s.substr(s.size() - 4, 4).upper() == ".OGG")
+ return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle);
+ if(s.substr(s.size() - 4, 4).upper() == ".MP3")
+ return new MPEG::File(fileName, readAudioProperties, audioPropertiesStyle);
+ if(s.substr(s.size() - 4, 4).upper() == ".OGA")
+ return new Ogg::FLAC::File(fileName, readAudioProperties, audioPropertiesStyle);
+ if(s.substr(s.size() - 5, 5).upper() == ".FLAC")
+ return new FLAC::File(fileName, readAudioProperties, audioPropertiesStyle);
+ if(s.substr(s.size() - 4, 4).upper() == ".MPC")
+ return new MPC::File(fileName, readAudioProperties, audioPropertiesStyle);
+ if(s.substr(s.size() - 3, 3).upper() == ".WV")
+ return new WavPack::File(fileName, readAudioProperties, audioPropertiesStyle);
+ if(s.substr(s.size() - 4, 4).upper() == ".SPX")
+ return new Ogg::Speex::File(fileName, readAudioProperties, audioPropertiesStyle);
+ if(s.substr(s.size() - 4, 4).upper() == ".TTA")
+ return new TrueAudio::File(fileName, readAudioProperties, audioPropertiesStyle);
+ }
+
+ return 0;
+}