mirror of
https://github.com/taglib/taglib.git
synced 2025-05-27 21:20:26 -04:00
the directory and moving things to it in the same commit. git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@588014 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
178 lines
4.8 KiB
C++
178 lines
4.8 KiB
C++
/***************************************************************************
|
|
copyright : (C) 2003 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 *
|
|
***************************************************************************/
|
|
|
|
#include <tfile.h>
|
|
#include <tstring.h>
|
|
|
|
#include "fileref.h"
|
|
#include "mpegfile.h"
|
|
#include "vorbisfile.h"
|
|
#include "flacfile.h"
|
|
#include "mpcfile.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(const char *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("mp3");
|
|
l.append("mpc");
|
|
|
|
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(const char *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 = fileName;
|
|
|
|
// 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 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() - 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);
|
|
}
|
|
|
|
return 0;
|
|
}
|