From b029725c989022fcfcf2ff775b3a15d224a6539d Mon Sep 17 00:00:00 2001 From: overwriter <49340226+s12mmm3@users.noreply.github.com> Date: Wed, 7 Feb 2024 21:44:20 +0800 Subject: [PATCH] refactor: use CMake for build Co-authored-by: TaurusXin --- .gitmodules | 3 + CMakeLists.txt | 39 ++ ncmcrypt.cpp | 11 +- taglib | 1 + taglib/bin/taglib-config.cmd | 36 - taglib/include/taglib/aifffile.h | 157 ----- taglib/include/taglib/aiffproperties.h | 166 ----- taglib/include/taglib/apefile.h | 235 ------- taglib/include/taglib/apefooter.h | 173 ----- taglib/include/taglib/apeitem.h | 219 ------ taglib/include/taglib/apeproperties.h | 143 ---- taglib/include/taglib/apetag.h | 208 ------ taglib/include/taglib/asfattribute.h | 205 ------ taglib/include/taglib/asffile.h | 134 ---- taglib/include/taglib/asfpicture.h | 222 ------ taglib/include/taglib/asfproperties.h | 181 ----- taglib/include/taglib/asftag.h | 211 ------ taglib/include/taglib/attachedpictureframe.h | 230 ------- taglib/include/taglib/audioproperties.h | 127 ---- taglib/include/taglib/chapterframe.h | 249 ------- taglib/include/taglib/commentsframe.h | 179 ----- taglib/include/taglib/eventtimingcodesframe.h | 185 ----- taglib/include/taglib/fileref.h | 297 -------- taglib/include/taglib/flacfile.h | 343 ---------- taglib/include/taglib/flacmetadatablock.h | 70 -- taglib/include/taglib/flacpicture.h | 203 ------ taglib/include/taglib/flacproperties.h | 148 ---- .../taglib/generalencapsulatedobjectframe.h | 179 ----- taglib/include/taglib/id3v1genres.h | 66 -- taglib/include/taglib/id3v1tag.h | 202 ------ taglib/include/taglib/id3v2.h | 24 - taglib/include/taglib/id3v2extendedheader.h | 93 --- taglib/include/taglib/id3v2footer.h | 82 --- taglib/include/taglib/id3v2frame.h | 523 --------------- taglib/include/taglib/id3v2framefactory.h | 169 ----- taglib/include/taglib/id3v2header.h | 176 ----- taglib/include/taglib/id3v2synchdata.h | 70 -- taglib/include/taglib/id3v2tag.h | 411 ------------ taglib/include/taglib/infotag.h | 193 ------ taglib/include/taglib/itfile.h | 109 --- taglib/include/taglib/itproperties.h | 107 --- taglib/include/taglib/modfile.h | 109 --- taglib/include/taglib/modfilebase.h | 61 -- taglib/include/taglib/modproperties.h | 66 -- taglib/include/taglib/modtag.h | 189 ------ taglib/include/taglib/mp4atom.h | 107 --- taglib/include/taglib/mp4coverart.h | 79 --- taglib/include/taglib/mp4file.h | 160 ----- taglib/include/taglib/mp4item.h | 88 --- taglib/include/taglib/mp4properties.h | 115 ---- taglib/include/taglib/mp4tag.h | 164 ----- taglib/include/taglib/mpcfile.h | 238 ------- taglib/include/taglib/mpcproperties.h | 158 ----- taglib/include/taglib/mpegfile.h | 387 ----------- taglib/include/taglib/mpegheader.h | 178 ----- taglib/include/taglib/mpegproperties.h | 152 ----- taglib/include/taglib/oggfile.h | 127 ---- taglib/include/taglib/oggflacfile.h | 170 ----- taglib/include/taglib/oggpage.h | 228 ------- taglib/include/taglib/oggpageheader.h | 232 ------- taglib/include/taglib/opusfile.h | 138 ---- taglib/include/taglib/opusproperties.h | 134 ---- taglib/include/taglib/ownershipframe.h | 151 ----- taglib/include/taglib/podcastframe.h | 82 --- taglib/include/taglib/popularimeterframe.h | 132 ---- taglib/include/taglib/privateframe.h | 111 --- taglib/include/taglib/relativevolumeframe.h | 274 -------- taglib/include/taglib/rifffile.h | 161 ----- taglib/include/taglib/s3mfile.h | 112 --- taglib/include/taglib/s3mproperties.h | 94 --- taglib/include/taglib/speexfile.h | 138 ---- taglib/include/taglib/speexproperties.h | 129 ---- .../include/taglib/synchronizedlyricsframe.h | 231 ------- taglib/include/taglib/tableofcontentsframe.h | 260 ------- taglib/include/taglib/tag.h | 201 ------ taglib/include/taglib/tag_c.h | 299 --------- taglib/include/taglib/taglib.h | 179 ----- taglib/include/taglib/taglib_config.h | 11 - taglib/include/taglib/taglib_export.h | 43 -- taglib/include/taglib/tbytevector.h | 635 ------------------ taglib/include/taglib/tbytevectorlist.h | 91 --- taglib/include/taglib/tbytevectorstream.h | 145 ---- taglib/include/taglib/tdebuglistener.h | 74 -- .../include/taglib/textidentificationframe.h | 313 --------- taglib/include/taglib/tfile.h | 323 --------- taglib/include/taglib/tfilestream.h | 159 ----- taglib/include/taglib/tiostream.h | 170 ----- taglib/include/taglib/tlist.h | 270 -------- taglib/include/taglib/tlist.tcc | 323 --------- taglib/include/taglib/tmap.h | 212 ------ taglib/include/taglib/tmap.tcc | 206 ------ taglib/include/taglib/tpropertymap.h | 256 ------- taglib/include/taglib/trefcounter.h | 114 ---- taglib/include/taglib/trueaudiofile.h | 259 ------- taglib/include/taglib/trueaudioproperties.h | 131 ---- taglib/include/taglib/tstring.h | 580 ---------------- taglib/include/taglib/tstringlist.h | 115 ---- .../taglib/uniquefileidentifierframe.h | 123 ---- taglib/include/taglib/unknownframe.h | 79 --- .../taglib/unsynchronizedlyricsframe.h | 179 ----- taglib/include/taglib/urllinkframe.h | 190 ------ taglib/include/taglib/vorbisfile.h | 157 ----- taglib/include/taglib/vorbisproperties.h | 160 ----- taglib/include/taglib/wavfile.h | 215 ------ taglib/include/taglib/wavpackfile.h | 223 ------ taglib/include/taglib/wavpackproperties.h | 149 ---- taglib/include/taglib/wavproperties.h | 163 ----- taglib/include/taglib/xingheader.h | 129 ---- taglib/include/taglib/xiphcomment.h | 280 -------- taglib/include/taglib/xmfile.h | 112 --- taglib/include/taglib/xmproperties.h | 85 --- taglib/lib/libtag.a | Bin 2207786 -> 0 bytes taglib/lib/libtag_c.a | Bin 19844 -> 0 bytes taglib/lib/pkgconfig/taglib.pc | 11 - taglib/lib/pkgconfig/taglib_c.pc | 11 - 115 files changed, 49 insertions(+), 19260 deletions(-) create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 160000 taglib delete mode 100644 taglib/bin/taglib-config.cmd delete mode 100644 taglib/include/taglib/aifffile.h delete mode 100644 taglib/include/taglib/aiffproperties.h delete mode 100644 taglib/include/taglib/apefile.h delete mode 100644 taglib/include/taglib/apefooter.h delete mode 100644 taglib/include/taglib/apeitem.h delete mode 100644 taglib/include/taglib/apeproperties.h delete mode 100644 taglib/include/taglib/apetag.h delete mode 100644 taglib/include/taglib/asfattribute.h delete mode 100644 taglib/include/taglib/asffile.h delete mode 100644 taglib/include/taglib/asfpicture.h delete mode 100644 taglib/include/taglib/asfproperties.h delete mode 100644 taglib/include/taglib/asftag.h delete mode 100644 taglib/include/taglib/attachedpictureframe.h delete mode 100644 taglib/include/taglib/audioproperties.h delete mode 100644 taglib/include/taglib/chapterframe.h delete mode 100644 taglib/include/taglib/commentsframe.h delete mode 100644 taglib/include/taglib/eventtimingcodesframe.h delete mode 100644 taglib/include/taglib/fileref.h delete mode 100644 taglib/include/taglib/flacfile.h delete mode 100644 taglib/include/taglib/flacmetadatablock.h delete mode 100644 taglib/include/taglib/flacpicture.h delete mode 100644 taglib/include/taglib/flacproperties.h delete mode 100644 taglib/include/taglib/generalencapsulatedobjectframe.h delete mode 100644 taglib/include/taglib/id3v1genres.h delete mode 100644 taglib/include/taglib/id3v1tag.h delete mode 100644 taglib/include/taglib/id3v2.h delete mode 100644 taglib/include/taglib/id3v2extendedheader.h delete mode 100644 taglib/include/taglib/id3v2footer.h delete mode 100644 taglib/include/taglib/id3v2frame.h delete mode 100644 taglib/include/taglib/id3v2framefactory.h delete mode 100644 taglib/include/taglib/id3v2header.h delete mode 100644 taglib/include/taglib/id3v2synchdata.h delete mode 100644 taglib/include/taglib/id3v2tag.h delete mode 100644 taglib/include/taglib/infotag.h delete mode 100644 taglib/include/taglib/itfile.h delete mode 100644 taglib/include/taglib/itproperties.h delete mode 100644 taglib/include/taglib/modfile.h delete mode 100644 taglib/include/taglib/modfilebase.h delete mode 100644 taglib/include/taglib/modproperties.h delete mode 100644 taglib/include/taglib/modtag.h delete mode 100644 taglib/include/taglib/mp4atom.h delete mode 100644 taglib/include/taglib/mp4coverart.h delete mode 100644 taglib/include/taglib/mp4file.h delete mode 100644 taglib/include/taglib/mp4item.h delete mode 100644 taglib/include/taglib/mp4properties.h delete mode 100644 taglib/include/taglib/mp4tag.h delete mode 100644 taglib/include/taglib/mpcfile.h delete mode 100644 taglib/include/taglib/mpcproperties.h delete mode 100644 taglib/include/taglib/mpegfile.h delete mode 100644 taglib/include/taglib/mpegheader.h delete mode 100644 taglib/include/taglib/mpegproperties.h delete mode 100644 taglib/include/taglib/oggfile.h delete mode 100644 taglib/include/taglib/oggflacfile.h delete mode 100644 taglib/include/taglib/oggpage.h delete mode 100644 taglib/include/taglib/oggpageheader.h delete mode 100644 taglib/include/taglib/opusfile.h delete mode 100644 taglib/include/taglib/opusproperties.h delete mode 100644 taglib/include/taglib/ownershipframe.h delete mode 100644 taglib/include/taglib/podcastframe.h delete mode 100644 taglib/include/taglib/popularimeterframe.h delete mode 100644 taglib/include/taglib/privateframe.h delete mode 100644 taglib/include/taglib/relativevolumeframe.h delete mode 100644 taglib/include/taglib/rifffile.h delete mode 100644 taglib/include/taglib/s3mfile.h delete mode 100644 taglib/include/taglib/s3mproperties.h delete mode 100644 taglib/include/taglib/speexfile.h delete mode 100644 taglib/include/taglib/speexproperties.h delete mode 100644 taglib/include/taglib/synchronizedlyricsframe.h delete mode 100644 taglib/include/taglib/tableofcontentsframe.h delete mode 100644 taglib/include/taglib/tag.h delete mode 100644 taglib/include/taglib/tag_c.h delete mode 100644 taglib/include/taglib/taglib.h delete mode 100644 taglib/include/taglib/taglib_config.h delete mode 100644 taglib/include/taglib/taglib_export.h delete mode 100644 taglib/include/taglib/tbytevector.h delete mode 100644 taglib/include/taglib/tbytevectorlist.h delete mode 100644 taglib/include/taglib/tbytevectorstream.h delete mode 100644 taglib/include/taglib/tdebuglistener.h delete mode 100644 taglib/include/taglib/textidentificationframe.h delete mode 100644 taglib/include/taglib/tfile.h delete mode 100644 taglib/include/taglib/tfilestream.h delete mode 100644 taglib/include/taglib/tiostream.h delete mode 100644 taglib/include/taglib/tlist.h delete mode 100644 taglib/include/taglib/tlist.tcc delete mode 100644 taglib/include/taglib/tmap.h delete mode 100644 taglib/include/taglib/tmap.tcc delete mode 100644 taglib/include/taglib/tpropertymap.h delete mode 100644 taglib/include/taglib/trefcounter.h delete mode 100644 taglib/include/taglib/trueaudiofile.h delete mode 100644 taglib/include/taglib/trueaudioproperties.h delete mode 100644 taglib/include/taglib/tstring.h delete mode 100644 taglib/include/taglib/tstringlist.h delete mode 100644 taglib/include/taglib/uniquefileidentifierframe.h delete mode 100644 taglib/include/taglib/unknownframe.h delete mode 100644 taglib/include/taglib/unsynchronizedlyricsframe.h delete mode 100644 taglib/include/taglib/urllinkframe.h delete mode 100644 taglib/include/taglib/vorbisfile.h delete mode 100644 taglib/include/taglib/vorbisproperties.h delete mode 100644 taglib/include/taglib/wavfile.h delete mode 100644 taglib/include/taglib/wavpackfile.h delete mode 100644 taglib/include/taglib/wavpackproperties.h delete mode 100644 taglib/include/taglib/wavproperties.h delete mode 100644 taglib/include/taglib/xingheader.h delete mode 100644 taglib/include/taglib/xiphcomment.h delete mode 100644 taglib/include/taglib/xmfile.h delete mode 100644 taglib/include/taglib/xmproperties.h delete mode 100644 taglib/lib/libtag.a delete mode 100644 taglib/lib/libtag_c.a delete mode 100644 taglib/lib/pkgconfig/taglib.pc delete mode 100644 taglib/lib/pkgconfig/taglib_c.pc diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f3a3d31 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "taglib"] + path = taglib + url = git@github.com:taglib/taglib.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..51e5998 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,39 @@ +cmake_minimum_required(VERSION 3.14) + +project(ncmdump LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_BUILD_TYPE Release) + +option(BUILD_WIN32_STATIC "Build the program statically on Windows" ON) + +FILE(GLOB HEADERS ./*.h) +FILE(GLOB SOURCES ./*.cpp) +add_executable(ncmdump + ${HEADERS} + ${SOURCES} +) +add_subdirectory(taglib) +target_link_libraries(ncmdump tag) +target_include_directories(ncmdump PRIVATE taglib) +target_include_directories(ncmdump PRIVATE taglib/taglib) +target_include_directories(ncmdump PRIVATE taglib/taglib/toolkit) +target_include_directories(ncmdump PRIVATE taglib/taglib/mpeg/id3v2) + +if(WIN32) + if(CMAKE_COMPILER_IS_GNUCXX) + target_link_options(ncmdump PRIVATE -O2 -municode) + if(BUILD_WIN32_STATIC) + target_link_options(ncmdump PRIVATE -static) + endif() + endif() +endif() + +include(GNUInstallDirs) +install(TARGETS ncmdump + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/ncmcrypt.cpp b/ncmcrypt.cpp index 2be1fc8..0f629c0 100644 --- a/ncmcrypt.cpp +++ b/ncmcrypt.cpp @@ -4,11 +4,12 @@ #include "cJSON.h" #define TAGLIB_STATIC -#include -#include -#include -#include -#include +#include "taglib/toolkit/tfile.h" +#include "taglib/mpeg/mpegfile.h" +#include "taglib/flac/flacfile.h" +#include "taglib/mpeg/id3v2/frames/attachedpictureframe.h" +#include "taglib/mpeg/id3v2/id3v2tag.h" +#include "taglib/tag.h" #include #include diff --git a/taglib b/taglib new file mode 160000 index 0000000..0896fb9 --- /dev/null +++ b/taglib @@ -0,0 +1 @@ +Subproject commit 0896fb90920c125e55248360d271d1a1674e2a4d diff --git a/taglib/bin/taglib-config.cmd b/taglib/bin/taglib-config.cmd deleted file mode 100644 index bec5277..0000000 --- a/taglib/bin/taglib-config.cmd +++ /dev/null @@ -1,36 +0,0 @@ -@echo off -goto beginning - * - * It is what it is, you can do with it as you please. - * - * Just don't blame me if it teaches your computer to smoke! - * - * -Enjoy - * fh :)_~ - * -:beginning -if /i "%1#" == "--libs#" goto doit -if /i "%1#" == "--cflags#" goto doit -if /i "%1#" == "--version#" goto doit -if /i "%1#" == "--prefix#" goto doit - -echo "usage: %0 [OPTIONS]" -echo [--libs] -echo [--cflags] -echo [--version] -echo [--prefix] -goto theend - - * - * NOTE: Windows does not assume libraries are prefixed with 'lib'. - * NOTE: If '-llibtag' is the last element, it is easily appended in the users installation/makefile process - * to allow for static, shared or debug builds. - * It would be preferable if the top level CMakeLists.txt provided the library name during config. ?? -:doit -if /i "%1#" == "--libs#" echo -LC:/Users/TaurusXin/Downloads/ncmdump/taglib/lib -llibtag -if /i "%1#" == "--cflags#" echo -IC:/Users/TaurusXin/Downloads/ncmdump/taglib/include -IC:/Users/TaurusXin/Downloads/ncmdump/taglib/include/taglib -if /i "%1#" == "--version#" echo 1.13.1 -if /i "%1#" == "--prefix#" echo C:/Users/TaurusXin/Downloads/ncmdump/taglib - -:theend - diff --git a/taglib/include/taglib/aifffile.h b/taglib/include/taglib/aifffile.h deleted file mode 100644 index 1e2d9d5..0000000 --- a/taglib/include/taglib/aifffile.h +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************** - copyright : (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_AIFFFILE_H -#define TAGLIB_AIFFFILE_H - -#include "rifffile.h" -#include "id3v2tag.h" -#include "aiffproperties.h" - -namespace TagLib { - - namespace RIFF { - - //! An implementation of AIFF metadata - - /*! - * This is implementation of AIFF metadata. - * - * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF - * chunk as well as properties from the file. - */ - - namespace AIFF { - - //! An implementation of TagLib::File with AIFF specific methods - - /*! - * This implements and provides an interface for AIFF files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to AIFF files. - */ - - class TAGLIB_EXPORT File : public TagLib::RIFF::File - { - public: - /*! - * Constructs an AIFF file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an AIFF file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \see hasID3v2Tag() - */ - virtual ID3v2::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * This method forwards to ID3v2::Tag::properties(). - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * This method forwards to ID3v2::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the AIFF::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Save using a specific ID3v2 version (e.g. v3) - */ - bool save(ID3v2::Version version); - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - /*! - * Check if the given \a stream can be opened as an AIFF file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - friend class Properties; - - class FilePrivate; - FilePrivate *d; - }; - } // namespace AIFF - } // namespace RIFF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/aiffproperties.h b/taglib/include/taglib/aiffproperties.h deleted file mode 100644 index 0324b85..0000000 --- a/taglib/include/taglib/aiffproperties.h +++ /dev/null @@ -1,166 +0,0 @@ -/*************************************************************************** - copyright : (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_AIFFPROPERTIES_H -#define TAGLIB_AIFFPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace RIFF { - - namespace AIFF { - - class File; - - //! An implementation of audio property reading for AIFF - - /*! - * This reads the data from an AIFF stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of AIFF::Properties with the data read from the - * ByteVector \a data. - * - * \deprecated Use Properties(File *, ReadStyle). - */ - TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style); - - /*! - * Create an instance of AIFF::Properties with the data read from the - * AIFF::File \a file. - */ - Properties(File *file, ReadStyle style); - - /*! - * Destroys this AIFF::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample. - */ - int bitsPerSample() const; - - /*! - * Returns the number of bits per audio sample. - * - * \note This method is just an alias of bitsPerSample(). - * - * \deprecated Use bitsPerSample(). - */ - TAGLIB_DEPRECATED int sampleWidth() const; - - /*! - * Returns the number of sample frames - */ - unsigned int sampleFrames() const; - - /*! - * Returns true if the file is in AIFF-C format, false if AIFF format. - */ - bool isAiffC() const; - - /*! - * Returns the compression type of the AIFF-C file. For example, "NONE" for - * not compressed, "ACE2" for ACE 2-to-1. - * - * If the file is in AIFF format, always returns an empty vector. - * - * \see isAiffC() - */ - ByteVector compressionType() const; - - /*! - * Returns the concrete compression name of the AIFF-C file. - * - * If the file is in AIFF format, always returns an empty string. - * - * \see isAiffC() - */ - String compressionName() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace AIFF - } // namespace RIFF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/apefile.h b/taglib/include/taglib/apefile.h deleted file mode 100644 index 754e05f..0000000 --- a/taglib/include/taglib/apefile.h +++ /dev/null @@ -1,235 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - (original WavPack implementation) - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEFILE_H -#define TAGLIB_APEFILE_H - -#include "tfile.h" -#include "taglib_export.h" -#include "apeproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of APE metadata - - /*! - * This is implementation of APE metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. - */ - - namespace APE { - - //! An implementation of TagLib::File with APE specific methods - - /*! - * This implements and provides an interface for APE files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to APE files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches APE tags. - APE = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs an APE file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an APE file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both an APE and an ID3v1 tag, only APE - * will be converted to the PropertyMap. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties. Forwards to the actual Tag's - * removeUnsupportedProperties() function. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * Creates an APEv2 tag if necessary. A potentially existing ID3v1 - * tag will be updated as well. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the APE::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - * - * \note According to the official Monkey's Audio SDK, an APE file - * can only have either ID3V1 or APE tags, so a parameter is used here. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the given \a stream can be opened as an APE - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace APE -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/apefooter.h b/taglib/include/taglib/apefooter.h deleted file mode 100644 index 38d83a3..0000000 --- a/taglib/include/taglib/apefooter.h +++ /dev/null @@ -1,173 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEFOOTER_H -#define TAGLIB_APEFOOTER_H - -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace APE { - - //! An implementation of APE footers - - /*! - * This class implements APE footers (and headers). It attempts to follow, both - * semantically and programmatically, the structure specified in - * the APE v2.0 standard. The API is based on the properties of APE footer and - * headers specified there. - */ - - class TAGLIB_EXPORT Footer - { - public: - /*! - * Constructs an empty APE footer. - */ - Footer(); - - /*! - * Constructs an APE footer based on \a data. parse() is called - * immediately. - */ - Footer(const ByteVector &data); - - /*! - * Destroys the footer. - */ - virtual ~Footer(); - - /*! - * Returns the version number. (Note: This is the 1000 or 2000.) - */ - unsigned int version() const; - - /*! - * Returns true if a header is present in the tag. - */ - bool headerPresent() const; - - /*! - * Returns true if a footer is present in the tag. - */ - bool footerPresent() const; - - /*! - * Returns true this is actually the header. - */ - bool isHeader() const; - - /*! - * Sets whether the header should be rendered or not - */ - void setHeaderPresent(bool b) const; - - /*! - * Returns the number of items in the tag. - */ - unsigned int itemCount() const; - - /*! - * Set the item count to \a s. - * \see itemCount() - */ - void setItemCount(unsigned int s); - - /*! - * Returns the tag size in bytes. This is the size of the frame content and footer. - * The size of the \e entire tag will be this plus the header size, if present. - * - * \see completeTagSize() - */ - unsigned int tagSize() const; - - /*! - * Returns the tag size, including if present, the header - * size. - * - * \see tagSize() - */ - unsigned int completeTagSize() const; - - /*! - * Set the tag size to \a s. - * \see tagSize() - */ - void setTagSize(unsigned int s); - - /*! - * Returns the size of the footer. Presently this is always 32 bytes. - */ - static unsigned int size(); - - /*! - * Returns the string used to identify an APE tag inside of a file. - * Presently this is always "APETAGEX". - */ - static ByteVector fileIdentifier(); - - /*! - * Sets the data that will be used as the footer. 32 bytes, - * starting from \a data will be used. - */ - void setData(const ByteVector &data); - - /*! - * Renders the footer back to binary format. - */ - ByteVector renderFooter() const; - - /*! - * Renders the header corresponding to the footer. If headerPresent is - * set to false, it returns an empty ByteVector. - */ - ByteVector renderHeader() const; - - protected: - /*! - * Called by setData() to parse the footer data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - /*! - * Called by renderFooter and renderHeader - */ - ByteVector render(bool isHeader) const; - - private: - Footer(const Footer &); - Footer &operator=(const Footer &); - - class FooterPrivate; - FooterPrivate *d; - }; - - } // namespace APE -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/apeitem.h b/taglib/include/taglib/apeitem.h deleted file mode 100644 index 2445b50..0000000 --- a/taglib/include/taglib/apeitem.h +++ /dev/null @@ -1,219 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEITEM_H -#define TAGLIB_APEITEM_H - -#include "tbytevector.h" -#include "tstring.h" -#include "tstringlist.h" - -namespace TagLib { - namespace APE { - //! An implementation of APE-items - - /*! - * This class provides the features of items in the APEv2 standard. - */ - class TAGLIB_EXPORT Item - { - public: - /*! - * Enum of types an Item can have. The value of 3 is reserved. - */ - enum ItemTypes { - //! Item contains text information coded in UTF-8 - Text = 0, - //! Item contains binary information - Binary = 1, - //! Item is a locator of external stored information - Locator = 2 - }; - /*! - * Constructs an empty item. - */ - Item(); - - /*! - * Constructs a text item with \a key and \a value. - */ - // BIC: Remove this, StringList has a constructor from a single string - Item(const String &key, const String &value); - - /*! - * Constructs a text item with \a key and \a values. - */ - Item(const String &key, const StringList &values); - - /*! - * Constructs an item with \a key and \a value. - * If \a binary is true a Binary item will be created, otherwise \a value will be interpreted as text - */ - Item(const String &key, const ByteVector &value, bool binary); - - /*! - * Construct an item as a copy of \a item. - */ - Item(const Item &item); - - /*! - * Destroys the item. - */ - virtual ~Item(); - - /*! - * Copies the contents of \a item into this item. - */ - Item &operator=(const Item &item); - - /*! - * Exchanges the content of this item by the content of \a item. - */ - void swap(Item &item); - - /*! - * Returns the key. - */ - String key() const; - - /*! - * Returns the binary value. - * If the item type is not \a Binary, always returns an empty ByteVector. - */ - ByteVector binaryData() const; - - /*! - * Set the binary value to \a value - * The item's type will also be set to \a Binary - */ - void setBinaryData(const ByteVector &value); - -#ifndef DO_NOT_DOCUMENT - /* Remove in next binary incompatible release */ - ByteVector value() const; -#endif - - /*! - * Sets the key for the item to \a key. - */ - void setKey(const String &key); - - /*! - * Sets the text value of the item to \a value and clears any previous contents. - * - * \see toString() - */ - void setValue(const String &value); - - /*! - * Sets the text value of the item to the list of values in \a value and clears - * any previous contents. - * - * \see toStringList() - */ - void setValues(const StringList &values); - - /*! - * Appends \a value to create (or extend) the current list of text values. - * - * \see toString() - */ - void appendValue(const String &value); - - /*! - * Appends \a values to extend the current list of text values. - * - * \see toStringList() - */ - void appendValues(const StringList &values); - - /*! - * Returns the size of the full item. - */ - int size() const; - - /*! - * Returns the value as a single string. In case of multiple strings, - * the first is returned. If the data type is not \a Text, always returns - * an empty String. - */ - String toString() const; - -#ifndef DO_NOT_DOCUMENT - /* Remove in next binary incompatible release */ - StringList toStringList() const; -#endif - - /*! - * Returns the list of text values. If the data type is not \a Text, always - * returns an empty StringList. - */ - StringList values() const; - - /*! - * Render the item to a ByteVector. - */ - ByteVector render() const; - - /*! - * Parse the item from the ByteVector \a data. - */ - void parse(const ByteVector& data); - - /*! - * Set the item to read-only. - */ - void setReadOnly(bool readOnly); - - /*! - * Return true if the item is read-only. - */ - bool isReadOnly() const; - - /*! - * Sets the type of the item to \a type. - * - * \see ItemTypes - */ - void setType(ItemTypes type); - - /*! - * Returns the type of the item. - */ - ItemTypes type() const; - - /*! - * Returns if the item has any real content. - */ - bool isEmpty() const; - - private: - class ItemPrivate; - ItemPrivate *d; - }; - } // namespace APE -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/apeproperties.h b/taglib/include/taglib/apeproperties.h deleted file mode 100644 index 8c67481..0000000 --- a/taglib/include/taglib/apeproperties.h +++ /dev/null @@ -1,143 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - (original WavPack implementation) - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEPROPERTIES_H -#define TAGLIB_APEPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace APE { - - class File; - - //! An implementation of audio property reading for APE - - /*! - * This reads the data from an APE stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of APE::Properties with the data read from the - * APE::File \a file. - * - * \deprecated Use Properties(File *, long, ReadStyle). - */ - TAGLIB_DEPRECATED Properties(File *file, ReadStyle style = Average); - - /*! - * Create an instance of APE::Properties with the data read from the - * APE::File \a file. - */ - Properties(File *file, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this APE::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample. - */ - int bitsPerSample() const; - - /*! - * Returns the total number of audio samples in file. - */ - unsigned int sampleFrames() const; - - /*! - * Returns APE version. - */ - int version() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file, long streamLength); - - void analyzeCurrent(File *file); - void analyzeOld(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace APE -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/apetag.h b/taglib/include/taglib/apetag.h deleted file mode 100644 index 0150429..0000000 --- a/taglib/include/taglib/apetag.h +++ /dev/null @@ -1,208 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_APETAG_H -#define TAGLIB_APETAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "tmap.h" -#include "tstring.h" -#include "taglib_export.h" - -#include "apeitem.h" - -namespace TagLib { - - class File; - - //! An implementation of the APE tagging format - - namespace APE { - - class Footer; - - /*! - * A mapping between a list of item names, or keys, and the associated item. - * - * \see APE::Tag::itemListMap() - */ - typedef Map ItemListMap; - - - //! An APE tag implementation - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Create an APE tag with default values. - */ - Tag(); - - /*! - * Create an APE tag and parse the data in \a file with APE footer at - * \a tagOffset. - */ - Tag(TagLib::File *file, long footerLocation); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Renders the in memory values to a ByteVector suitable for writing to - * the file. - */ - ByteVector render() const; - - /*! - * Returns the string "APETAGEX" suitable for usage in locating the tag in a - * file. - */ - static ByteVector fileIdentifier(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual unsigned int year() const; - virtual unsigned int track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(unsigned int i); - virtual void setTrack(unsigned int i); - - /*! - * Implements the unified tag dictionary interface -- export function. - * APE tags are perfectly compatible with the dictionary interface because they - * support both arbitrary tag names and multiple values. Currently only - * APE items of type *Text* are handled by the dictionary interface; all *Binary* - * and *Locator* items will be put into the unsupportedData list and can be - * deleted on request using removeUnsupportedProperties(). The same happens - * to Text items if their key is invalid for PropertyMap (which should actually - * never happen). - * - * The only conversion done by this export function is to rename the APE tags - * TRACK to TRACKNUMBER, YEAR to DATE, and ALBUM ARTIST to ALBUMARTIST, respectively, - * in order to be compliant with the names used in other formats. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified tag dictionary interface -- import function. The same - * comments as for the export function apply; additionally note that the APE tag - * specification requires keys to have between 2 and 16 printable ASCII characters - * with the exception of the fixed strings "ID3", "TAG", "OGGS", and "MP+". - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Check if the given String is a valid APE tag key. - */ - static bool checkKey(const String&); - - /*! - * Returns a pointer to the tag's footer. - */ - Footer *footer() const; - - /*! - * Returns a reference to the item list map. This is an ItemListMap of - * all of the items in the tag. - * - * This is the most powerful structure for accessing the items of the tag. - * - * APE tags are case-insensitive, all keys in this map have been converted - * to upper case. - * - * \warning You should not modify this data structure directly, instead - * use setItem() and removeItem(). - */ - const ItemListMap &itemListMap() const; - - /*! - * Removes the \a key item from the tag - */ - void removeItem(const String &key); - - /*! - * Adds to the text item specified by \a key the data \a value. If \a replace - * is true, then all of the other values on the same key will be removed - * first. If a binary item exists for \a key it will be removed first. - */ - void addValue(const String &key, const String &value, bool replace = true); - - /*! - * Set the binary data for the key specified by \a item to \a value - * This will convert the item to type \a Binary if it isn't already and - * all of the other values on the same key will be removed. - */ - void setData(const String &key, const ByteVector &value); - - /*! - * Sets the \a key item to the value of \a item. If an item with the \a key is already - * present, it will be replaced. - */ - void setItem(const String &key, const Item &item); - - /*! - * Returns true if the tag does not contain any data. - */ - bool isEmpty() const; - - protected: - - /*! - * Reads from the file specified in the constructor. - */ - void read(); - - /*! - * Parses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } // namespace APE -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/asfattribute.h b/taglib/include/taglib/asfattribute.h deleted file mode 100644 index 5952fbd..0000000 --- a/taglib/include/taglib/asfattribute.h +++ /dev/null @@ -1,205 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFATTRIBUTE_H -#define TAGLIB_ASFATTRIBUTE_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "asfpicture.h" - -namespace TagLib -{ - namespace ASF - { - class File; - class Picture; - - class TAGLIB_EXPORT Attribute - { - public: - - /*! - * Enum of types an Attribute can have. - */ - enum AttributeTypes { - UnicodeType = 0, - BytesType = 1, - BoolType = 2, - DWordType = 3, - QWordType = 4, - WordType = 5, - GuidType = 6 - }; - - /*! - * Constructs an empty attribute. - */ - Attribute(); - - /*! - * Constructs an attribute with \a key and a UnicodeType \a value. - */ - Attribute(const String &value); - - /*! - * Constructs an attribute with \a key and a BytesType \a value. - */ - Attribute(const ByteVector &value); - - /*! - * Constructs an attribute with \a key and a Picture \a value. - * - * This attribute is compatible with the ID3 frame, APIC. The ID3 specification for the APIC frame stipulates that, - * while there may be any number of APIC frames associated with a file, - * only one may be of type 1 and only one may be of type 2. - * - * The specification also states that the description of the picture can be no longer than 64 characters, but can be empty. - * WM/Picture attributes added with TagLib::ASF are not automatically validated to conform to ID3 specifications. - * You must add code in your application to perform validations if you want to maintain complete compatibility with ID3. - */ - Attribute(const Picture &value); - - /*! - * Constructs an attribute with \a key and a DWordType \a value. - */ - Attribute(unsigned int value); - - /*! - * Constructs an attribute with \a key and a QWordType \a value. - */ - Attribute(unsigned long long value); - - /*! - * Constructs an attribute with \a key and a WordType \a value. - */ - Attribute(unsigned short value); - - /*! - * Constructs an attribute with \a key and a BoolType \a value. - */ - Attribute(bool value); - - /*! - * Construct an attribute as a copy of \a other. - */ - Attribute(const Attribute &item); - - /*! - * Copies the contents of \a other into this item. - */ - Attribute &operator=(const Attribute &other); - - /*! - * Exchanges the content of the Attribute by the content of \a other. - */ - void swap(Attribute &other); - - /*! - * Destroys the attribute. - */ - virtual ~Attribute(); - - /*! - * Returns type of the value. - */ - AttributeTypes type() const; - - /*! - * Returns the BoolType \a value. - */ - unsigned short toBool() const; - - /*! - * Returns the WordType \a value. - */ - unsigned short toUShort() const; - - /*! - * Returns the DWordType \a value. - */ - unsigned int toUInt() const; - - /*! - * Returns the QWordType \a value. - */ - unsigned long long toULongLong() const; - - /*! - * Returns the UnicodeType \a value. - */ - String toString() const; - - /*! - * Returns the BytesType \a value. - */ - ByteVector toByteVector() const; - - /*! - * Returns the Picture \a value. - */ - Picture toPicture() const; - - /*! - * Returns the language number, or 0 is no stream number was set. - */ - int language() const; - - /*! - * Sets the language number. - */ - void setLanguage(int value); - - /*! - * Returns the stream number, or 0 is no stream number was set. - */ - int stream() const; - - /*! - * Sets the stream number. - */ - void setStream(int value); - -#ifndef DO_NOT_DOCUMENT - /* THIS IS PRIVATE, DON'T TOUCH IT! */ - String parse(ASF::File &file, int kind = 0); -#endif - - //! Returns the size of the stored data - int dataSize() const; - - private: - friend class File; - - ByteVector render(const String &name, int kind = 0) const; - - class AttributePrivate; - AttributePrivate *d; - }; - } // namespace ASF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/asffile.h b/taglib/include/taglib/asffile.h deleted file mode 100644 index 5cabc38..0000000 --- a/taglib/include/taglib/asffile.h +++ /dev/null @@ -1,134 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFFILE_H -#define TAGLIB_ASFFILE_H - -#include "tag.h" -#include "tfile.h" -#include "taglib_export.h" -#include "asfproperties.h" -#include "asftag.h" - -namespace TagLib { - //! An implementation of ASF (WMA) metadata - namespace ASF { - /*! - * This implements and provides an interface for ASF files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to ASF files. - */ - class TAGLIB_EXPORT File : public TagLib::File - { - public: - - /*! - * Constructs an ASF file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an ASF file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to the ASF tag of the file. - * - * ASF::Tag implements the tag interface, so this serves as the - * reimplementation of TagLib::File::tag(). - * - * \note The Tag is still owned by the ASF::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - virtual Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties. Forwards to the actual Tag's - * removeUnsupportedProperties() function. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the ASF audio properties for this file. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns whether or not the given \a stream can be opened as an ASF - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - void read(); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace ASF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/asfpicture.h b/taglib/include/taglib/asfpicture.h deleted file mode 100644 index f1b0ad4..0000000 --- a/taglib/include/taglib/asfpicture.h +++ /dev/null @@ -1,222 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Anton Sergunov - email : setosha@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef ASFPICTURE_H -#define ASFPICTURE_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "attachedpictureframe.h" - -namespace TagLib -{ - namespace ASF - { - - //! An ASF attached picture interface implementation - - /*! - * This is an implementation of ASF attached pictures interface. Pictures may be - * included in attributes, one per WM/Picture attribute (but there may be multiple WM/Picture - * attribute in a single tag). These pictures are usually in either JPEG or - * PNG format. - * \see Attribute::toPicture() - * \see Attribute::Attribute(const Picture& picture) - */ - class TAGLIB_EXPORT Picture { - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - /*! - * Constructs an empty picture. - */ - Picture(); - - /*! - * Construct an picture as a copy of \a other. - */ - Picture(const Picture& other); - - /*! - * Destroys the picture. - */ - virtual ~Picture(); - - /*! - * Copies the contents of \a other into this picture. - */ - Picture& operator=(const Picture& other); - - /*! - * Exchanges the content of the Picture by the content of \a other. - */ - void swap(Picture &other); - - /*! - * Returns true if Picture stores valid picture - */ - bool isValid() const; - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - * \see setMimeType(const String &) - * \see picture() - * \see setPicture(const ByteArray&) - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - * \see setMimeType(const String &) - * \see picture() - * \see setPicture(const ByteArray&) - */ - void setMimeType(const String &value); - - /*! - * Returns the type of the image. - * - * \see Type - * \see setType() - */ - Type type() const; - - /*! - * Sets the type for the image. - * - * \see Type - * \see type() - */ - void setType(const ASF::Picture::Type& t); - - /*! - * Returns a text description of the image. - * - * \see setDescription() - */ - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - * - * \see description() - */ - void setDescription(const String &desc); - - /*! - * Returns the image data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setPicture() - * \see mimeType() - */ - ByteVector picture() const; - - /*! - * Sets the image data to \a p. \a p should be of the type specified in - * this frame's mime-type specification. - * - * \see picture() - * \see mimeType() - * \see setMimeType() - */ - void setPicture(const ByteVector &p); - - /*! - * Returns picture as binary raw data \a value - */ - ByteVector render() const; - - /*! - * Returns picture as binary raw data \a value - */ - int dataSize() const; - -#ifndef DO_NOT_DOCUMENT - /* THIS IS PRIVATE, DON'T TOUCH IT! */ - void parse(const ByteVector& ); - static Picture fromInvalid(); -#endif - - private: - class PicturePrivate; - PicturePrivate *d; - }; - } // namespace ASF -} // namespace TagLib - -#endif // ASFPICTURE_H diff --git a/taglib/include/taglib/asfproperties.h b/taglib/include/taglib/asfproperties.h deleted file mode 100644 index d17b11d..0000000 --- a/taglib/include/taglib/asfproperties.h +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFPROPERTIES_H -#define TAGLIB_ASFPROPERTIES_H - -#include "audioproperties.h" -#include "tstring.h" -#include "taglib_export.h" - -namespace TagLib { - namespace ASF { - //! An implementation of ASF audio properties - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - - /*! - * Audio codec types can be used in ASF file. - */ - enum Codec - { - /*! - * Couldn't detect the codec. - */ - Unknown = 0, - - /*! - * Windows Media Audio 1 - */ - WMA1, - - /*! - * Windows Media Audio 2 or above - */ - WMA2, - - /*! - * Windows Media Audio 9 Professional - */ - WMA9Pro, - - /*! - * Windows Media Audio 9 Lossless - */ - WMA9Lossless, - }; - - /*! - * Creates an instance of ASF::Properties. - */ - Properties(); - - /*! - * Destroys this ASF::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample. - */ - int bitsPerSample() const; - - /*! - * Returns the codec used in the file. - * - * \see codecName() - * \see codecDescription() - */ - Codec codec() const; - - /*! - * Returns the concrete codec name, for example "Windows Media Audio 9.1" - * used in the file if available, otherwise an empty string. - * - * \see codec() - * \see codecDescription() - */ - String codecName() const; - - /*! - * Returns the codec description, typically contains the encoder settings, - * for example "VBR Quality 50, 44kHz, stereo 1-pass VBR" if available, - * otherwise an empty string. - * - * \see codec() - * \see codecName() - */ - String codecDescription() const; - - /*! - * Returns whether or not the file is encrypted. - */ - bool isEncrypted() const; - -#ifndef DO_NOT_DOCUMENT - // deprecated - void setLength(int value); - - void setLengthInMilliseconds(int value); - void setBitrate(int value); - void setSampleRate(int value); - void setChannels(int value); - void setBitsPerSample(int value); - void setCodec(int value); - void setCodecName(const String &value); - void setCodecDescription(const String &value); - void setEncrypted(bool value); -#endif - - private: - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace ASF -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/asftag.h b/taglib/include/taglib/asftag.h deleted file mode 100644 index 7f2e355..0000000 --- a/taglib/include/taglib/asftag.h +++ /dev/null @@ -1,211 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFTAG_H -#define TAGLIB_ASFTAG_H - -#include "tag.h" -#include "tlist.h" -#include "tmap.h" -#include "taglib_export.h" -#include "asfattribute.h" - -namespace TagLib { - - namespace ASF { - - typedef List AttributeList; - typedef Map AttributeListMap; - - class TAGLIB_EXPORT Tag : public TagLib::Tag { - - friend class File; - - public: - - Tag(); - - virtual ~Tag(); - - /*! - * Returns the track name. - */ - virtual String title() const; - - /*! - * Returns the artist name. - */ - virtual String artist() const; - - /*! - * Returns the album name; if no album name is present in the tag - * String::null will be returned. - */ - virtual String album() const; - - /*! - * Returns the track comment. - */ - virtual String comment() const; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String genre() const; - - /*! - * Returns the rating. - */ - virtual String rating() const; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String copyright() const; - - /*! - * Returns the year; if there is no year set, this will return 0. - */ - virtual unsigned int year() const; - - /*! - * Returns the track number; if there is no track number set, this will - * return 0. - */ - virtual unsigned int track() const; - - /*! - * Sets the title to \a s. - */ - virtual void setTitle(const String &s); - - /*! - * Sets the artist to \a s. - */ - virtual void setArtist(const String &s); - - /*! - * Sets the album to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setAlbum(const String &s); - - /*! - * Sets the comment to \a s. - */ - virtual void setComment(const String &s); - - /*! - * Sets the rating to \a s. - */ - virtual void setRating(const String &s); - - /*! - * Sets the copyright to \a s. - */ - virtual void setCopyright(const String &s); - - /*! - * Sets the genre to \a s. - */ - virtual void setGenre(const String &s); - - /*! - * Sets the year to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setYear(unsigned int i); - - /*! - * Sets the track to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setTrack(unsigned int i); - - /*! - * Returns true if the tag does not contain any data. This should be - * reimplemented in subclasses that provide more than the basic tagging - * abilities in this class. - */ - virtual bool isEmpty() const; - - /*! - * \deprecated Use attributeListMap() const, contains(), removeItem(), - * attribute(), setAttribute(), addAttribute(). - */ - AttributeListMap &attributeListMap(); - - /*! - * Returns a reference to the item list map. This is an AttributeListMap of - * all of the items in the tag. - */ - // BIC: return by value - const AttributeListMap &attributeListMap() const; - - /*! - * \return True if a value for \a attribute is currently set. - */ - bool contains(const String &name) const; - - /*! - * Removes the \a key attribute from the tag - */ - void removeItem(const String &name); - - /*! - * \return The list of values for the key \a name, or an empty list if no - * values have been set. - */ - AttributeList attribute(const String &name) const; - - /*! - * Sets the \a key attribute to the value of \a attribute. If an attribute - * with the \a key is already present, it will be replaced. - */ - void setAttribute(const String &name, const Attribute &attribute); - - /*! - * Sets multiple \a values to the key \a name. - */ - void setAttribute(const String &name, const AttributeList &values); - - /*! - * Sets the \a key attribute to the value of \a attribute. If an attribute - * with the \a key is already present, it will be added to the list. - */ - void addAttribute(const String &name, const Attribute &attribute); - - PropertyMap properties() const; - void removeUnsupportedProperties(const StringList& properties); - PropertyMap setProperties(const PropertyMap &properties); - - private: - - class TagPrivate; - TagPrivate *d; - }; - } // namespace ASF -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/attachedpictureframe.h b/taglib/include/taglib/attachedpictureframe.h deleted file mode 100644 index 18755f3..0000000 --- a/taglib/include/taglib/attachedpictureframe.h +++ /dev/null @@ -1,230 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ATTACHEDPICTUREFRAME_H -#define TAGLIB_ATTACHEDPICTUREFRAME_H - -#include "id3v2frame.h" -#include "id3v2header.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 attached picture frame implementation - - /*! - * This is an implementation of ID3v2 attached pictures. Pictures may be - * included in tags, one per APIC frame (but there may be multiple APIC - * frames in a single tag). These pictures are usually in either JPEG or - * PNG format. - */ - - class TAGLIB_EXPORT AttachedPictureFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - /*! - * Constructs an empty picture frame. The description, content and text - * encoding should be set manually. - */ - AttachedPictureFrame(); - - /*! - * Constructs an AttachedPicture frame based on \a data. - */ - explicit AttachedPictureFrame(const ByteVector &data); - - /*! - * Destroys the AttahcedPictureFrame instance. - */ - virtual ~AttachedPictureFrame(); - - /*! - * Returns a string containing the description and mime-type - */ - virtual String toString() const; - - /*! - * Returns the text encoding used for the description. - * - * \see setTextEncoding() - * \see description() - */ - String::Type textEncoding() const; - - /*! - * Set the text encoding used for the description. - * - * \see description() - */ - void setTextEncoding(String::Type t); - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - void setMimeType(const String &m); - - /*! - * Returns the type of the image. - * - * \see Type - * \see setType() - */ - Type type() const; - - /*! - * Sets the type for the image. - * - * \see Type - * \see type() - */ - void setType(Type t); - - /*! - * Returns a text description of the image. - * - * \see setDescription() - * \see textEncoding() - * \see setTextEncoding() - */ - - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - * - * \see description() - * \see textEncoding() - * \see setTextEncoding() - */ - - void setDescription(const String &desc); - - /*! - * Returns the image data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setPicture() - * \see mimeType() - */ - ByteVector picture() const; - - /*! - * Sets the image data to \a p. \a p should be of the type specified in - * this frame's mime-type specification. - * - * \see picture() - * \see mimeType() - * \see setMimeType() - */ - void setPicture(const ByteVector &p); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - class AttachedPictureFramePrivate; - AttachedPictureFramePrivate *d; - - private: - AttachedPictureFrame(const AttachedPictureFrame &); - AttachedPictureFrame &operator=(const AttachedPictureFrame &); - AttachedPictureFrame(const ByteVector &data, Header *h); - - }; - - //! support for ID3v2.2 PIC frames - class TAGLIB_EXPORT AttachedPictureFrameV22 : public AttachedPictureFrame - { - protected: - virtual void parseFields(const ByteVector &data); - private: - AttachedPictureFrameV22(const ByteVector &data, Header *h); - friend class FrameFactory; - }; - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/audioproperties.h b/taglib/include/taglib/audioproperties.h deleted file mode 100644 index 9ef8210..0000000 --- a/taglib/include/taglib/audioproperties.h +++ /dev/null @@ -1,127 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_AUDIOPROPERTIES_H -#define TAGLIB_AUDIOPROPERTIES_H - -#include "taglib_export.h" - -namespace TagLib { - - //! A simple, abstract interface to common audio properties - - /*! - * The values here are common to most audio formats. For more specific, codec - * dependent values, please see see the subclasses APIs. This is meant to - * compliment the TagLib::File and TagLib::Tag APIs in providing a simple - * interface that is sufficient for most applications. - */ - - class TAGLIB_EXPORT AudioProperties - { - public: - - /*! - * Reading audio properties from a file can sometimes be very time consuming - * and for the most accurate results can often involve reading the entire - * file. Because in many situations speed is critical or the accuracy of the - * values is not particularly important this allows the level of desired - * accuracy to be set. - */ - enum ReadStyle { - //! Read as little of the file as possible - Fast, - //! Read more of the file and make better values guesses - Average, - //! Read as much of the file as needed to report accurate values - Accurate - }; - - /*! - * Destroys this AudioProperties instance. - */ - virtual ~AudioProperties(); - - /*! - * Returns the length of the file in seconds. - */ - virtual int length() const = 0; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the most appropriate bit rate for the file in kb/s. For constant - * bitrate formats this is simply the bitrate of the file. For variable - * bitrate formats this is either the average or nominal bitrate. - */ - virtual int bitrate() const = 0; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const = 0; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const = 0; - - protected: - - /*! - * Construct an audio properties instance. This is protected as this class - * should not be instantiated directly, but should be instantiated via its - * subclasses and can be fetched from the FileRef or File APIs. - * - * \see ReadStyle - */ - AudioProperties(ReadStyle style); - - private: - AudioProperties(const AudioProperties &); - AudioProperties &operator=(const AudioProperties &); - - class AudioPropertiesPrivate; - AudioPropertiesPrivate *d; - }; - -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/chapterframe.h b/taglib/include/taglib/chapterframe.h deleted file mode 100644 index 90c3fc7..0000000 --- a/taglib/include/taglib/chapterframe.h +++ /dev/null @@ -1,249 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Lukas Krejci - email : krejclu6@fel.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_CHAPTERFRAME -#define TAGLIB_CHAPTERFRAME - -#include "id3v2tag.h" -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - /*! - * This is an implementation of ID3v2 chapter frames. The purpose of this - * frame is to describe a single chapter within an audio file. - */ - - //! An implementation of ID3v2 chapter frames - - class TAGLIB_EXPORT ChapterFrame : public ID3v2::Frame - { - friend class FrameFactory; - - public: - /*! - * Creates a chapter frame based on \a data. \a tagHeader is required as - * the internal frames are parsed based on the tag version. - */ - ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data); - - /*! - * Creates a chapter frame with the element ID \a elementID, start time - * \a startTime, end time \a endTime, start offset \a startOffset, - * end offset \a endOffset and optionally a list of embedded frames, - * whose ownership will then be taken over by this Frame, in - * \a embeddedFrames; - * - * All times are in milliseconds. - */ - ChapterFrame(const ByteVector &elementID, - unsigned int startTime, unsigned int endTime, - unsigned int startOffset, unsigned int endOffset, - const FrameList &embeddedFrames = FrameList()); - - /*! - * Destroys the frame. - */ - virtual ~ChapterFrame(); - - /*! - * Returns the element ID of the frame. Element ID - * is a null terminated string, however it's not human-readable. - * - * \see setElementID() - */ - ByteVector elementID() const; - - /*! - * Returns time of chapter's start (in milliseconds). - * - * \see setStartTime() - */ - unsigned int startTime() const; - - /*! - * Returns time of chapter's end (in milliseconds). - * - * \see setEndTime() - */ - unsigned int endTime() const; - - /*! - * Returns zero based byte offset (count of bytes from the beginning - * of the audio file) of chapter's start. - * - * \note If returned value is 0xFFFFFFFF, start time should be used instead. - * \see setStartOffset() - */ - unsigned int startOffset() const; - - /*! - * Returns zero based byte offset (count of bytes from the beginning - * of the audio file) of chapter's end. - * - * \note If returned value is 0xFFFFFFFF, end time should be used instead. - * \see setEndOffset() - */ - unsigned int endOffset() const; - - /*! - * Sets the element ID of the frame to \a eID. If \a eID isn't - * null terminated, a null char is appended automatically. - * - * \see elementID() - */ - void setElementID(const ByteVector &eID); - - /*! - * Sets time of chapter's start (in milliseconds) to \a sT. - * - * \see startTime() - */ - void setStartTime(const unsigned int &sT); - - /*! - * Sets time of chapter's end (in milliseconds) to \a eT. - * - * \see endTime() - */ - void setEndTime(const unsigned int &eT); - - /*! - * Sets zero based byte offset (count of bytes from the beginning - * of the audio file) of chapter's start to \a sO. - * - * \see startOffset() - */ - void setStartOffset(const unsigned int &sO); - - /*! - * Sets zero based byte offset (count of bytes from the beginning - * of the audio file) of chapter's end to \a eO. - * - * \see endOffset() - */ - void setEndOffset(const unsigned int &eO); - - /*! - * Returns a reference to the frame list map. This is an FrameListMap of - * all of the frames embedded in the CHAP frame. - * - * This is the most convenient structure for accessing the CHAP frame's - * embedded frames. Many frame types allow multiple instances of the same - * frame type so this is a map of lists. In most cases however there will - * only be a single frame of a certain type. - * - * \warning You should not modify this data structure directly, instead - * use addEmbeddedFrame() and removeEmbeddedFrame(). - * - * \see embeddedFrameList() - */ - const FrameListMap &embeddedFrameListMap() const; - - /*! - * Returns a reference to the embedded frame list. This is an FrameList - * of all of the frames embedded in the CHAP frame in the order that they - * were parsed. - * - * This can be useful if for example you want iterate over the CHAP frame's - * embedded frames in the order that they occur in the CHAP frame. - * - * \warning You should not modify this data structure directly, instead - * use addEmbeddedFrame() and removeEmbeddedFrame(). - */ - const FrameList &embeddedFrameList() const; - - /*! - * Returns the embedded frame list for frames with the id \a frameID - * or an empty list if there are no embedded frames of that type. This - * is just a convenience and is equivalent to: - * - * \code - * embeddedFrameListMap()[frameID]; - * \endcode - * - * \see embeddedFrameListMap() - */ - const FrameList &embeddedFrameList(const ByteVector &frameID) const; - - /*! - * Add an embedded frame to the CHAP frame. At this point the CHAP frame - * takes ownership of the embedded frame and will handle freeing its memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by embeddedFrameList() - */ - void addEmbeddedFrame(Frame *frame); - - /*! - * Remove an embedded frame from the CHAP frame. If \a del is true the frame's - * memory will be freed; if it is false, it must be deleted by the user. - * - * \note Using this method will invalidate any pointers on the list - * returned by embeddedFrameList() - */ - void removeEmbeddedFrame(Frame *frame, bool del = true); - - /*! - * Remove all embedded frames of type \a id from the CHAP frame and free their - * memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by embeddedFrameList() - */ - void removeEmbeddedFrames(const ByteVector &id); - - virtual String toString() const; - - PropertyMap asProperties() const; - - /*! - * CHAP frames each have a unique element ID. This searches for a CHAP - * frame with the element ID \a eID and returns a pointer to it. This - * can be used to link CTOC and CHAP frames together. - * - * \see elementID() - */ - static ChapterFrame *findByElementID(const Tag *tag, const ByteVector &eID); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data, Header *h); - ChapterFrame(const ChapterFrame &); - ChapterFrame &operator=(const ChapterFrame &); - - class ChapterFramePrivate; - ChapterFramePrivate *d; - }; - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/commentsframe.h b/taglib/include/taglib/commentsframe.h deleted file mode 100644 index e29f8eb..0000000 --- a/taglib/include/taglib/commentsframe.h +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_COMMENTSFRAME_H -#define TAGLIB_COMMENTSFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 comments - - /*! - * This implements the ID3v2 comment format. An ID3v2 comment consists of - * a language encoding, a description and a single text field. - */ - - class TAGLIB_EXPORT CommentsFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty comment frame that will use the text encoding - * \a encoding. - */ - explicit CommentsFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a comment based on the data in \a data. - */ - explicit CommentsFrame(const ByteVector &data); - - /*! - * Destroys this CommentFrame instance. - */ - virtual ~CommentsFrame(); - - /*! - * Returns the text of this comment. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the language encoding as a 3 byte encoding as specified by - * ISO-639-2. - * - * \note Most taggers simply ignore this value. - * - * \see setLanguage() - */ - ByteVector language() const; - - /*! - * Returns the description of this comment. - * - * \note Most taggers simply ignore this value. - * - * \see setDescription() - */ - String description() const; - - /*! - * Returns the text of this comment. - * - * \see setText() - */ - String text() const; - - /*! - * Set the language using the 3 byte language code from - * ISO-639-2 to - * \a languageCode. - * - * \see language() - */ - void setLanguage(const ByteVector &languageCode); - - /*! - * Sets the description of the comment to \a s. - * - * \see description() - */ - void setDescription(const String &s); - - /*! - * Sets the text portion of the comment to \a s. - * - * \see text() - */ - virtual void setText(const String &s); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Parses this frame as PropertyMap with a single key. - * - if description() is empty or "COMMENT", the key will be "COMMENT" - * - if description() is not a valid PropertyMap key, the frame will be - * marked unsupported by an entry "COMM/" in the unsupportedData() - * attribute of the returned map. - * - otherwise, the key will be "COMMENT:" - * - The single value will be the frame's text(). - */ - PropertyMap asProperties() const; - - /*! - * Comments each have a unique description. This searches for a comment - * frame with the description \a d and returns a pointer to it. If no - * frame is found that matches the given description null is returned. - * - * \see description() - */ - static CommentsFrame *findByDescription(const Tag *tag, const String &d); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - CommentsFrame(const ByteVector &data, Header *h); - CommentsFrame(const CommentsFrame &); - CommentsFrame &operator=(const CommentsFrame &); - - class CommentsFramePrivate; - CommentsFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/eventtimingcodesframe.h b/taglib/include/taglib/eventtimingcodesframe.h deleted file mode 100644 index 9146bdc..0000000 --- a/taglib/include/taglib/eventtimingcodesframe.h +++ /dev/null @@ -1,185 +0,0 @@ -/*************************************************************************** - copyright : (C) 2014 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_EVENTTIMINGCODESFRAME_H -#define TAGLIB_EVENTTIMINGCODESFRAME_H - -#include "id3v2frame.h" -#include "tlist.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 event timing codes frame - /*! - * An implementation of ID3v2 event timing codes. - */ - class TAGLIB_EXPORT EventTimingCodesFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * Specifies the timestamp format used. - */ - enum TimestampFormat { - //! The timestamp is of unknown format. - Unknown = 0x00, - //! The timestamp represents the number of MPEG frames since - //! the beginning of the audio stream. - AbsoluteMpegFrames = 0x01, - //! The timestamp represents the number of milliseconds since - //! the beginning of the audio stream. - AbsoluteMilliseconds = 0x02 - }; - - /*! - * Event types defined in id3v2.4.0-frames.txt 4.5. Event timing codes. - */ - enum EventType { - Padding = 0x00, - EndOfInitialSilence = 0x01, - IntroStart = 0x02, - MainPartStart = 0x03, - OutroStart = 0x04, - OutroEnd = 0x05, - VerseStart = 0x06, - RefrainStart = 0x07, - InterludeStart = 0x08, - ThemeStart = 0x09, - VariationStart = 0x0a, - KeyChange = 0x0b, - TimeChange = 0x0c, - MomentaryUnwantedNoise = 0x0d, - SustainedNoise = 0x0e, - SustainedNoiseEnd = 0x0f, - IntroEnd = 0x10, - MainPartEnd = 0x11, - VerseEnd = 0x12, - RefrainEnd = 0x13, - ThemeEnd = 0x14, - Profanity = 0x15, - ProfanityEnd = 0x16, - NotPredefinedSynch0 = 0xe0, - NotPredefinedSynch1 = 0xe1, - NotPredefinedSynch2 = 0xe2, - NotPredefinedSynch3 = 0xe3, - NotPredefinedSynch4 = 0xe4, - NotPredefinedSynch5 = 0xe5, - NotPredefinedSynch6 = 0xe6, - NotPredefinedSynch7 = 0xe7, - NotPredefinedSynch8 = 0xe8, - NotPredefinedSynch9 = 0xe9, - NotPredefinedSynchA = 0xea, - NotPredefinedSynchB = 0xeb, - NotPredefinedSynchC = 0xec, - NotPredefinedSynchD = 0xed, - NotPredefinedSynchE = 0xee, - NotPredefinedSynchF = 0xef, - AudioEnd = 0xfd, - AudioFileEnds = 0xfe - }; - - /*! - * Single entry of time stamp and event. - */ - struct SynchedEvent { - SynchedEvent(unsigned int ms, EventType t) : time(ms), type(t) {} - unsigned int time; - EventType type; - }; - - /*! - * List of synchronized events. - */ - typedef TagLib::List SynchedEventList; - - /*! - * Construct an empty event timing codes frame. - */ - explicit EventTimingCodesFrame(); - - /*! - * Construct a event timing codes frame based on the data in \a data. - */ - explicit EventTimingCodesFrame(const ByteVector &data); - - /*! - * Destroys this EventTimingCodesFrame instance. - */ - virtual ~EventTimingCodesFrame(); - - /*! - * Returns a null string. - */ - virtual String toString() const; - - /*! - * Returns the timestamp format. - */ - TimestampFormat timestampFormat() const; - - /*! - * Returns the events with the time stamps. - */ - SynchedEventList synchedEvents() const; - - /*! - * Set the timestamp format. - * - * \see timestampFormat() - */ - void setTimestampFormat(TimestampFormat f); - - /*! - * Sets the text with the time stamps. - * - * \see text() - */ - void setSynchedEvents(const SynchedEventList &e); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - EventTimingCodesFrame(const ByteVector &data, Header *h); - EventTimingCodesFrame(const EventTimingCodesFrame &); - EventTimingCodesFrame &operator=(const EventTimingCodesFrame &); - - class EventTimingCodesFramePrivate; - EventTimingCodesFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/fileref.h b/taglib/include/taglib/fileref.h deleted file mode 100644 index db23bbb..0000000 --- a/taglib/include/taglib/fileref.h +++ /dev/null @@ -1,297 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_FILEREF_H -#define TAGLIB_FILEREF_H - -#include "tfile.h" -#include "tstringlist.h" - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - class Tag; - - //! This class provides a simple abstraction for creating and handling files - - /*! - * FileRef exists to provide a minimal, generic and value-based wrapper around - * a File. It is lightweight and implicitly shared, and as such suitable for - * pass-by-value use. This hides some of the uglier details of TagLib::File - * and the non-generic portions of the concrete file implementations. - * - * This class is useful in a "simple usage" situation where it is desirable - * to be able to get and set some of the tag information that is similar - * across file types. - * - * Also note that it is probably a good idea to plug this into your mime - * type system rather than using the constructor that accepts a file name using - * the FileTypeResolver. - * - * \see FileTypeResolver - * \see addFileTypeResolver() - */ - - class TAGLIB_EXPORT FileRef - { - public: - - //! A class for pluggable file type resolution. - - /*! - * This class is used to add extend TagLib's very basic file name based file - * type resolution. - * - * This can be accomplished with: - * - * \code - * - * class MyFileTypeResolver : FileTypeResolver - * { - * TagLib::File *createFile(TagLib::FileName *fileName, bool, AudioProperties::ReadStyle) const - * { - * if(someCheckForAnMP3File(fileName)) - * return new TagLib::MPEG::File(fileName); - * return 0; - * } - * } - * - * FileRef::addFileTypeResolver(new MyFileTypeResolver); - * - * \endcode - * - * Naturally a less contrived example would be slightly more complex. This - * can be used to plug in mime-type detection systems or to add new file types - * to TagLib. - */ - - class TAGLIB_EXPORT FileTypeResolver - { - TAGLIB_IGNORE_MISSING_DESTRUCTOR - public: - /*! - * This method must be overridden to provide an additional file type - * resolver. If the resolver is able to determine the file type it should - * return a valid File object; if not it should return 0. - * - * \note The created file is then owned by the FileRef and should not be - * deleted. Deletion will happen automatically when the FileRef passes - * out of scope. - */ - virtual File *createFile(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average) const = 0; - }; - - class TAGLIB_EXPORT StreamTypeResolver : public FileTypeResolver - { - TAGLIB_IGNORE_MISSING_DESTRUCTOR - public: - virtual File *createFileFromStream(IOStream *stream, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average) const = 0; - }; - - /*! - * Creates a null FileRef. - */ - FileRef(); - - /*! - * Create a FileRef from \a fileName. If \a readAudioProperties is true then - * the audio properties will be read using \a audioPropertiesStyle. If - * \a readAudioProperties is false then \a audioPropertiesStyle will be - * ignored. - * - * Also see the note in the class documentation about why you may not want to - * use this method in your application. - */ - explicit FileRef(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average); - - /*! - * Construct a FileRef from an opened \a IOStream. If \a readAudioProperties - * is true then the audio properties will be read using \a audioPropertiesStyle. - * If \a readAudioProperties is false then \a audioPropertiesStyle will be - * ignored. - * - * Also see the note in the class documentation about why you may not want to - * use this method in your application. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - explicit FileRef(IOStream* stream, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average); - - /*! - * Construct a FileRef using \a file. The FileRef now takes ownership of the - * pointer and will delete the File when it passes out of scope. - */ - explicit FileRef(File *file); - - /*! - * Make a copy of \a ref. - */ - FileRef(const FileRef &ref); - - /*! - * Destroys this FileRef instance. - */ - virtual ~FileRef(); - - /*! - * Returns a pointer to represented file's tag. - * - * \warning This pointer will become invalid when this FileRef and all - * copies pass out of scope. - * - * \warning Do not cast it to any subclasses of Tag. - * Use tag returning methods of appropriate subclasses of File instead. - * - * \see File::tag() - */ - Tag *tag() const; - - /*! - * Returns the audio properties for this FileRef. If no audio properties - * were read then this will returns a null pointer. - */ - AudioProperties *audioProperties() const; - - /*! - * Returns a pointer to the file represented by this handler class. - * - * As a general rule this call should be avoided since if you need to work - * with file objects directly, you are probably better served instantiating - * the File subclasses (i.e. MPEG::File) manually and working with their APIs. - * - * This handle exists to provide a minimal, generic and value-based - * wrapper around a File. Accessing the file directly generally indicates - * a moving away from this simplicity (and into things beyond the scope of - * FileRef). - * - * \warning This pointer will become invalid when this FileRef and all - * copies pass out of scope. - */ - File *file() const; - - /*! - * Saves the file. Returns true on success. - */ - bool save(); - - /*! - * Adds a FileTypeResolver to the list of those used by TagLib. Each - * additional FileTypeResolver is added to the front of a list of resolvers - * that are tried. If the FileTypeResolver returns zero the next resolver - * is tried. - * - * Returns a pointer to the added resolver (the same one that's passed in -- - * this is mostly so that static initializers have something to use for - * assignment). - * - * \see FileTypeResolver - */ - static const FileTypeResolver *addFileTypeResolver(const FileTypeResolver *resolver); - - /*! - * As is mentioned elsewhere in this class's documentation, the default file - * type resolution code provided by TagLib only works by comparing file - * extensions. - * - * This method returns the list of file extensions that are used by default. - * - * The extensions are all returned in lowercase, though the comparison used - * by TagLib for resolution is case-insensitive. - * - * \note This does not account for any additional file type resolvers that - * are plugged in. Also note that this is not intended to replace a proper - * mime-type resolution system, but is just here for reference. - * - * \see FileTypeResolver - */ - static StringList defaultFileExtensions(); - - /*! - * Returns true if the file (and as such other pointers) are null. - */ - bool isNull() const; - - /*! - * Assign the file pointed to by \a ref to this FileRef. - */ - FileRef &operator=(const FileRef &ref); - - /*! - * Exchanges the content of the FileRef by the content of \a ref. - */ - void swap(FileRef &ref); - - /*! - * Returns true if this FileRef and \a ref point to the same File object. - */ - bool operator==(const FileRef &ref) const; - - /*! - * Returns true if this FileRef and \a ref do not point to the same File - * object. - */ - bool operator!=(const FileRef &ref) const; - - /*! - * A simple implementation of file type guessing. If \a readAudioProperties - * is true then the audio properties will be read using - * \a audioPropertiesStyle. If \a readAudioProperties is false then - * \a audioPropertiesStyle will be ignored. - * - * \note You generally shouldn't use this method, but instead the constructor - * directly. - * - * \deprecated Use FileRef(FileName, bool, AudioProperties::ReadStyle). - */ - static File *create(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average); - - private: - void parse(FileName fileName, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle); - void parse(IOStream *stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle); - - class FileRefPrivate; - FileRefPrivate *d; - }; - -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/flacfile.h b/taglib/include/taglib/flacfile.h deleted file mode 100644 index a43c68c..0000000 --- a/taglib/include/taglib/flacfile.h +++ /dev/null @@ -1,343 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACFILE_H -#define TAGLIB_FLACFILE_H - -#include "taglib_export.h" -#include "tfile.h" -#include "tlist.h" -#include "tag.h" - -#include "flacpicture.h" -#include "flacproperties.h" - -namespace TagLib { - - class Tag; - namespace ID3v2 { class FrameFactory; class Tag; } - namespace ID3v1 { class Tag; } - namespace Ogg { class XiphComment; } - - //! An implementation of FLAC metadata - - /*! - * This is implementation of FLAC metadata for non-Ogg FLAC files. At some - * point when Ogg / FLAC is more common there will be a similar implementation - * under the Ogg hierarchy. - * - * This supports ID3v1, ID3v2 and Xiph style comments as well as reading stream - * properties from the file. - */ - - namespace FLAC { - - //! An implementation of TagLib::File with FLAC specific methods - - /*! - * This implements and provides an interface for FLAC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to FLAC files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches Vorbis comments. - XiphComment = 0x0001, - //! Matches ID3v1 tags. - ID3v1 = 0x0002, - //! Matches ID3v2 tags. - ID3v2 = 0x0004, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs a FLAC file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an FLAC file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - // BIC: merge with the above constructor - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a FLAC file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - // BIC: merge with the above constructor - File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be a union of XiphComment, - * ID3v1 and ID3v2 tags. - * - * \see ID3v2Tag() - * \see ID3v1Tag() - * \see XiphComment() - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains more than one tag (e.g. XiphComment and ID3v1), - * only the first one (in the order XiphComment, ID3v2, ID3v1) will be - * converted to the PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &); - - /*! - * Implements the unified property interface -- import function. - * This always creates a Xiph comment, if none exists. The return value - * relates to the Xiph comment only. - * Ignores any changes to ID3v1 or ID3v2 comments since they are not allowed - * in the FLAC specification. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the FLAC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. This will primarily save the XiphComment, but - * will also keep any old ID3-tags up to date. If the file - * has no XiphComment, one will be constructed from the ID3-tags. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the XiphComment for the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid XiphComment. If \a create is true it will create - * a XiphComment if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has a XiphComment. Use hasXiphComment() to check if the - * file on disk actually has a XiphComment. - * - * \note The Tag is still owned by the FLAC::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasXiphComment() - */ - Ogg::XiphComment *xiphComment(bool create = false); - - /*! - * Set the ID3v2::FrameFactory to something other than the default. This - * can be used to specify the way that ID3v2 frames will be interpreted - * when - * - * \see ID3v2FrameFactory - * \deprecated This value should be passed in via the constructor. - */ - TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Returns the block of data used by FLAC::Properties for parsing the - * stream properties. - * - * \deprecated Always returns an empty vector. - */ - TAGLIB_DEPRECATED ByteVector streamInfoData(); // BIC: remove - - /*! - * Returns the length of the audio-stream, used by FLAC::Properties for - * calculating the bitrate. - * - * \deprecated Always returns zero. - */ - TAGLIB_DEPRECATED long streamLength(); // BIC: remove - - /*! - * Returns a list of pictures attached to the FLAC file. - */ - List pictureList(); - - /*! - * Removes an attached picture. If \a del is true the picture's memory - * will be freed; if it is false, it must be deleted by the user. - */ - void removePicture(Picture *picture, bool del = true); - - /*! - * Remove all attached images. - */ - void removePictures(); - - /*! - * Add a new picture to the file. The file takes ownership of the - * picture and will handle freeing its memory. - * - * \note The file will be saved only after calling save(). - */ - void addPicture(Picture *picture); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from - * the file. By default it removes all tags. - * - * \warning This will also invalidate pointers to the tags as their memory - * will be freed. - * - * \note In order to make the removal permanent save() still needs to be - * called. - * - * \note This won't remove the Vorbis comment block completely. The - * vendor ID will be preserved. - */ - void strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has a XiphComment. - * - * \see xiphComment() - */ - bool hasXiphComment() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - /*! - * Returns whether or not the given \a stream can be opened as a FLAC - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - void scan(); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace FLAC -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/flacmetadatablock.h b/taglib/include/taglib/flacmetadatablock.h deleted file mode 100644 index 45c7971..0000000 --- a/taglib/include/taglib/flacmetadatablock.h +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACMETADATABLOCK_H -#define TAGLIB_FLACMETADATABLOCK_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - namespace FLAC { - class TAGLIB_EXPORT MetadataBlock - { - public: - MetadataBlock(); - virtual ~MetadataBlock(); - - enum BlockType { - StreamInfo = 0, - Padding, - Application, - SeekTable, - VorbisComment, - CueSheet, - Picture - }; - - /*! - * Returns the FLAC metadata block type. - */ - virtual int code() const = 0; - - /*! - * Render the content of the block. - */ - virtual ByteVector render() const = 0; - - private: - MetadataBlock(const MetadataBlock &item); - MetadataBlock &operator=(const MetadataBlock &item); - - class MetadataBlockPrivate; - MetadataBlockPrivate *d; - }; - } // namespace FLAC -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/flacpicture.h b/taglib/include/taglib/flacpicture.h deleted file mode 100644 index 2cde3aa..0000000 --- a/taglib/include/taglib/flacpicture.h +++ /dev/null @@ -1,203 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACPICTURE_H -#define TAGLIB_FLACPICTURE_H - -#include "tlist.h" -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "flacmetadatablock.h" - -namespace TagLib { - namespace FLAC { - class TAGLIB_EXPORT Picture : public MetadataBlock - { - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - Picture(); - Picture(const ByteVector &data); - ~Picture(); - - /*! - * Returns the type of the image. - */ - Type type() const; - - /*! - * Sets the type of the image. - */ - void setType(Type type); - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - void setMimeType(const String &m); - - /*! - * Returns a text description of the image. - */ - - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - */ - - void setDescription(const String &desc); - - /*! - * Returns the width of the image. - */ - int width() const; - - /*! - * Sets the width of the image. - */ - void setWidth(int w); - - /*! - * Returns the height of the image. - */ - int height() const; - - /*! - * Sets the height of the image. - */ - void setHeight(int h); - - /*! - * Returns the color depth (in bits-per-pixel) of the image. - */ - int colorDepth() const; - - /*! - * Sets the color depth (in bits-per-pixel) of the image. - */ - void setColorDepth(int depth); - - /*! - * Returns the number of colors used on the image.. - */ - int numColors() const; - - /*! - * Sets the number of colors used on the image (for indexed images). - */ - void setNumColors(int numColors); - - /*! - * Returns the image data. - */ - ByteVector data() const; - - /*! - * Sets the image data. - */ - void setData(const ByteVector &data); - - /*! - * Returns the FLAC metadata block type. - */ - int code() const; - - /*! - * Render the content to the FLAC picture block format. - */ - ByteVector render() const; - - /*! - * Parse the picture data in the FLAC picture block format. - */ - bool parse(const ByteVector &rawData); - - private: - Picture(const Picture &item); - Picture &operator=(const Picture &item); - - class PicturePrivate; - PicturePrivate *d; - }; - - typedef List PictureList; - } // namespace FLAC -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/flacproperties.h b/taglib/include/taglib/flacproperties.h deleted file mode 100644 index e58f9ae..0000000 --- a/taglib/include/taglib/flacproperties.h +++ /dev/null @@ -1,148 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACPROPERTIES_H -#define TAGLIB_FLACPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace FLAC { - - class File; - - //! An implementation of audio property reading for FLAC - - /*! - * This reads the data from an FLAC stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of FLAC::Properties with the data read from the - * ByteVector \a data. - */ - // BIC: switch to const reference - Properties(ByteVector data, long streamLength, ReadStyle style = Average); - - /*! - * Create an instance of FLAC::Properties with the data read from the - * FLAC::File \a file. - */ - // BIC: remove - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this FLAC::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample as read from the FLAC - * identification header. - */ - int bitsPerSample() const; - - /*! - * Returns the sample width as read from the FLAC identification - * header. - * - * \note This method is just an alias of bitsPerSample(). - * - * \deprecated Use bitsPerSample(). - */ - TAGLIB_DEPRECATED int sampleWidth() const; - - /*! - * Return the number of sample frames. - */ - unsigned long long sampleFrames() const; - - /*! - * Returns the MD5 signature of the uncompressed audio stream as read - * from the stream info header. - */ - ByteVector signature() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(const ByteVector &data, long streamLength); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace FLAC -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/generalencapsulatedobjectframe.h b/taglib/include/taglib/generalencapsulatedobjectframe.h deleted file mode 100644 index cb797b8..0000000 --- a/taglib/include/taglib/generalencapsulatedobjectframe.h +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - - copyright : (C) 2006 by Aaron VonderHaar - email : avh4@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_GENERALENCAPSULATEDOBJECT_H -#define TAGLIB_GENERALENCAPSULATEDOBJECT_H - -#include "id3v2frame.h" -#include "id3v2header.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 general encapsulated object frame implementation - - /*! - * This is an implementation of ID3v2 general encapsulated objects. - * Arbitrary binary data may be included in tags, stored in GEOB frames. - * There may be multiple GEOB frames in a single tag. Each GEOB it - * labelled with a content description (which may be blank), a required - * mime-type, and a file name (may be blank). The content description - * uniquely identifies the GEOB frame in the tag. - */ - - class TAGLIB_EXPORT GeneralEncapsulatedObjectFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * Constructs an empty object frame. The description, file name and text - * encoding should be set manually. - */ - GeneralEncapsulatedObjectFrame(); - - /*! - * Constructs a GeneralEncapsulatedObjectFrame frame based on \a data. - * - * \warning This is \em not data for the encapsulated object, for that use - * setObject(). This constructor is used when reading the frame from the - * disk. - */ - explicit GeneralEncapsulatedObjectFrame(const ByteVector &data); - - /*! - * Destroys the GeneralEncapsulatedObjectFrame instance. - */ - virtual ~GeneralEncapsulatedObjectFrame(); - - /*! - * Returns a string containing the description, file name and mime-type - */ - virtual String toString() const; - - /*! - * Returns the text encoding used for the description and file name. - * - * \see setTextEncoding() - * \see description() - * \see fileName() - */ - String::Type textEncoding() const; - - /*! - * Set the text encoding used for the description and file name. - * - * \see description() - * \see fileName() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns the mime type of the object. - */ - String mimeType() const; - - /*! - * Sets the mime type of the object. - */ - void setMimeType(const String &type); - - /*! - * Returns the file name of the object. - * - * \see setFileName() - */ - String fileName() const; - - /*! - * Sets the file name for the object. - * - * \see fileName() - */ - void setFileName(const String &name); - - /*! - * Returns the content description of the object. - * - * \see setDescription() - * \see textEncoding() - * \see setTextEncoding() - */ - - String description() const; - - /*! - * Sets the content description of the object to \a desc. - * - * \see description() - * \see textEncoding() - * \see setTextEncoding() - */ - - void setDescription(const String &desc); - - /*! - * Returns the object data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setObject() - * \see mimeType() - */ - ByteVector object() const; - - /*! - * Sets the object data to \a data. \a data should be of the type specified in - * this frame's mime-type specification. - * - * \see object() - * \see mimeType() - * \see setMimeType() - */ - void setObject(const ByteVector &object); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h); - GeneralEncapsulatedObjectFrame(const GeneralEncapsulatedObjectFrame &); - GeneralEncapsulatedObjectFrame &operator=(const GeneralEncapsulatedObjectFrame &); - - class GeneralEncapsulatedObjectFramePrivate; - GeneralEncapsulatedObjectFramePrivate *d; - }; - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/id3v1genres.h b/taglib/include/taglib/id3v1genres.h deleted file mode 100644 index 92feb34..0000000 --- a/taglib/include/taglib/id3v1genres.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V1GENRE_H -#define TAGLIB_ID3V1GENRE_H - -#include "tmap.h" -#include "tstringlist.h" -#include "taglib_export.h" - -namespace TagLib { - namespace ID3v1 { - - typedef Map GenreMap; - - /*! - * Returns the list of canonical ID3v1 genre names in the order that they - * are listed in the standard. - */ - StringList TAGLIB_EXPORT genreList(); - - /*! - * A "reverse mapping" that goes from the canonical ID3v1 genre name to the - * respective genre number. genreMap()["Rock"] == - */ - GenreMap TAGLIB_EXPORT genreMap(); - - /*! - * Returns the name of the genre at \a index in the ID3v1 genre list. If - * \a index is out of range -- less than zero or greater than 191 -- a null - * string will be returned. - */ - String TAGLIB_EXPORT genre(int index); - - /*! - * Returns the genre index for the (case sensitive) genre \a name. If the - * genre is not in the list 255 (which signifies an unknown genre in ID3v1) - * will be returned. - */ - int TAGLIB_EXPORT genreIndex(const String &name); - } // namespace ID3v1 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/id3v1tag.h b/taglib/include/taglib/id3v1tag.h deleted file mode 100644 index 5803312..0000000 --- a/taglib/include/taglib/id3v1tag.h +++ /dev/null @@ -1,202 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V1TAG_H -#define TAGLIB_ID3V1TAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class File; - - //! An ID3v1 implementation - - namespace ID3v1 { - - //! A abstraction for the string to data encoding in ID3v1 tags. - - /*! - * ID3v1 should in theory always contain ISO-8859-1 (Latin1) data. In - * practice it does not. TagLib by default only supports ISO-8859-1 data - * in ID3v1 tags. - * - * However by subclassing this class and reimplementing parse() and render() - * and setting your reimplementation as the default with - * ID3v1::Tag::setStringHandler() you can define how you would like these - * transformations to be done. - * - * \warning It is advisable not to write non-ISO-8859-1 data to ID3v1 - * tags. Please consider disabling the writing of ID3v1 tags in the case - * that the data is not ISO-8859-1. - * - * \see ID3v1::Tag::setStringHandler() - */ - - class TAGLIB_EXPORT StringHandler - { - TAGLIB_IGNORE_MISSING_DESTRUCTOR - public: - // BIC: Add virtual destructor. - StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an ISO-8859-1 (Latin1) character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. The default implementation - * assumes that \a s is an ISO-8859-1 (Latin1) string. If the string is - * does not conform to ISO-8859-1, no value is written. - * - * \warning It is recommended that you not override this method, but - * instead do not write an ID3v1 tag in the case that the data is not - * ISO-8859-1. - */ - virtual ByteVector render(const String &s) const; - }; - - //! The main class in the ID3v1 implementation - - /*! - * This is an implementation of the ID3v1 format. ID3v1 is both the simplest - * and most common of tag formats but is rather limited. Because of its - * pervasiveness and the way that applications have been written around the - * fields that it provides, the generic TagLib::Tag API is a mirror of what is - * provided by ID3v1. - * - * ID3v1 tags should generally only contain Latin1 information. However because - * many applications do not follow this rule there is now support for overriding - * the ID3v1 string handling using the ID3v1::StringHandler class. Please see - * the documentation for that class for more information. - * - * \see StringHandler - * - * \note Most fields are truncated to a maximum of 28-30 bytes. The - * truncation happens automatically when the tag is rendered. - */ - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Create an ID3v1 tag with default values. - */ - Tag(); - - /*! - * Create an ID3v1 tag and parse the data in \a file starting at - * \a tagOffset. - */ - Tag(File *file, long tagOffset); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Renders the in memory values to a ByteVector suitable for writing to - * the file. - */ - ByteVector render() const; - - /*! - * Returns the string "TAG" suitable for usage in locating the tag in a - * file. - */ - static ByteVector fileIdentifier(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual unsigned int year() const; - virtual unsigned int track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(unsigned int i); - virtual void setTrack(unsigned int i); - - /*! - * Returns the genre in number. - * - * \note Normally 255 indicates that this tag contains no genre. - */ - unsigned int genreNumber() const; - - /*! - * Sets the genre in number to \a i. - * - * \note Valid value is from 0 up to 255. Normally 255 indicates that - * this tag contains no genre. - */ - void setGenreNumber(unsigned int i); - - /*! - * Sets the string handler that decides how the ID3v1 data will be - * converted to and from binary data. - * If the parameter \a handler is null, the previous handler is - * released and default ISO-8859-1 handler is restored. - * - * \note The caller is responsible for deleting the previous handler - * as needed after it is released. - * - * \see StringHandler - */ - static void setStringHandler(const StringHandler *handler); - - protected: - /*! - * Reads from the file specified in the constructor. - */ - void read(); - /*! - * Pareses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } // namespace ID3v1 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/id3v2.h b/taglib/include/taglib/id3v2.h deleted file mode 100644 index 36e7642..0000000 --- a/taglib/include/taglib/id3v2.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef TAGLIB_ID3V2_H -#define TAGLIB_ID3V2_H - -namespace TagLib { - //! An ID3v2 implementation - - /*! - * This is a relatively complete and flexible framework for working with ID3v2 - * tags. - * - * \see ID3v2::Tag - */ - namespace ID3v2 { - /*! - * Used to specify which version of the ID3 standard to use when saving tags. - */ - enum Version { - v3 = 3, //3.2) - */ - - class TAGLIB_EXPORT ExtendedHeader - { - public: - /*! - * Constructs an empty ID3v2 extended header. - */ - ExtendedHeader(); - - /*! - * Destroys the extended header. - */ - virtual ~ExtendedHeader(); - - /*! - * Returns the size of the extended header. This is variable for the - * extended header. - */ - unsigned int size() const; - - /*! - * Sets the data that will be used as the extended header. Since the - * length is not known before the extended header has been parsed, this - * should just be a pointer to the first byte of the extended header. It - * will determine the length internally and make that available through - * size(). - */ - void setData(const ByteVector &data); - - protected: - /*! - * Called by setData() to parse the extended header data. It makes this - * information available through the public API. - */ - void parse(const ByteVector &data); - - private: - ExtendedHeader(const ExtendedHeader &); - ExtendedHeader &operator=(const ExtendedHeader &); - - class ExtendedHeaderPrivate; - ExtendedHeaderPrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/id3v2footer.h b/taglib/include/taglib/id3v2footer.h deleted file mode 100644 index 12c51c3..0000000 --- a/taglib/include/taglib/id3v2footer.h +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FOOTER_H -#define TAGLIB_ID3V2FOOTER_H - -#include "taglib_export.h" -#include "tbytevector.h" - -namespace TagLib { - - namespace ID3v2 { - - class Header; - - //! ID3v2 footer implementation - - /*! - * Per the ID3v2 specification, the tag's footer is just a copy of the - * information in the header. As such there is no API for reading the - * data from the header, it can just as easily be done from the header. - * - * In fact, at this point, TagLib does not even parse the footer since - * it is not useful internally. However, if the flag to include a footer - * has been set in the ID3v2::Tag, TagLib will render a footer. - */ - - class TAGLIB_EXPORT Footer - { - public: - /*! - * Constructs an empty ID3v2 footer. - */ - Footer(); - /*! - * Destroys the footer. - */ - virtual ~Footer(); - - /*! - * Returns the size of the footer. Presently this is always 10 bytes. - */ - static unsigned int size(); - - /*! - * Renders the footer based on the data in \a header. - */ - ByteVector render(const Header *header) const; - - private: - Footer(const Footer &); - Footer &operator=(const Footer &); - - class FooterPrivate; - FooterPrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/id3v2frame.h b/taglib/include/taglib/id3v2frame.h deleted file mode 100644 index 5beeddb..0000000 --- a/taglib/include/taglib/id3v2frame.h +++ /dev/null @@ -1,523 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FRAME_H -#define TAGLIB_ID3V2FRAME_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class StringList; - class PropertyMap; - - namespace ID3v2 { - - class Tag; - class FrameFactory; - - //! ID3v2 frame implementation - - /*! - * This class is the main ID3v2 frame implementation. In ID3v2, a tag is - * split between a collection of frames (which are in turn split into fields - * (Structure, 4) - * (Frames). This class provides an API for - * gathering information about and modifying ID3v2 frames. Functionality - * specific to a given frame type is handed in one of the many subclasses. - */ - - class TAGLIB_EXPORT Frame - { - friend class Tag; - friend class FrameFactory; - friend class TableOfContentsFrame; - friend class ChapterFrame; - - public: - - /*! - * Creates a textual frame which corresponds to a single key in the PropertyMap - * interface. These are all (User)TextIdentificationFrames except TIPL and TMCL, - * all (User)URLLinkFrames, CommentsFrames, and UnsynchronizedLyricsFrame. - */ - static Frame *createTextualFrame(const String &key, const StringList &values); - - /*! - * Destroys this Frame instance. - */ - virtual ~Frame(); - - /*! - * Returns the Frame ID (Structure, 4) - * (Frames, 4) - */ - ByteVector frameID() const; - - /*! - * Returns the size of the frame. - */ - unsigned int size() const; - - /*! - * Returns the size of the frame header - * - * \deprecated This is only accurate for ID3v2.3 or ID3v2.4. Please use - * the call below which accepts an ID3v2 version number. In the next - * non-binary compatible release this will be made into a non-static - * member that checks the internal ID3v2 version. - */ - static unsigned int headerSize(); // BIC: make non-static - - /*! - * Returns the size of the frame header for the given ID3v2 version. - * - * \deprecated Please see the explanation above. - */ - // BIC: remove - static unsigned int headerSize(unsigned int version); - - /*! - * Sets the data that will be used as the frame. Since the length is not - * known before the frame has been parsed, this should just be a pointer to - * the first byte of the frame. It will determine the length internally - * and make that available through size(). - */ - void setData(const ByteVector &data); - - /*! - * Set the text of frame in the sanest way possible. This should only be - * reimplemented in frames where there is some logical mapping to text. - * - * \note If the frame type supports multiple text encodings, this will not - * change the text encoding of the frame; the string will be converted to - * that frame's encoding. Please use the specific APIs of the frame types - * to set the encoding if that is desired. - */ - virtual void setText(const String &text); - - /*! - * This returns the textual representation of the data in the frame. - * Subclasses must reimplement this method to provide a string - * representation of the frame's data. - */ - virtual String toString() const = 0; - - /*! - * Render the frame back to its binary format in a ByteVector. - */ - ByteVector render() const; - - /*! - * Returns the text delimiter that is used between fields for the string - * type \a t. - */ - static ByteVector textDelimiter(String::Type t); - - /*! - * The string with which an instrument name is prefixed to build a key in a PropertyMap; - * used to translate PropertyMaps to TMCL frames. In the current implementation, this - * is "PERFORMER:". - */ - static const String instrumentPrefix; - /*! - * The PropertyMap key prefix which triggers the use of a COMM frame instead of a TXXX - * frame for a non-standard key. In the current implementation, this is "COMMENT:". - */ - static const String commentPrefix; - /*! - * The PropertyMap key prefix which triggers the use of a USLT frame instead of a TXXX - * frame for a non-standard key. In the current implementation, this is "LYRICS:". - */ - static const String lyricsPrefix; - /*! - * The PropertyMap key prefix which triggers the use of a WXXX frame instead of a TXX - * frame for a non-standard key. In the current implementation, this is "URL:". - */ - static const String urlPrefix; - - protected: - class Header; - - /*! - * Constructs an ID3v2 frame using \a data to read the header information. - * All other processing of \a data should be handled in a subclass. - * - * \note This need not contain anything more than a frame ID, but - * \e must contain at least that. - */ - explicit Frame(const ByteVector &data); - - /*! - * This creates an Frame using the header \a h. - * - * The ownership of this header will be assigned to the frame and the - * header will be deleted when the frame is destroyed. - */ - Frame(Header *h); - - /*! - * Returns a pointer to the frame header. - */ - Header *header() const; - - /*! - * Sets the header to \a h. If \a deleteCurrent is true, this will free - * the memory of the current header. - * - * The ownership of this header will be assigned to the frame and the - * header will be deleted when the frame is destroyed. - */ - void setHeader(Header *h, bool deleteCurrent = true); - - /*! - * Called by setData() to parse the frame data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - /*! - * Called by parse() to parse the field data. It makes this information - * available through the public API. This must be overridden by the - * subclasses. - */ - virtual void parseFields(const ByteVector &data) = 0; - - /*! - * Render the field data back to a binary format in a ByteVector. This - * must be overridden by subclasses. - */ - virtual ByteVector renderFields() const = 0; - - /*! - * Returns a ByteVector containing the field data given the frame data. - * This correctly adjusts for the header size plus any additional frame - * data that's specified in the frame header flags. - */ - ByteVector fieldData(const ByteVector &frameData) const; - - /*! - * Reads a String of type \a encoding from the ByteVector \a data. If \a - * position is passed in it is used both as the starting point and is - * updated to return the position just after the string that has been read. - * This is useful for reading strings sequentially. - */ - String readStringField(const ByteVector &data, String::Type encoding, - int *position = 0); - - /*! - * Checks a the list of string values to see if they can be used with the - * specified encoding and returns the recommended encoding. - */ - // BIC: remove and make non-static - static String::Type checkEncoding(const StringList &fields, - String::Type encoding); - - /*! - * Checks a the list of string values to see if they can be used with the - * specified encoding and returns the recommended encoding. This method - * also checks the ID3v2 version and makes sure the encoding can be used - * in the specified version. - */ - // BIC: remove and make non-static - static String::Type checkEncoding(const StringList &fields, - String::Type encoding, unsigned int version); - - /*! - * Checks a the list of string values to see if they can be used with the - * specified encoding and returns the recommended encoding. This method - * also checks the ID3v2 version and makes sure the encoding can be used - * in the version specified by the frame's header. - */ - String::Type checkTextEncoding(const StringList &fields, - String::Type encoding) const; - - - /*! - * Parses the contents of this frame as PropertyMap. If that fails, the returned - * PropertyMap will be empty, and its unsupportedData() will contain this frame's - * ID. - * BIC: Will be a virtual function in future releases. - */ - PropertyMap asProperties() const; - - /*! - * Returns an appropriate ID3 frame ID for the given free-form tag key. This method - * will return an empty ByteVector if no specialized translation is found. - */ - static ByteVector keyToFrameID(const String &); - - /*! - * Returns a free-form tag name for the given ID3 frame ID. Note that this does not work - * for general frame IDs such as TXXX or WXXX; in such a case an empty string is returned. - */ - static String frameIDToKey(const ByteVector &); - - /*! - * Returns an appropriate TXXX frame description for the given free-form tag key. - */ - static String keyToTXXX(const String &); - - /*! - * Returns a free-form tag name for the given ID3 frame description. - */ - static String txxxToKey(const String &); - - /*! - * This helper function splits the PropertyMap \a original into three ProperytMaps - * \a singleFrameProperties, \a tiplProperties, and \a tmclProperties, such that: - * - \a singleFrameProperties contains only of keys which can be represented with - * exactly one ID3 frame per key. In the current implementation - * this is everything except for the fixed "involved people" keys and keys of the - * form "TextIdentificationFrame::instrumentPrefix" + "instrument", which are - * mapped to a TMCL frame. - * - \a tiplProperties will consist of those keys that are present in - * TextIdentificationFrame::involvedPeopleMap() - * - \a tmclProperties contains the "musician credits" keys which should be mapped - * to a TMCL frame - */ - static void splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties, - PropertyMap &tiplProperties, PropertyMap &tmclProperties); - - private: - Frame(const Frame &); - Frame &operator=(const Frame &); - - class FramePrivate; - friend class FramePrivate; - FramePrivate *d; - }; - - //! ID3v2 frame header implementation - - /*! - * The ID3v2 Frame Header (Structure, 4) - * - * Every ID3v2::Frame has an associated header that gives some general - * properties of the frame and also makes it possible to identify the frame - * type. - * - * As such when reading an ID3v2 tag ID3v2::FrameFactory first creates the - * frame headers and then creates the appropriate Frame subclass based on - * the type and attaches the header. - */ - - class TAGLIB_EXPORT Frame::Header - { - public: - /*! - * Construct a Frame Header based on \a data. \a data must at least - * contain a 4 byte frame ID, and optionally can contain flag data and the - * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. - * - * \deprecated Please use the constructor below that accepts a version - * number. - */ - TAGLIB_DEPRECATED Header(const ByteVector &data, bool synchSafeInts); - - /*! - * Construct a Frame Header based on \a data. \a data must at least - * contain a 4 byte frame ID, and optionally can contain flag data and the - * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. - * - * \a version should be the ID3v2 version of the tag. - */ - explicit Header(const ByteVector &data, unsigned int version = 4); - - /*! - * Destroys this Header instance. - */ - virtual ~Header(); - - /*! - * Sets the data for the Header. - * - * \deprecated Please use the version below that accepts an ID3v2 version - * number. - */ - TAGLIB_DEPRECATED void setData(const ByteVector &data, bool synchSafeInts); - - /*! - * Sets the data for the Header. \a version should indicate the ID3v2 - * version number of the tag that this frame is contained in. - */ - void setData(const ByteVector &data, unsigned int version = 4); - - /*! - * Returns the Frame ID (Structure, 4) - * (Frames, 4) - */ - ByteVector frameID() const; - - /*! - * Sets the frame's ID to \a id. Only the first four bytes of \a id will - * be used. - * - * \warning This method should in general be avoided. It exists simply to - * provide a mechanism for transforming frames from a deprecated frame type - * to a newer one -- i.e. TYER to TDRC from ID3v2.3 to ID3v2.4. - */ - void setFrameID(const ByteVector &id); - - /*! - * Returns the size of the frame data portion, as set when setData() was - * called or set explicitly via setFrameSize(). - */ - unsigned int frameSize() const; - - /*! - * Sets the size of the frame data portion. - */ - void setFrameSize(unsigned int size); - - /*! - * Returns the ID3v2 version of the header, as passed in from the - * construction of the header or set via setVersion(). - */ - unsigned int version() const; - - /*! - * Sets the ID3v2 version of the header, changing has impact on the - * correct parsing/rendering of frame data. - */ - void setVersion(unsigned int version); - - /*! - * Returns the size of the frame header in bytes. - * - * \deprecated Please use the version of this method that accepts a - * version. This is only accurate for ID3v2.3 and ID3v2.4. This will be - * removed in the next binary incompatible release (2.0) and will be - * replaced with a non-static method that checks the frame version. - */ - // BIC: make non-static - static unsigned int size(); - - /*! - * Returns the size of the frame header in bytes for the ID3v2 version - * that's given. - * - * \deprecated Please see the explanation in the version above. - */ - // BIC: remove - static unsigned int size(unsigned int version); - - /*! - * Returns true if the flag for tag alter preservation is set. - * - * The semantics are a little backwards from what would seem natural - * (setting the preservation flag to throw away the frame), but this - * follows the ID3v2 standard. - * - * \see setTagAlterPreservation() - */ - bool tagAlterPreservation() const; - - /*! - * Sets the flag for preservation of this frame if the tag is set. If - * this is set to true the frame will not be written when the tag is - * saved. - * - * The semantics are a little backwards from what would seem natural - * (setting the preservation flag to throw away the frame), but this - * follows the ID3v2 standard. - * - * \see tagAlterPreservation() - */ - void setTagAlterPreservation(bool discard); - - /*! - * Returns true if the flag for file alter preservation is set. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool fileAlterPreservation() const; - - /*! - * Returns true if the frame is meant to be read only. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool readOnly() const; - - /*! - * Returns true if the flag for the grouping identity is set. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool groupingIdentity() const; - - /*! - * Returns true if compression is enabled for this frame. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool compression() const; - - /*! - * Returns true if encryption is enabled for this frame. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool encryption() const; - -#ifndef DO_NOT_DOCUMENT - bool unsycronisation() const; -#endif - - /*! - * Returns true if unsynchronisation is enabled for this frame. - */ - bool unsynchronisation() const; - - /*! - * Returns true if the flag for a data length indicator is set. - */ - bool dataLengthIndicator() const; - - /*! - * Render the Header back to binary format in a ByteVector. - */ - ByteVector render() const; - - /*! - * \deprecated Use fileAlterPreservation(). - */ - TAGLIB_DEPRECATED bool frameAlterPreservation() const; - - private: - Header(const Header &); - Header &operator=(const Header &); - - class HeaderPrivate; - HeaderPrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/id3v2framefactory.h b/taglib/include/taglib/id3v2framefactory.h deleted file mode 100644 index 95e08d5..0000000 --- a/taglib/include/taglib/id3v2framefactory.h +++ /dev/null @@ -1,169 +0,0 @@ - /*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FRAMEFACTORY_H -#define TAGLIB_ID3V2FRAMEFACTORY_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "id3v2frame.h" -#include "id3v2header.h" - -namespace TagLib { - - namespace ID3v2 { - - class TextIdentificationFrame; - - //! A factory for creating ID3v2 frames during parsing - - /*! - * This factory abstracts away the frame creation process and instantiates - * the appropriate ID3v2::Frame subclasses based on the contents of the - * data. - * - * Reimplementing this factory is the key to adding support for frame types - * not directly supported by TagLib to your application. To do so you would - * subclass this factory and reimplement createFrame(). Then by setting your - * factory to be the default factory in ID3v2::Tag constructor you can - * implement behavior that will allow for new ID3v2::Frame subclasses (also - * provided by you) to be used. - * - * This implements both abstract factory and singleton patterns - * of which more information is available on the web and in software design - * textbooks (Notably Design Patters). - * - * \note You do not need to use this factory to create new frames to add to - * an ID3v2::Tag. You can instantiate frame subclasses directly (with new) - * and add them to a tag using ID3v2::Tag::addFrame() - * - * \see ID3v2::Tag::addFrame() - */ - - class TAGLIB_EXPORT FrameFactory - { - public: - static FrameFactory *instance(); - /*! - * Create a frame based on \a data. \a synchSafeInts should only be set - * false if we are parsing an old tag (v2.3 or older) that does not support - * synchsafe ints. - * - * \deprecated Please use the method below that accepts a ID3v2::Header - * instance in new code. - */ - TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, bool synchSafeInts) const; - - /*! - * Create a frame based on \a data. \a version should indicate the ID3v2 - * version of the tag. As ID3v2.4 is the most current version of the - * standard 4 is the default. - * - * \deprecated Please use the method below that accepts a ID3v2::Header - * instance in new code. - */ - TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, unsigned int version = 4) const; - - /*! - * \deprecated Use createFrame(const ByteVector &, const Header *) const. - */ - // BIC: remove - Frame *createFrame(const ByteVector &data, Header *tagHeader) const; - /*! - * Create a frame based on \a data. \a tagHeader should be a valid - * ID3v2::Header instance. - */ - // BIC: make virtual - Frame *createFrame(const ByteVector &data, const Header *tagHeader) const; - - /*! - * After a tag has been read, this tries to rebuild some of them - * information, most notably the recording date, from frames that - * have been deprecated and can't be upgraded directly. - */ - // BIC: Make virtual - void rebuildAggregateFrames(ID3v2::Tag *tag) const; - - /*! - * Returns the default text encoding for text frames. If setTextEncoding() - * has not been explicitly called this will only be used for new text - * frames. However, if this value has been set explicitly all frames will be - * converted to this type (unless it's explicitly set differently for the - * individual frame) when being rendered. - * - * \see setDefaultTextEncoding() - */ - String::Type defaultTextEncoding() const; - - /*! - * Set the default text encoding for all text frames that are created to - * \a encoding. If no value is set the frames with either default to the - * encoding type that was parsed and new frames default to Latin1. - * - * Valid string types for ID3v2 tags are Latin1, UTF8, UTF16 and UTF16BE. - * - * \see defaultTextEncoding() - */ - void setDefaultTextEncoding(String::Type encoding); - - protected: - /*! - * Constructs a frame factory. Because this is a singleton this method is - * protected, but may be used for subclasses. - */ - FrameFactory(); - - /*! - * Destroys the frame factory. - */ - virtual ~FrameFactory(); - - /*! - * This method checks for compliance to the current ID3v2 standard (2.4) - * and does nothing in the common case. However if a frame is found that - * is not compatible with the current standard, this method either updates - * the frame or indicates that it should be discarded. - * - * This method with return true (with or without changes to the frame) if - * this frame should be kept or false if it should be discarded. - * - * See the id3v2.4.0-changes.txt document for further information. - */ - virtual bool updateFrame(Frame::Header *header) const; - - private: - FrameFactory(const FrameFactory &); - FrameFactory &operator=(const FrameFactory &); - - static FrameFactory factory; - - class FrameFactoryPrivate; - FrameFactoryPrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/id3v2header.h b/taglib/include/taglib/id3v2header.h deleted file mode 100644 index edfe417..0000000 --- a/taglib/include/taglib/id3v2header.h +++ /dev/null @@ -1,176 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2HEADER_H -#define TAGLIB_ID3V2HEADER_H - -#include "tbytevector.h" -#include "taglib_export.h" -#include "id3v2.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 headers - - /*! - * This class implements ID3v2 headers. It attempts to follow, both - * semantically and programmatically, the structure specified in - * the ID3v2 standard. The API is based on the properties of ID3v2 headers - * specified there. If any of the terms used in this documentation are - * unclear please check the specification in the linked section. - * (Structure, 3.1) - */ - - class TAGLIB_EXPORT Header - { - public: - /*! - * Constructs an empty ID3v2 header. - */ - Header(); - - /*! - * Constructs an ID3v2 header based on \a data. parse() is called - * immediately. - */ - Header(const ByteVector &data); - - /*! - * Destroys the header. - */ - virtual ~Header(); - - /*! - * Returns the major version number. (Note: This is the 4, not the 2 in - * ID3v2.4.0. The 2 is implied.) - */ - unsigned int majorVersion() const; - - /*! - * Set the the major version number to \a version. (Note: This is - * the 4, not the 2 in ID3v2.4.0. The 2 is implied.) - * \see majorVersion() - * - * \note This is used by the internal parser; this will not change the - * version which is written and in general should not be called by API - * users. - */ - void setMajorVersion(unsigned int version); - - /*! - * Returns the revision number. (Note: This is the 0, not the 4 in - * ID3v2.4.0. The 2 is implied.) - */ - unsigned int revisionNumber() const; - - /*! - * Returns true if unsynchronisation has been applied to all frames. - */ - bool unsynchronisation() const; - - /*! - * Returns true if an extended header is present in the tag. - */ - bool extendedHeader() const; - - /*! - * Returns true if the experimental indicator flag is set. - */ - bool experimentalIndicator() const; - - /*! - * Returns true if a footer is present in the tag. - */ - bool footerPresent() const; - /*! - * Returns the tag size in bytes. This is the size of the frame content. - * The size of the \e entire tag will be this plus the header size (10 - * bytes) and, if present, the footer size (potentially another 10 bytes). - * - * \note This is the value as read from the header to which TagLib attempts - * to provide an API to; it was not a design decision on the part of TagLib - * to not include the mentioned portions of the tag in the \e size. - * - * \see completeTagSize() - */ - unsigned int tagSize() const; - - /*! - * Returns the tag size, including the header and, if present, the footer - * size. - * - * \see tagSize() - */ - unsigned int completeTagSize() const; - - /*! - * Set the tag size to \a s. - * \see tagSize() - */ - void setTagSize(unsigned int s); - - /*! - * Returns the size of the header. Presently this is always 10 bytes. - */ - static unsigned int size(); - - /*! - * Returns the string used to identify and ID3v2 tag inside of a file. - * Presently this is always "ID3". - */ - static ByteVector fileIdentifier(); - - /*! - * Sets the data that will be used as the header. 10 bytes, starting from - * the beginning of \a data are used. - */ - void setData(const ByteVector &data); - - /*! - * Renders the Header back to binary format. - */ - ByteVector render() const; - - protected: - /*! - * Called by setData() to parse the header data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - private: - Header(const Header &); - Header &operator=(const Header &); - - class HeaderPrivate; - HeaderPrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/id3v2synchdata.h b/taglib/include/taglib/id3v2synchdata.h deleted file mode 100644 index 0edce13..0000000 --- a/taglib/include/taglib/id3v2synchdata.h +++ /dev/null @@ -1,70 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2SYNCHDATA_H -#define TAGLIB_ID3V2SYNCHDATA_H - -#include "tbytevector.h" -#include "taglib.h" - -namespace TagLib { - - namespace ID3v2 { - - //! A few functions for ID3v2 synch safe integer conversion - - /*! - * In the ID3v2.4 standard most integer values are encoded as "synch safe" - * integers which are encoded in such a way that they will not give false - * MPEG syncs and confuse MPEG decoders. This namespace provides some - * methods for converting to and from these values to ByteVectors for - * things rendering and parsing ID3v2 data. - */ - - namespace SynchData - { - /*! - * This returns the unsigned integer value of \a data where \a data is a - * ByteVector that contains a \e synchsafe integer (Structure, - * 6.2). The default \a length of - * 4 is used if another value is not specified. - */ - TAGLIB_EXPORT unsigned int toUInt(const ByteVector &data); - - /*! - * Returns a 4 byte (32 bit) synchsafe integer based on \a value. - */ - TAGLIB_EXPORT ByteVector fromUInt(unsigned int value); - - /*! - * Convert the data from unsynchronized data to its original format. - */ - TAGLIB_EXPORT ByteVector decode(const ByteVector &input); - } // namespace SynchData - - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/id3v2tag.h b/taglib/include/taglib/id3v2tag.h deleted file mode 100644 index b0b6174..0000000 --- a/taglib/include/taglib/id3v2tag.h +++ /dev/null @@ -1,411 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2TAG_H -#define TAGLIB_ID3V2TAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "tstring.h" -#include "tlist.h" -#include "tmap.h" -#include "taglib_export.h" - -#include "id3v2.h" -#include "id3v2framefactory.h" - -namespace TagLib { - - class File; - - namespace ID3v2 { - - class Header; - class ExtendedHeader; - class Footer; - - typedef List FrameList; - typedef Map FrameListMap; - - //! An abstraction for the ISO-8859-1 string to data encoding in ID3v2 tags. - - /*! - * ID3v2 tag can store strings in ISO-8859-1 (Latin1), and TagLib only - * supports genuine ISO-8859-1 by default. However, in practice, non - * ISO-8859-1 encodings are often used instead of ISO-8859-1, such as - * Windows-1252 for western languages, Shift_JIS for Japanese and so on. - * - * Here is an option to read such tags by subclassing this class, - * reimplementing parse() and setting your reimplementation as the default - * with ID3v2::Tag::setStringHandler(). - * - * \note Writing non-ISO-8859-1 tags is not implemented intentionally. - * Use UTF-16 or UTF-8 instead. - * - * \see ID3v2::Tag::setStringHandler() - */ - class TAGLIB_EXPORT Latin1StringHandler - { - public: - Latin1StringHandler(); - virtual ~Latin1StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an ISO-8859-1 (Latin1) character array. - */ - virtual String parse(const ByteVector &data) const; - }; - - //! The main class in the ID3v2 implementation - - /*! - * This is the main class in the ID3v2 implementation. It serves two - * functions. This first, as is obvious from the public API, is to provide a - * container for the other ID3v2 related classes. In addition, through the - * read() and parse() protected methods, it provides the most basic level of - * parsing. In these methods the ID3v2 tag is extracted from the file and - * split into data components. - * - * ID3v2 tags have several parts, TagLib attempts to provide an interface - * for them all. header(), footer() and extendedHeader() correspond to those - * data structures in the ID3v2 standard and the APIs for the classes that - * they return attempt to reflect this. - * - * Also ID3v2 tags are built up from a list of frames, which are in turn - * have a header and a list of fields. TagLib provides two ways of accessing - * the list of frames that are in a given ID3v2 tag. The first is simply - * via the frameList() method. This is just a list of pointers to the frames. - * The second is a map from the frame type -- i.e. "COMM" for comments -- and - * a list of frames of that type. (In some cases ID3v2 allows for multiple - * frames of the same type, hence this being a map to a list rather than just - * a map to an individual frame.) - * - * More information on the structure of frames can be found in the ID3v2::Frame - * class. - * - * read() and parse() pass binary data to the other ID3v2 class structures, - * they do not handle parsing of flags or fields, for instance. Those are - * handled by similar functions within those classes. - * - * \note All pointers to data structures within the tag will become invalid - * when the tag is destroyed. - * - * \warning Dealing with the nasty details of ID3v2 is not for the faint of - * heart and should not be done without much meditation on the spec. It's - * rather long, but if you're planning on messing with this class and others - * that deal with the details of ID3v2 (rather than the nice, safe, abstract - * TagLib::Tag and friends), it's worth your time to familiarize yourself - * with said spec (which is distributed with the TagLib sources). TagLib - * tries to do most of the work, but with a little luck, you can still - * convince it to generate invalid ID3v2 tags. The APIs for ID3v2 assume a - * working knowledge of ID3v2 structure. You're been warned. - */ - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Constructs an empty ID3v2 tag. - * - * \note You must create at least one frame for this tag to be valid. - */ - Tag(); - - /*! - * Constructs an ID3v2 tag read from \a file starting at \a tagOffset. - * \a factory specifies which FrameFactory will be used for the - * construction of new frames. - * - * \note You should be able to ignore the \a factory parameter in almost - * all situations. You would want to specify your own FrameFactory - * subclass in the case that you are extending TagLib to support additional - * frame types, which would be incorporated into your factory. - * - * \see FrameFactory - */ - Tag(File *file, long tagOffset, - const FrameFactory *factory = FrameFactory::instance()); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual unsigned int year() const; - virtual unsigned int track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(unsigned int i); - virtual void setTrack(unsigned int i); - - virtual bool isEmpty() const; - - /*! - * Returns a pointer to the tag's header. - */ - Header *header() const; - - /*! - * Returns a pointer to the tag's extended header or null if there is no - * extended header. - */ - ExtendedHeader *extendedHeader() const; - - /*! - * Returns a pointer to the tag's footer or null if there is no footer. - * - * \deprecated I don't see any reason to keep this around since there's - * nothing useful to be retrieved from the footer, but well, again, I'm - * prone to change my mind, so this gets to stay around until near a - * release. - */ - TAGLIB_DEPRECATED Footer *footer() const; - - /*! - * Returns a reference to the frame list map. This is an FrameListMap of - * all of the frames in the tag. - * - * This is the most convenient structure for accessing the tag's frames. - * Many frame types allow multiple instances of the same frame type so this - * is a map of lists. In most cases however there will only be a single - * frame of a certain type. - * - * Let's say for instance that you wanted to access the frame for total - * beats per minute -- the TBPM frame. - * - * \code - * TagLib::MPEG::File f("foo.mp3"); - * - * // Check to make sure that it has an ID3v2 tag - * - * if(f.ID3v2Tag()) { - * - * // Get the list of frames for a specific frame type - * - * TagLib::ID3v2::FrameList l = f.ID3v2Tag()->frameListMap()["TBPM"]; - * - * if(!l.isEmpty()) - * std::cout << l.front()->toString() << std::endl; - * } - * - * \endcode - * - * \warning You should not modify this data structure directly, instead - * use addFrame() and removeFrame(). - * - * \see frameList() - */ - const FrameListMap &frameListMap() const; - - /*! - * Returns a reference to the frame list. This is an FrameList of all of - * the frames in the tag in the order that they were parsed. - * - * This can be useful if for example you want iterate over the tag's frames - * in the order that they occur in the tag. - * - * \warning You should not modify this data structure directly, instead - * use addFrame() and removeFrame(). - */ - const FrameList &frameList() const; - - /*! - * Returns the frame list for frames with the id \a frameID or an empty - * list if there are no frames of that type. This is just a convenience - * and is equivalent to: - * - * \code - * frameListMap()[frameID]; - * \endcode - * - * \see frameListMap() - */ - const FrameList &frameList(const ByteVector &frameID) const; - - /*! - * Add a frame to the tag. At this point the tag takes ownership of - * the frame and will handle freeing its memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void addFrame(Frame *frame); - - /*! - * Remove a frame from the tag. If \a del is true the frame's memory - * will be freed; if it is false, it must be deleted by the user. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void removeFrame(Frame *frame, bool del = true); - - /*! - * Remove all frames of type \a id from the tag and free their memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void removeFrames(const ByteVector &id); - - /*! - * Implements the unified property interface -- export function. - * This function does some work to translate the hard-specified ID3v2 - * frame types into a free-form string-to-stringlist PropertyMap: - * - if ID3v2 frame ID is known by Frame::frameIDToKey(), the returned - * key is used - * - if the frame ID is "TXXX" (user text frame), the description() is - * used as key - * - if the frame ID is "WXXX" (user url frame), - * - if the description is empty or "URL", the key "URL" is used - * - otherwise, the key "URL:" is used; - * - if the frame ID is "COMM" (comments frame), - * - if the description is empty or "COMMENT", the key "COMMENT" - * is used - * - otherwise, the key "COMMENT:" is used; - * - if the frame ID is "USLT" (unsynchronized lyrics), - * - if the description is empty or "LYRICS", the key "LYRICS" is used - * - otherwise, the key "LYRICS:" is used; - * - if the frame ID is "TIPL" (involved peoples list), and if all the - * roles defined in the frame are known in TextIdentificationFrame::involvedPeopleMap(), - * then "=" will be contained in the returned object for each - * - if the frame ID is "TMCL" (musician credit list), then - * "PERFORMER:=" will be contained in the returned - * PropertyMap for each defined musician - * In any other case, the unsupportedData() of the returned object will contain - * the frame's ID and, in case of a frame ID which is allowed to appear more than - * once, the description, separated by a "/". - * - */ - PropertyMap properties() const; - - /*! - * Removes unsupported frames given by \a properties. The elements of - * \a properties must be taken from properties().unsupportedData(); they - * are of one of the following forms: - * - a four-character frame ID, if the ID3 specification allows only one - * frame with that ID (thus, the frame is uniquely determined) - * - frameID + "/" + description(), when the ID is one of "TXXX", "WXXX", - * "COMM", or "USLT", - * - "UNKNOWN/" + frameID, for frames that could not be parsed by TagLib. - * In that case, *all* unknown frames with the given ID will be removed. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * See the comments in properties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Render the tag back to binary data, suitable to be written to disk. - */ - ByteVector render() const; - - /*! - * \deprecated Use render(Version) const. - */ - TAGLIB_DEPRECATED ByteVector render(int version) const; - - /*! - * Render the tag back to binary data, suitable to be written to disk. - * - * The \a version parameter specifies whether ID3v2.4 (default) or ID3v2.3 - * should be used. - */ - ByteVector render(Version version) const; - - /*! - * Gets the current string handler that decides how the "Latin-1" data - * will be converted to and from binary data. - * - * \see Latin1StringHandler - */ - static Latin1StringHandler const *latin1StringHandler(); - - /*! - * Sets the string handler that decides how the "Latin-1" data will be - * converted to and from binary data. - * If the parameter \a handler is null, the previous handler is - * released and default ISO-8859-1 handler is restored. - * - * \note The caller is responsible for deleting the previous handler - * as needed after it is released. - * - * \see Latin1StringHandler - */ - static void setLatin1StringHandler(const Latin1StringHandler *handler); - - protected: - /*! - * Reads data from the file specified in the constructor. It does basic - * parsing of the data in the largest chunks. It partitions the tag into - * the Header, the body of the tag (which contains the ExtendedHeader and - * frames) and Footer. - */ - void read(); - - /*! - * This is called by read to parse the body of the tag. It determines if an - * extended header exists and adds frames to the FrameListMap. - */ - void parse(const ByteVector &data); - - /*! - * Sets the value of the text frame with the Frame ID \a id to \a value. - * If the frame does not exist, it is created. - */ - void setTextFrame(const ByteVector &id, const String &value); - - /*! - * Downgrade frames from ID3v2.4 (used internally and by default) to ID3v2.3. - */ - void downgradeFrames(FrameList *existingFrames, FrameList *newFrames) const; - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/infotag.h b/taglib/include/taglib/infotag.h deleted file mode 100644 index 431d86c..0000000 --- a/taglib/include/taglib/infotag.h +++ /dev/null @@ -1,193 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_INFOTAG_H -#define TAGLIB_INFOTAG_H - -#include "tag.h" -#include "tmap.h" -#include "tstring.h" -#include "tstringlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class File; - - //! A RIFF INFO tag implementation. - namespace RIFF { - namespace Info { - - typedef Map FieldListMap; - - //! A abstraction for the string to data encoding in Info tags. - - /*! - * RIFF INFO tag has no clear definitions about character encodings. - * In practice, local encoding of each system is largely used and UTF-8 is - * popular too. - * - * Here is an option to read and write tags in your preferred encoding - * by subclassing this class, reimplementing parse() and render() and setting - * your reimplementation as the default with Info::Tag::setStringHandler(). - * - * \see ID3v1::Tag::setStringHandler() - */ - - class TAGLIB_EXPORT StringHandler - { - public: - StringHandler(); - ~StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an UTF-8 character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. The default implementation - * assumes that \a s is an UTF-8 string. - */ - virtual ByteVector render(const String &s) const; - }; - - //! The main class in the ID3v2 implementation - - /*! - * This is the main class in the INFO tag implementation. RIFF INFO tag is a - * metadata format found in WAV audio and AVI video files. Though it is a part - * of Microsoft/IBM's RIFF specification, the author could not find the official - * documents about it. So, this implementation is referring to unofficial documents - * online and some applications' behaviors especially Windows Explorer. - */ - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Constructs an empty INFO tag. - */ - Tag(); - - /*! - * Constructs an INFO tag read from \a data which is contents of "LIST" chunk. - */ - Tag(const ByteVector &data); - - virtual ~Tag(); - - // Reimplementations - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual unsigned int year() const; - virtual unsigned int track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(unsigned int i); - virtual void setTrack(unsigned int i); - - virtual bool isEmpty() const; - - /*! - * Returns a copy of the internal fields of the tag. The returned map directly - * reflects the contents of the "INFO" chunk. - * - * \note Modifying this map does not affect the tag's internal data. - * Use setFieldText() and removeField() instead. - * - * \see setFieldText() - * \see removeField() - */ - FieldListMap fieldListMap() const; - - /* - * Gets the value of the field with the ID \a id. - */ - String fieldText(const ByteVector &id) const; - - /* - * Sets the value of the field with the ID \a id to \a s. - * If the field does not exist, it is created. - * If \s is empty, the field is removed. - * - * \note fieldId must be four-byte long pure ASCII string. This function - * performs nothing if fieldId is invalid. - */ - void setFieldText(const ByteVector &id, const String &s); - - /* - * Removes the field with the ID \a id. - */ - void removeField(const ByteVector &id); - - /*! - * Render the tag back to binary data, suitable to be written to disk. - * - * \note Returns empty ByteVector is the tag contains no fields. - */ - ByteVector render() const; - - /*! - * Sets the string handler that decides how the text data will be - * converted to and from binary data. - * If the parameter \a handler is null, the previous handler is - * released and default UTF-8 handler is restored. - * - * \note The caller is responsible for deleting the previous handler - * as needed after it is released. - * - * \see StringHandler - */ - static void setStringHandler(const StringHandler *handler); - - protected: - /*! - * Pareses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } // namespace Info -} // namespace RIFF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/itfile.h b/taglib/include/taglib/itfile.h deleted file mode 100644 index 29e575f..0000000 --- a/taglib/include/taglib/itfile.h +++ /dev/null @@ -1,109 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_ITFILE_H -#define TAGLIB_ITFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "itproperties.h" - -namespace TagLib { - - namespace IT { - - class TAGLIB_EXPORT File : public Mod::FileBase { - public: - /*! - * Constructs a Impulse Tracker file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs a Impulse Tracker file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Forwards to Mod::Tag::properties(). - * BIC: will be removed once File::toDict() is made virtual - */ - PropertyMap properties() const; - - /*! - * Forwards to Mod::Tag::setProperties(). - * BIC: will be removed once File::setProperties() is made virtual - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the IT::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - IT::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving Impulse Tracker tags is not supported. - */ - bool save(); - - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace IT -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/itproperties.h b/taglib/include/taglib/itproperties.h deleted file mode 100644 index d4bce6d..0000000 --- a/taglib/include/taglib/itproperties.h +++ /dev/null @@ -1,107 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_ITPROPERTIES_H -#define TAGLIB_ITPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - namespace IT { - class TAGLIB_EXPORT Properties : public AudioProperties { - friend class File; - public: - /*! Flag bits. */ - enum { - Stereo = 1, - Vol0MixOptimizations = 2, - UseInstruments = 4, - LinearSlides = 8, - OldEffects = 16, - LinkEffects = 32, - UseMidiPitchController = 64, - RequestEmbeddedMidiConf = 128 - }; - - /*! Special bits. */ - enum { - MessageAttached = 1, - MidiConfEmbedded = 8 - }; - - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int lengthInSeconds() const; - int lengthInMilliseconds() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - unsigned short lengthInPatterns() const; - bool stereo() const; - unsigned short instrumentCount() const; - unsigned short sampleCount() const; - unsigned short patternCount() const; - unsigned short version() const; - unsigned short compatibleVersion() const; - unsigned short flags() const; - unsigned short special() const; - unsigned char globalVolume() const; - unsigned char mixVolume() const; - unsigned char tempo() const; - unsigned char bpmSpeed() const; - unsigned char panningSeparation() const; - unsigned char pitchWheelDepth() const; - - void setChannels(int channels); - void setLengthInPatterns(unsigned short lengthInPatterns); - void setInstrumentCount(unsigned short instrumentCount); - void setSampleCount (unsigned short sampleCount); - void setPatternCount(unsigned short patternCount); - void setVersion (unsigned short version); - void setCompatibleVersion(unsigned short compatibleVersion); - void setFlags (unsigned short flags); - void setSpecial (unsigned short special); - void setGlobalVolume(unsigned char globalVolume); - void setMixVolume (unsigned char mixVolume); - void setTempo (unsigned char tempo); - void setBpmSpeed (unsigned char bpmSpeed); - void setPanningSeparation(unsigned char panningSeparation); - void setPitchWheelDepth (unsigned char pitchWheelDepth); - - private: - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace IT -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/modfile.h b/taglib/include/taglib/modfile.h deleted file mode 100644 index 2d17dbe..0000000 --- a/taglib/include/taglib/modfile.h +++ /dev/null @@ -1,109 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MODFILE_H -#define TAGLIB_MODFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "modproperties.h" - -namespace TagLib { - namespace Mod { - class TAGLIB_EXPORT File : public TagLib::Mod::FileBase - { - public: - /*! - * Constructs a Protracker file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs a Protracker file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * Forwards to Mod::Tag::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Forwards to Mod::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - /*! - * Returns the Mod::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - Mod::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving Protracker tags is not supported. - */ - bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace Mod -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/modfilebase.h b/taglib/include/taglib/modfilebase.h deleted file mode 100644 index d452b2b..0000000 --- a/taglib/include/taglib/modfilebase.h +++ /dev/null @@ -1,61 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MODFILEBASE_H -#define TAGLIB_MODFILEBASE_H - -#include "taglib.h" -#include "tfile.h" -#include "tstring.h" -#include "tlist.h" -#include "taglib_export.h" - -#include - -namespace TagLib { - namespace Mod { - class TAGLIB_EXPORT FileBase : public TagLib::File - { - protected: - FileBase(FileName file); - FileBase(IOStream *stream); - - void writeString(const String &s, unsigned long size, char padding = 0); - void writeByte(unsigned char byte); - void writeU16L(unsigned short number); - void writeU32L(unsigned long number); - void writeU16B(unsigned short number); - void writeU32B(unsigned long number); - - bool readString(String &s, unsigned long size); - bool readByte(unsigned char &byte); - bool readU16L(unsigned short &number); - bool readU32L(unsigned long &number); - bool readU16B(unsigned short &number); - bool readU32B(unsigned long &number); - }; - } // namespace Mod -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/modproperties.h b/taglib/include/taglib/modproperties.h deleted file mode 100644 index 51bd924..0000000 --- a/taglib/include/taglib/modproperties.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MODPROPERTIES_H -#define TAGLIB_MODPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - namespace Mod { - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int lengthInSeconds() const; - int lengthInMilliseconds() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - unsigned int instrumentCount() const; - unsigned char lengthInPatterns() const; - - void setChannels(int channels); - - void setInstrumentCount(unsigned int sampleCount); - void setLengthInPatterns(unsigned char lengthInPatterns); - - private: - friend class File; - - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace Mod -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/modtag.h b/taglib/include/taglib/modtag.h deleted file mode 100644 index f51a2e4..0000000 --- a/taglib/include/taglib/modtag.h +++ /dev/null @@ -1,189 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MODTAG_H -#define TAGLIB_MODTAG_H - -#include "tag.h" - -namespace TagLib { - namespace Mod { - /*! - * Tags for module files (Mod, S3M, IT, XM). - * - * Note that only the \a title is supported as such by most - * module file formats. Except for XM files the \a trackerName - * is derived from the file format or the flavour of the file - * format. For XM files it is stored in the file. - * - * The \a comment tag is not strictly supported by module files, - * but it is common practice to abuse instrument/sample/pattern - * names as multiline comments. TagLib does so as well. - */ - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - Tag(); - virtual ~Tag(); - - /*! - * Returns the track name; if no track name is present in the tag - * String::null will be returned. - */ - virtual String title() const; - - /*! - * Not supported by module files. Therefore always returns String::null. - */ - virtual String artist() const; - - /*! - * Not supported by module files. Therefore always returns String::null. - */ - virtual String album() const; - - /*! - * Returns the track comment derived from the instrument/sample/pattern - * names; if no comment is present in the tag String::null will be - * returned. - */ - virtual String comment() const; - - /*! - * Not supported by module files. Therefore always returns String::null. - */ - virtual String genre() const; - - /*! - * Not supported by module files. Therefore always returns 0. - */ - virtual unsigned int year() const; - - /*! - * Not supported by module files. Therefore always returns 0. - */ - virtual unsigned int track() const; - - /*! - * Returns the name of the tracker used to create/edit the module file. - * Only XM files store this tag to the file as such, for other formats - * (Mod, S3M, IT) this is derived from the file type or the flavour of - * the file type. Therefore only XM files might have an empty - * (String::null) tracker name. - */ - String trackerName() const; - - /*! - * Sets the title to \a title. If \a title is String::null then this - * value will be cleared. - * - * The length limits per file type are (1 character = 1 byte): - * Mod 20 characters, S3M 27 characters, IT 25 characters and XM 20 - * characters. - */ - virtual void setTitle(const String &title); - - /*! - * Not supported by module files and therefore ignored. - */ - virtual void setArtist(const String &artist); - - /*! - * Not supported by module files and therefore ignored. - */ - virtual void setAlbum(const String &album); - - /*! - * Sets the comment to \a comment. If \a comment is String::null then - * this value will be cleared. - * - * Note that module file formats don't actually support a comment tag. - * Instead the names of instruments/patterns/samples are abused as - * a multiline comment. Because of this the number of lines in a - * module file is fixed to the number of instruments/patterns/samples. - * - * Also note that the instrument/pattern/sample name length is limited - * an thus the line length in comments are limited. Too big comments - * will be truncated. - * - * The line length limits per file type are (1 character = 1 byte): - * Mod 22 characters, S3M 27 characters, IT 25 characters and XM 22 - * characters. - */ - virtual void setComment(const String &comment); - - /*! - * Not supported by module files and therefore ignored. - */ - virtual void setGenre(const String &genre); - - /*! - * Not supported by module files and therefore ignored. - */ - virtual void setYear(unsigned int year); - - /*! - * Not supported by module files and therefore ignored. - */ - virtual void setTrack(unsigned int track); - - /*! - * Sets the tracker name to \a trackerName. If \a trackerName is - * String::null then this value will be cleared. - * - * Note that only XM files support this tag. Setting the - * tracker name for other module file formats will be ignored. - * - * The length of this tag is limited to 20 characters (1 character - * = 1 byte). - */ - void setTrackerName(const String &trackerName); - - /*! - * Implements the unified property interface -- export function. - * Since the module tag is very limited, the exported map is as well. - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Because of the limitations of the module file tag, any tags besides - * COMMENT, TITLE and, if it is an XM file, TRACKERNAME, will be - * returned. Additionally, if the map contains tags with multiple values, - * all but the first will be contained in the returned map of unsupported - * properties. - */ - PropertyMap setProperties(const PropertyMap &); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } // namespace Mod -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/mp4atom.h b/taglib/include/taglib/mp4atom.h deleted file mode 100644 index 0a0669e..0000000 --- a/taglib/include/taglib/mp4atom.h +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************************************** - copyright : (C) 2007,2011 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -// This file is not part of the public API! - -#ifndef DO_NOT_DOCUMENT - -#ifndef TAGLIB_MP4ATOM_H -#define TAGLIB_MP4ATOM_H - -#include "tfile.h" -#include "tlist.h" - -namespace TagLib { - namespace MP4 { - class Atom; - typedef TagLib::List AtomList; - - enum AtomDataType - { - TypeImplicit = 0, // for use with tags for which no type needs to be indicated because only one type is allowed - TypeUTF8 = 1, // without any count or null terminator - TypeUTF16 = 2, // also known as UTF-16BE - TypeSJIS = 3, // deprecated unless it is needed for special Japanese characters - TypeHTML = 6, // the HTML file header specifies which HTML version - TypeXML = 7, // the XML header must identify the DTD or schemas - TypeUUID = 8, // also known as GUID; stored as 16 bytes in binary (valid as an ID) - TypeISRC = 9, // stored as UTF-8 text (valid as an ID) - TypeMI3P = 10, // stored as UTF-8 text (valid as an ID) - TypeGIF = 12, // (deprecated) a GIF image - TypeJPEG = 13, // a JPEG image - TypePNG = 14, // a PNG image - TypeURL = 15, // absolute, in UTF-8 characters - TypeDuration = 16, // in milliseconds, 32-bit integer - TypeDateTime = 17, // in UTC, counting seconds since midnight, January 1, 1904; 32 or 64-bits - TypeGenred = 18, // a list of enumerated values - TypeInteger = 21, // a signed big-endian integer with length one of { 1,2,3,4,8 } bytes - TypeRIAAPA = 24, // RIAA parental advisory; { -1=no, 1=yes, 0=unspecified }, 8-bit integer - TypeUPC = 25, // Universal Product Code, in text UTF-8 format (valid as an ID) - TypeBMP = 27, // Windows bitmap image - TypeUndefined = 255 // undefined - }; - - struct AtomData { - AtomData(AtomDataType type, ByteVector data) : type(type), locale(0), data(data) {} - AtomDataType type; - int locale; - ByteVector data; - }; - - typedef TagLib::List AtomDataList; - - class TAGLIB_EXPORT Atom - { - public: - Atom(File *file); - ~Atom(); - Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - bool path(AtomList &path, const char *name1, const char *name2 = 0, const char *name3 = 0); - AtomList findall(const char *name, bool recursive = false); - long offset; - long length; - TagLib::ByteVector name; - AtomList children; - private: - static const int numContainers = 11; - static const char *const containers[11]; - }; - - //! Root-level atoms - class TAGLIB_EXPORT Atoms - { - public: - Atoms(File *file); - ~Atoms(); - Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - AtomList path(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - AtomList atoms; - }; - } // namespace MP4 -} // namespace TagLib - -#endif - -#endif diff --git a/taglib/include/taglib/mp4coverart.h b/taglib/include/taglib/mp4coverart.h deleted file mode 100644 index 6368480..0000000 --- a/taglib/include/taglib/mp4coverart.h +++ /dev/null @@ -1,79 +0,0 @@ -/************************************************************************** - copyright : (C) 2009 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4COVERART_H -#define TAGLIB_MP4COVERART_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "mp4atom.h" - -namespace TagLib { - namespace MP4 { - class TAGLIB_EXPORT CoverArt - { - public: - /*! - * This describes the image type. - */ - enum Format { - JPEG = TypeJPEG, - PNG = TypePNG, - BMP = TypeBMP, - GIF = TypeGIF, - Unknown = TypeImplicit, - }; - - CoverArt(Format format, const ByteVector &data); - ~CoverArt(); - - CoverArt(const CoverArt &item); - - /*! - * Copies the contents of \a item into this CoverArt. - */ - CoverArt &operator=(const CoverArt &item); - - /*! - * Exchanges the content of the CoverArt by the content of \a item. - */ - void swap(CoverArt &item); - - //! Format of the image - Format format() const; - - //! The image data - ByteVector data() const; - - private: - class CoverArtPrivate; - CoverArtPrivate *d; - }; - - typedef List CoverArtList; - } // namespace MP4 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/mp4file.h b/taglib/include/taglib/mp4file.h deleted file mode 100644 index b8f0a7c..0000000 --- a/taglib/include/taglib/mp4file.h +++ /dev/null @@ -1,160 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4FILE_H -#define TAGLIB_MP4FILE_H - -#include "tag.h" -#include "tfile.h" -#include "taglib_export.h" -#include "mp4properties.h" -#include "mp4tag.h" - -namespace TagLib { - //! An implementation of MP4 (AAC, ALAC, ...) metadata - namespace MP4 { - class Atoms; - - /*! - * This implements and provides an interface for MP4 files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to MP4 files. - */ - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for strip() and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches MP4 tags. - MP4 = 0x0001, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs an MP4 file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle audioPropertiesStyle = Properties::Average); - - /*! - * Constructs an MP4 file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle audioPropertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to the MP4 tag of the file. - * - * MP4::Tag implements the tag interface, so this serves as the - * reimplementation of TagLib::File::tag(). - * - * \note The Tag is still owned by the MP4::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties. Forwards to the actual Tag's - * removeUnsupportedProperties() function. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the MP4 audio properties for this file. - */ - Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - bool save(); - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * \note This will update the file immediately. - */ - bool strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an MP4 tag, or the - * file has a Metadata Item List (ilst) atom. - */ - bool hasMP4Tag() const; - - /*! - * Returns whether or not the given \a stream can be opened as an ASF - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace MP4 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/mp4item.h b/taglib/include/taglib/mp4item.h deleted file mode 100644 index 526c3a6..0000000 --- a/taglib/include/taglib/mp4item.h +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4ITEM_H -#define TAGLIB_MP4ITEM_H - -#include "tstringlist.h" -#include "mp4coverart.h" -#include "taglib_export.h" - -namespace TagLib { - namespace MP4 { - class TAGLIB_EXPORT Item - { - public: - struct IntPair { - int first, second; - }; - - Item(); - Item(const Item &item); - - /*! - * Copies the contents of \a item into this Item. - */ - Item &operator=(const Item &item); - - /*! - * Exchanges the content of the Item by the content of \a item. - */ - void swap(Item &item); - - ~Item(); - - Item(int value); - Item(unsigned char value); - Item(unsigned int value); - Item(long long value); - Item(bool value); - Item(int first, int second); - Item(const StringList &value); - Item(const ByteVectorList &value); - Item(const CoverArtList &value); - - void setAtomDataType(AtomDataType type); - AtomDataType atomDataType() const; - - int toInt() const; - unsigned char toByte() const; - unsigned int toUInt() const; - long long toLongLong() const; - bool toBool() const; - IntPair toIntPair() const; - StringList toStringList() const; - ByteVectorList toByteVectorList() const; - CoverArtList toCoverArtList() const; - - bool isValid() const; - - private: - class ItemPrivate; - ItemPrivate *d; - }; - } // namespace MP4 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/mp4properties.h b/taglib/include/taglib/mp4properties.h deleted file mode 100644 index 5ad3f21..0000000 --- a/taglib/include/taglib/mp4properties.h +++ /dev/null @@ -1,115 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4PROPERTIES_H -#define TAGLIB_MP4PROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - namespace MP4 { - class Atoms; - class File; - - //! An implementation of MP4 audio properties - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - enum Codec { - Unknown = 0, - AAC, - ALAC - }; - - Properties(File *file, Atoms *atoms, ReadStyle style = Average); - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample. - */ - virtual int bitsPerSample() const; - - /*! - * Returns whether or not the file is encrypted. - */ - bool isEncrypted() const; - - /*! - * Returns the codec used in the file. - */ - Codec codec() const; - - private: - void read(File *file, Atoms *atoms); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace MP4 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/mp4tag.h b/taglib/include/taglib/mp4tag.h deleted file mode 100644 index 42b3d4b..0000000 --- a/taglib/include/taglib/mp4tag.h +++ /dev/null @@ -1,164 +0,0 @@ -/************************************************************************** - copyright : (C) 2007,2011 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4TAG_H -#define TAGLIB_MP4TAG_H - -#include "tag.h" -#include "tbytevectorlist.h" -#include "tfile.h" -#include "tmap.h" -#include "tstringlist.h" -#include "taglib_export.h" -#include "mp4atom.h" -#include "mp4item.h" - -namespace TagLib { - namespace MP4 { - /*! - * \deprecated Use ItemMap. - */ - TAGLIB_DEPRECATED typedef TagLib::Map ItemListMap; - typedef TagLib::Map ItemMap; - - class TAGLIB_EXPORT Tag: public TagLib::Tag - { - public: - Tag(); - Tag(TagLib::File *file, Atoms *atoms); - virtual ~Tag(); - bool save(); - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual unsigned int year() const; - virtual unsigned int track() const; - - virtual void setTitle(const String &value); - virtual void setArtist(const String &value); - virtual void setAlbum(const String &value); - virtual void setComment(const String &value); - virtual void setGenre(const String &value); - virtual void setYear(unsigned int value); - virtual void setTrack(unsigned int value); - - virtual bool isEmpty() const; - - /*! - * \deprecated Use the item() and setItem() API instead. - */ - TAGLIB_DEPRECATED ItemMap &itemListMap(); - - /*! - * Returns a string-keyed map of the MP4::Items for this tag. - */ - const ItemMap &itemMap() const; - - /*! - * \return The item, if any, corresponding to \a key. - */ - Item item(const String &key) const; - - /*! - * Sets the value of \a key to \a value, overwriting any previous value. - */ - void setItem(const String &key, const Item &value); - - /*! - * Removes the entry with \a key from the tag, or does nothing if it does - * not exist. - */ - void removeItem(const String &key); - - /*! - * \return True if the tag contains an entry for \a key. - */ - bool contains(const String &key) const; - - /*! - * Saves the associated file with the tag stripped. - */ - bool strip(); - - PropertyMap properties() const; - void removeUnsupportedProperties(const StringList& properties); - PropertyMap setProperties(const PropertyMap &properties); - - protected: - /*! - * Sets the value of \a key to \a value, overwriting any previous value. - * If \a value is empty, the item is removed. - */ - void setTextItem(const String &key, const String &value); - - private: - AtomDataList parseData2(const Atom *atom, int expectedFlags = -1, - bool freeForm = false); - ByteVectorList parseData(const Atom *atom, int expectedFlags = -1, - bool freeForm = false); - void parseText(const Atom *atom, int expectedFlags = 1); - void parseFreeForm(const Atom *atom); - void parseInt(const Atom *atom); - void parseByte(const Atom *atom); - void parseUInt(const Atom *atom); - void parseLongLong(const Atom *atom); - void parseGnre(const Atom *atom); - void parseIntPair(const Atom *atom); - void parseBool(const Atom *atom); - void parseCovr(const Atom *atom); - - ByteVector padIlst(const ByteVector &data, int length = -1) const; - ByteVector renderAtom(const ByteVector &name, const ByteVector &data) const; - ByteVector renderData(const ByteVector &name, int flags, - const ByteVectorList &data) const; - ByteVector renderText(const ByteVector &name, const Item &item, - int flags = TypeUTF8) const; - ByteVector renderFreeForm(const String &name, const Item &item) const; - ByteVector renderBool(const ByteVector &name, const Item &item) const; - ByteVector renderInt(const ByteVector &name, const Item &item) const; - ByteVector renderByte(const ByteVector &name, const Item &item) const; - ByteVector renderUInt(const ByteVector &name, const Item &item) const; - ByteVector renderLongLong(const ByteVector &name, const Item &item) const; - ByteVector renderIntPair(const ByteVector &name, const Item &item) const; - ByteVector renderIntPairNoTrailing(const ByteVector &name, const Item &item) const; - ByteVector renderCovr(const ByteVector &name, const Item &item) const; - - void updateParents(const AtomList &path, long delta, int ignore = 0); - void updateOffsets(long delta, long offset); - - void saveNew(ByteVector data); - void saveExisting(ByteVector data, const AtomList &path); - - void addItem(const String &name, const Item &value); - - class TagPrivate; - TagPrivate *d; - }; - } // namespace MP4 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/mpcfile.h b/taglib/include/taglib/mpcfile.h deleted file mode 100644 index c983673..0000000 --- a/taglib/include/taglib/mpcfile.h +++ /dev/null @@ -1,238 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPCFILE_H -#define TAGLIB_MPCFILE_H - -#include "taglib_export.h" -#include "tfile.h" -#include "tag.h" - -#include "mpcproperties.h" - -#include "tlist.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of MPC metadata - - /*! - * This is implementation of MPC metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. ID3v2 tags are invalid in MPC-files, but will be skipped - * and ignored. - */ - - namespace MPC { - - //! An implementation of TagLib::File with MPC specific methods - - /*! - * This implements and provides an interface for MPC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to MPC files. - * The only invalid tag combination supported is an ID3v1 tag after an APE tag. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches APE tags. - APE = 0x0004, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs an MPC file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an MPC file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both an APE and an ID3v1 tag, only the APE - * tag will be converted to the PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * Affects only the APEv2 tag which will be created if necessary. - * If an ID3v1 tag exists, it will be updated as well. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the MPC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. If - * there already be an ID3v1 tag, the new APE tag will be placed before it. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \warning This will also invalidate pointers to the tags - * as their memory will be freed. - * - * \note In order to make the removal permanent save() still needs to be called. - */ - void strip(int tags = AllTags); - - /*! - * \deprecated Use strip(). - * \see strip - */ - TAGLIB_DEPRECATED void remove(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - /*! - * Returns whether or not the given \a stream can be opened as an MPC - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace MPC -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/mpcproperties.h b/taglib/include/taglib/mpcproperties.h deleted file mode 100644 index 1db925d..0000000 --- a/taglib/include/taglib/mpcproperties.h +++ /dev/null @@ -1,158 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPCPROPERTIES_H -#define TAGLIB_MPCPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace MPC { - - class File; - - static const unsigned int HeaderSize = 8 * 7; - - //! An implementation of audio property reading for MPC - - /*! - * This reads the data from an MPC stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of MPC::Properties with the data read from the - * ByteVector \a data. - * - * This constructor is deprecated. It only works for MPC version up to 7. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Create an instance of MPC::Properties with the data read directly - * from a MPC::File. - */ - Properties(File *file, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this MPC::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the version of the bitstream (SV4-SV8) - */ - int mpcVersion() const; - - unsigned int totalFrames() const; - unsigned int sampleFrames() const; - - /*! - * Returns the track gain as an integer value, - * to convert to dB: trackGain in dB = 64.82 - (trackGain / 256) - */ - int trackGain() const; - - /*! - * Returns the track peak as an integer value, - * to convert to dB: trackPeak in dB = trackPeak / 256 - * to convert to floating [-1..1]: trackPeak = 10^(trackPeak / 256 / 20)/32768 - */ - int trackPeak() const; - - /*! - * Returns the album gain as an integer value, - * to convert to dB: albumGain in dB = 64.82 - (albumGain / 256) - */ - int albumGain() const; - - /*! - * Returns the album peak as an integer value, - * to convert to dB: albumPeak in dB = albumPeak / 256 - * to convert to floating [-1..1]: albumPeak = 10^(albumPeak / 256 / 20)/32768 - */ - int albumPeak() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void readSV7(const ByteVector &data, long streamLength); - void readSV8(File *file, long streamLength); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace MPC -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/mpegfile.h b/taglib/include/taglib/mpegfile.h deleted file mode 100644 index 381d89a..0000000 --- a/taglib/include/taglib/mpegfile.h +++ /dev/null @@ -1,387 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGFILE_H -#define TAGLIB_MPEGFILE_H - -#include "taglib_export.h" -#include "tfile.h" -#include "tag.h" - -#include "mpegproperties.h" - -#include "id3v2.h" - -namespace TagLib { - - namespace ID3v2 { class Tag; class FrameFactory; } - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of TagLib::File with MPEG (MP3) specific methods - - namespace MPEG { - - //! An MPEG file class with some useful methods specific to MPEG - - /*! - * This implements the generic TagLib::File API and additionally provides - * access to properties that are distinct to MPEG files, notably access - * to the different ID3 tags. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches APE tags. - APE = 0x0004, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs an MPEG file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an MPEG file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - // BIC: merge with the above constructor - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an MPEG file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to a tag that is the union of the ID3v2 and ID3v1 - * tags. The ID3v2 tag is given priority in reading the information -- if - * requested information exists in both the ID3v2 tag and the ID3v1 tag, - * the information from the ID3v2 tag will be returned. - * - * If you would like more granular control over the content of the tags, - * with the concession of generality, use the tag-type specific calls. - * - * \note As this tag is not implemented as an ID3v2 tag or an ID3v1 tag, - * but a union of the two this pointer may not be cast to the specific - * tag types. - * - * \see ID3v1Tag() - * \see ID3v2Tag() - * \see APETag() - */ - virtual Tag *tag() const; - - /*! - * Implements the reading part of the unified property interface. - * If the file contains more than one tag, only the - * first one (in the order ID3v2, APE, ID3v1) will be converted to the - * PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the writing part of the unified tag dictionary interface. - * In order to avoid problems with deprecated tag formats, this method - * always creates an ID3v2 tag if necessary. - * If an ID3v1 tag exists, it will be updated as well, within the - * limitations of that format. - * The returned PropertyMap refers to the ID3v2 tag only. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the MPEG::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. If at least one tag -- ID3v1 or ID3v2 -- exists this - * will duplicate its content into the other tag. This returns true - * if saving was successful. - * - * If neither exists or if both tags are empty, this will strip the tags - * from the file. - * - * This is the same as calling save(AllTags); - * - * If you would like more granular control over the content of the tags, - * with the concession of generality, use parameterized save call below. - * - * \see save(int tags) - */ - virtual bool save(); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. The save() method above - * uses AllTags. This returns true if saving was successful. - * - * This strips all tags not included in the mask, but does not modify them - * in memory, so later calls to save() which make use of these tags will - * remain valid. This also strips empty tags. - */ - bool save(int tags); - - /*! - * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). - */ - // BIC: combine with the above method - TAGLIB_DEPRECATED bool save(int tags, bool stripOthers); - - /*! - * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). - */ - // BIC: combine with the above method - TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version); - - /*! - * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). - */ - // BIC: combine with the above method - TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. - * - * \a strip can be set to strip all tags except those in \a tags. Those - * tags will not be modified in memory, and thus remain valid. - * - * \a version specifies the ID3v2 version to be used for writing tags. By - * default, the latest standard, ID3v2.4 is used. - * - * If \a duplicate is set to DuplicateTags and at least one tag -- ID3v1 - * or ID3v2 -- exists this will duplicate its content into the other tag. - */ - bool save(int tags, StripTags strip, - ID3v2::Version version = ID3v2::v4, - DuplicateTags duplicate = Duplicate); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * This is equivalent to strip(tags, true) - * - * \note This will also invalidate pointers to the ID3 and APE tags - * as their memory will be freed. - * - * \note This will update the file immediately. - */ - bool strip(int tags = AllTags); - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * If \a freeMemory is true the ID3 and APE tags will be deleted and - * pointers to them will be invalidated. - * - * \note This will update the file immediately. - */ - // BIC: merge with the method above - bool strip(int tags, bool freeMemory); - - /*! - * Set the ID3v2::FrameFactory to something other than the default. - * - * \see ID3v2FrameFactory - * \deprecated This value should be passed in via the constructor. - */ - TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Returns the position in the file of the first MPEG frame. - */ - long firstFrameOffset(); - - /*! - * Returns the position in the file of the next MPEG frame, - * using the current position as start - */ - long nextFrameOffset(long position); - - /*! - * Returns the position in the file of the previous MPEG frame, - * using the current position as start - */ - long previousFrameOffset(long position); - - /*! - * Returns the position in the file of the last MPEG frame. - */ - long lastFrameOffset(); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - /*! - * Returns whether or not the given \a stream can be opened as an MPEG - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - long findID3v2(); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace MPEG -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/mpegheader.h b/taglib/include/taglib/mpegheader.h deleted file mode 100644 index cb8eb25..0000000 --- a/taglib/include/taglib/mpegheader.h +++ /dev/null @@ -1,178 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGHEADER_H -#define TAGLIB_MPEGHEADER_H - -#include "taglib_export.h" - -namespace TagLib { - - class ByteVector; - class File; - - namespace MPEG { - - //! An implementation of MP3 frame headers - - /*! - * This is an implementation of MPEG Layer III headers. The API follows more - * or less the binary format of these headers. I've used - * this - * document as a reference. - */ - - class TAGLIB_EXPORT Header - { - public: - /*! - * Parses an MPEG header based on \a data. - * - * \deprecated Use Header(File *, long, bool). - */ - TAGLIB_DEPRECATED Header(const ByteVector &data); - - /*! - * Parses an MPEG header based on \a file and \a offset. - * - * \note If \a checkLength is true, this requires the next MPEG frame to - * check if the frame length is parsed and calculated correctly. So it's - * suitable for seeking for the first valid frame. - */ - Header(File *file, long offset, bool checkLength = true); - - /*! - * Does a shallow copy of \a h. - */ - Header(const Header &h); - - /*! - * Destroys this Header instance. - */ - virtual ~Header(); - - /*! - * Returns true if the frame is at least an appropriate size and has - * legal values. - */ - bool isValid() const; - - /*! - * The MPEG Version. - */ - enum Version { - //! MPEG Version 1 - Version1 = 0, - //! MPEG Version 2 - Version2 = 1, - //! MPEG Version 2.5 - Version2_5 = 2 - }; - - /*! - * Returns the MPEG Version of the header. - */ - Version version() const; - - /*! - * Returns the layer version. This will be between the values 1-3. - */ - int layer() const; - - /*! - * Returns true if the MPEG protection bit is enabled. - */ - bool protectionEnabled() const; - - /*! - * Returns the bitrate encoded in the header. - */ - int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - int sampleRate() const; - - /*! - * Returns true if the frame is padded. - */ - bool isPadded() const; - - /*! - * There are a few combinations or one or two channel audio that are - * possible: - */ - enum ChannelMode { - //! Stereo - Stereo = 0, - //! Stereo - JointStereo = 1, - //! Dual Mono - DualChannel = 2, - //! Mono - SingleChannel = 3 - }; - - /*! - * Returns the channel mode for this frame. - */ - ChannelMode channelMode() const; - - /*! - * Returns true if the copyrighted bit is set. - */ - bool isCopyrighted() const; - - /*! - * Returns true if the "original" bit is set. - */ - bool isOriginal() const; - - /*! - * Returns the frame length in bytes. - */ - int frameLength() const; - - /*! - * Returns the number of frames per sample. - */ - int samplesPerFrame() const; - - /*! - * Makes a shallow copy of the header. - */ - Header &operator=(const Header &h); - - private: - void parse(File *file, long offset, bool checkLength); - - class HeaderPrivate; - HeaderPrivate *d; - }; - } // namespace MPEG -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/mpegproperties.h b/taglib/include/taglib/mpegproperties.h deleted file mode 100644 index 18e7ca1..0000000 --- a/taglib/include/taglib/mpegproperties.h +++ /dev/null @@ -1,152 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGPROPERTIES_H -#define TAGLIB_MPEGPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -#include "mpegheader.h" - -namespace TagLib { - - namespace MPEG { - - class File; - class XingHeader; - - //! An implementation of audio property reading for MP3 - - /*! - * This reads the data from an MPEG Layer III stream found in the - * AudioProperties API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of MPEG::Properties with the data read from the - * MPEG::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this MPEG Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns a pointer to the Xing/VBRI header if one exists or null if no - * Xing/VBRI header was found. - */ - const XingHeader *xingHeader() const; - - /*! - * Returns the MPEG Version of the file. - */ - Header::Version version() const; - - /*! - * Returns the layer version. This will be between the values 1-3. - */ - int layer() const; - - /*! - * Returns true if the MPEG protection bit is enabled. - */ - bool protectionEnabled() const; - - /*! - * Returns the channel mode for this frame. - */ - Header::ChannelMode channelMode() const; - - /*! - * Returns true if the copyrighted bit is set. - */ - bool isCopyrighted() const; - - /*! - * Returns true if the "original" bit is set. - */ - bool isOriginal() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace MPEG -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/oggfile.h b/taglib/include/taglib/oggfile.h deleted file mode 100644 index a5d20c2..0000000 --- a/taglib/include/taglib/oggfile.h +++ /dev/null @@ -1,127 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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 "taglib_export.h" -#include "tfile.h" -#include "tbytevectorlist.h" - -#ifndef TAGLIB_OGGFILE_H -#define TAGLIB_OGGFILE_H - -namespace TagLib { - - //! A namespace for the classes used by Ogg-based metadata files - - namespace Ogg { - - class PageHeader; - - //! An implementation of TagLib::File with some helpers for Ogg based formats - - /*! - * This is an implementation of Ogg file page and packet rendering and is of - * use to Ogg based formats. While the API is small this handles the - * non-trivial details of breaking up an Ogg stream into packets and makes - * these available (via subclassing) to the codec meta data implementations. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - virtual ~File(); - - /*! - * Returns the packet contents for the i-th packet (starting from zero) - * in the Ogg bitstream. - * - * \warning This requires reading at least the packet header for every page - * up to the requested page. - */ - ByteVector packet(unsigned int i); - - /*! - * Sets the packet with index \a i to the value \a p. - */ - void setPacket(unsigned int i, const ByteVector &p); - - /*! - * Returns a pointer to the PageHeader for the first page in the stream or - * null if the page could not be found. - */ - const PageHeader *firstPageHeader(); - - /*! - * Returns a pointer to the PageHeader for the last page in the stream or - * null if the page could not be found. - */ - const PageHeader *lastPageHeader(); - - virtual bool save(); - - protected: - /*! - * Constructs an Ogg file from \a file. - * - * \note This constructor is protected since Ogg::File shouldn't be - * instantiated directly but rather should be used through the codec - * specific subclasses. - */ - File(FileName file); - - /*! - * Constructs an Ogg file from \a stream. - * - * \note This constructor is protected since Ogg::File shouldn't be - * instantiated directly but rather should be used through the codec - * specific subclasses. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - /*! - * Reads the pages from the beginning of the file until enough to compose - * the requested packet. - */ - bool readPages(unsigned int i); - - /*! - * Writes the requested packet to the file. - */ - void writePacket(unsigned int i, const ByteVector &packet); - - class FilePrivate; - FilePrivate *d; - }; - - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/oggflacfile.h b/taglib/include/taglib/oggflacfile.h deleted file mode 100644 index b2686e4..0000000 --- a/taglib/include/taglib/oggflacfile.h +++ /dev/null @@ -1,170 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGFLACFILE_H -#define TAGLIB_OGGFLACFILE_H - -#include "taglib_export.h" -#include "oggfile.h" -#include "xiphcomment.h" - -#include "flacproperties.h" - -namespace TagLib { - - class Tag; - - namespace Ogg { - - //! An implementation of Ogg FLAC metadata - - /*! - * This is implementation of FLAC metadata for Ogg FLAC files. For "pure" - * FLAC files look under the FLAC hierarchy. - * - * Unlike "pure" FLAC-files, Ogg FLAC only supports Xiph-comments, - * while the audio-properties are the same. - */ - namespace FLAC { - - using TagLib::FLAC::Properties; - - //! An implementation of TagLib::File with Ogg/FLAC specific methods - - /*! - * This implements and provides an interface for Ogg/FLAC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to Ogg FLAC files. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs an Ogg/FLAC file from \a file. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an Ogg/FLAC file from \a stream. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will always be a XiphComment. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has a XiphComment. Use hasXiphComment() to check if - * the file on disk actually has a XiphComment. - * - * \note The Tag is still owned by the FLAC::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasXiphComment() - */ - virtual XiphComment *tag() const; - - /*! - * Returns the FLAC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - - /*! - * Save the file. This will primarily save and update the XiphComment. - * Returns true if the save is successful. - */ - virtual bool save(); - - /*! - * Returns the length of the audio-stream, used by FLAC::Properties for - * calculating the bitrate. - */ - long streamLength(); - - /*! - * Returns whether or not the file on disk actually has a XiphComment. - * - * \see tag() - */ - bool hasXiphComment() const; - - /*! - * Check if the given \a stream can be opened as an Ogg FLAC file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - ByteVector streamInfoData(); - ByteVector xiphCommentData(); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace FLAC - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/oggpage.h b/taglib/include/taglib/oggpage.h deleted file mode 100644 index 4829b07..0000000 --- a/taglib/include/taglib/oggpage.h +++ /dev/null @@ -1,228 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGPAGE_H -#define TAGLIB_OGGPAGE_H - -#include "taglib_export.h" -#include "tbytevectorlist.h" - -namespace TagLib { - - namespace Ogg { - - class File; - class PageHeader; - - //! An implementation of Ogg pages - - /*! - * This is an implementation of the pages that make up an Ogg stream. - * This handles parsing pages and breaking them down into packets and handles - * the details of packets spanning multiple pages and pages that contain - * multiple packets. - * - * In most Xiph.org formats the comments are found in the first few packets, - * this however is a reasonably complete implementation of Ogg pages that - * could potentially be useful for non-meta data purposes. - */ - - class TAGLIB_EXPORT Page - { - public: - /*! - * Read an Ogg page from the \a file at the position \a pageOffset. - */ - Page(File *file, long pageOffset); - - virtual ~Page(); - - /*! - * Returns the page's position within the file (in bytes). - */ - long fileOffset() const; - - /*! - * Returns a pointer to the header for this page. This pointer will become - * invalid when the page is deleted. - */ - const PageHeader *header() const; - - /*! - * Returns the index of the page within the Ogg stream. This helps make it - * possible to determine if pages have been lost. - * - * \see setPageSequenceNumber() - */ - int pageSequenceNumber() const; - - /*! - * Sets the page's position in the stream to \a sequenceNumber. - * - * \see pageSequenceNumber() - */ - void setPageSequenceNumber(int sequenceNumber); - - /*! - * Returns a copy of the page with \a sequenceNumber set as sequence number. - * - * \see header() - * \see PageHeader::setPageSequenceNumber() - * - * \deprecated Always returns null. - */ - TAGLIB_DEPRECATED Page *getCopyWithNewPageSequenceNumber(int sequenceNumber); - - /*! - * Returns the index of the first packet wholly or partially contained in - * this page. - * - * \see setFirstPacketIndex() - */ - int firstPacketIndex() const; - - /*! - * Sets the index of the first packet in the page. - * - * \see firstPacketIndex() - */ - void setFirstPacketIndex(int index); - - /*! - * When checking to see if a page contains a given packet this set of flags - * represents the possible values for that packets status in the page. - * - * \see containsPacket() - */ - enum ContainsPacketFlags { - //! No part of the packet is contained in the page - DoesNotContainPacket = 0x0000, - //! The packet is wholly contained in the page - CompletePacket = 0x0001, - //! The page starts with the given packet - BeginsWithPacket = 0x0002, - //! The page ends with the given packet - EndsWithPacket = 0x0004 - }; - - /*! - * Checks to see if the specified \a packet is contained in the current - * page. - * - * \see ContainsPacketFlags - */ - ContainsPacketFlags containsPacket(int index) const; - - /*! - * Returns the number of packets (whole or partial) in this page. - */ - unsigned int packetCount() const; - - /*! - * Returns a list of the packets in this page. - * - * \note Either or both the first and last packets may be only partial. - * \see PageHeader::firstPacketContinued() - */ - ByteVectorList packets() const; - - /*! - * Returns the size of the page in bytes. - */ - int size() const; - - ByteVector render() const; - - /*! - * Defines a strategy for pagination, or grouping pages into Ogg packets, - * for use with pagination methods. - * - * \note Yes, I'm aware that this is not a canonical "Strategy Pattern", - * the term was simply convenient. - */ - enum PaginationStrategy { - /*! - * Attempt to put the specified set of packets into a single Ogg packet. - * If the sum of the packet data is greater than will fit into a single - * Ogg page -- 65280 bytes -- this will fall back to repagination using - * the recommended page sizes. - */ - SinglePagePerGroup, - /*! - * Split the packet or group of packets into pages that conform to the - * sizes recommended in the Ogg standard. - */ - Repaginate - }; - - /*! - * Pack \a packets into Ogg pages using the \a strategy for pagination. - * The page number indicator inside of the rendered packets will start - * with \a firstPage and be incremented for each page rendered. - * \a containsLastPacket should be set to true if \a packets contains the - * last page in the stream and will set the appropriate flag in the last - * rendered Ogg page's header. \a streamSerialNumber should be set to - * the serial number for this stream. - * - * \note The "absolute granule position" is currently always zeroed using - * this method as this suffices for the comment headers. - * - * \warning The pages returned by this method must be deleted by the user. - * You can use List::setAutoDelete(true) to set these pages to be - * automatically deleted when this list passes out of scope. - * - * \see PaginationStrategy - * \see List::setAutoDelete() - */ - static List paginate(const ByteVectorList &packets, - PaginationStrategy strategy, - unsigned int streamSerialNumber, - int firstPage, - bool firstPacketContinued = false, - bool lastPacketCompleted = true, - bool containsLastPacket = false); - - protected: - /*! - * Creates an Ogg packet based on the data in \a packets. The page number - * for each page will be set to \a pageNumber. - */ - Page(const ByteVectorList &packets, - unsigned int streamSerialNumber, - int pageNumber, - bool firstPacketContinued = false, - bool lastPacketCompleted = true, - bool containsLastPacket = false); - - private: - Page(const Page &); - Page &operator=(const Page &); - - class PagePrivate; - PagePrivate *d; - }; - } // namespace Ogg -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/oggpageheader.h b/taglib/include/taglib/oggpageheader.h deleted file mode 100644 index d62feb3..0000000 --- a/taglib/include/taglib/oggpageheader.h +++ /dev/null @@ -1,232 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGPAGEHEADER_H -#define TAGLIB_OGGPAGEHEADER_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace Ogg { - - class File; - - //! An implementation of the page headers associated with each Ogg::Page - - /*! - * This class implements Ogg page headers which contain the information - * about Ogg pages needed to break them into packets which can be passed on - * to the codecs. - */ - - class TAGLIB_EXPORT PageHeader - { - public: - /*! - * Reads a PageHeader from \a file starting at \a pageOffset. The defaults - * create a page with no (and as such, invalid) data that must be set - * later. - */ - PageHeader(File *file = 0, long pageOffset = -1); - - /*! - * Deletes this instance of the PageHeader. - */ - virtual ~PageHeader(); - - /*! - * Returns true if the header parsed properly and is valid. - */ - bool isValid() const; - - /*! - * Ogg pages contain a list of packets (which are used by the contained - * codecs). The sizes of these pages is encoded in the page header. This - * returns a list of the packet sizes in bytes. - * - * \see setPacketSizes() - */ - List packetSizes() const; - - /*! - * Sets the sizes of the packets in this page to \a sizes. Internally this - * updates the lacing values in the header. - * - * \see packetSizes() - */ - void setPacketSizes(const List &sizes); - - /*! - * Some packets can be continued across multiple pages. If the - * first packet in the current page is a continuation this will return - * true. If this is page starts with a new packet this will return false. - * - * \see lastPacketCompleted() - * \see setFirstPacketContinued() - */ - bool firstPacketContinued() const; - - /*! - * Sets the internal flag indicating if the first packet in this page is - * continued to \a continued. - * - * \see firstPacketContinued() - */ - void setFirstPacketContinued(bool continued); - - /*! - * Returns true if the last packet of this page is completely contained in - * this page. - * - * \see firstPacketContinued() - * \see setLastPacketCompleted() - */ - bool lastPacketCompleted() const; - - /*! - * Sets the internal flag indicating if the last packet in this page is - * complete to \a completed. - * - * \see lastPacketCompleted() - */ - void setLastPacketCompleted(bool completed); - - /*! - * This returns true if this is the first page of the Ogg (logical) stream. - * - * \see setFirstPageOfStream() - */ - bool firstPageOfStream() const; - - /*! - * Marks this page as the first page of the Ogg stream. - * - * \see firstPageOfStream() - */ - void setFirstPageOfStream(bool first); - - /*! - * This returns true if this is the last page of the Ogg (logical) stream. - * - * \see setLastPageOfStream() - */ - bool lastPageOfStream() const; - - /*! - * Marks this page as the last page of the Ogg stream. - * - * \see lastPageOfStream() - */ - void setLastPageOfStream(bool last); - - /*! - * A special value of containing the position of the packet to be - * interpreted by the codec. In the case of Vorbis this contains the PCM - * value and is used to calculate the length of the stream. - * - * \see setAbsoluteGranularPosition() - */ - long long absoluteGranularPosition() const; - - /*! - * A special value of containing the position of the packet to be - * interpreted by the codec. It is only supported here so that it may be - * copied from one page to another. - * - * \see absoluteGranularPosition() - */ - void setAbsoluteGranularPosition(long long agp); - - /*! - * Every Ogg logical stream is given a random serial number which is common - * to every page in that logical stream. This returns the serial number of - * the stream associated with this packet. - * - * \see setStreamSerialNumber() - */ - unsigned int streamSerialNumber() const; - - /*! - * Every Ogg logical stream is given a random serial number which is common - * to every page in that logical stream. This sets this pages serial - * number. This method should be used when adding new pages to a logical - * stream. - * - * \see streamSerialNumber() - */ - void setStreamSerialNumber(unsigned int n); - - /*! - * Returns the index of the page within the Ogg stream. This helps make it - * possible to determine if pages have been lost. - * - * \see setPageSequenceNumber() - */ - int pageSequenceNumber() const; - - /*! - * Sets the page's position in the stream to \a sequenceNumber. - * - * \see pageSequenceNumber() - */ - void setPageSequenceNumber(int sequenceNumber); - - /*! - * Returns the complete header size. - */ - int size() const; - - /*! - * Returns the size of the data portion of the page -- i.e. the size of the - * page less the header size. - */ - int dataSize() const; - - /*! - * Render the page header to binary data. - * - * \note The checksum -- bytes 22 - 25 -- will be left empty and must be - * filled in when rendering the entire page. - */ - ByteVector render() const; - - private: - PageHeader(const PageHeader &); - PageHeader &operator=(const PageHeader &); - - void read(Ogg::File *file, long pageOffset); - ByteVector lacingValues() const; - - class PageHeaderPrivate; - PageHeaderPrivate *d; - }; - - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/opusfile.h b/taglib/include/taglib/opusfile.h deleted file mode 100644 index bc78514..0000000 --- a/taglib/include/taglib/opusfile.h +++ /dev/null @@ -1,138 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_OPUSFILE_H -#define TAGLIB_OPUSFILE_H - -#include "oggfile.h" -#include "xiphcomment.h" - -#include "opusproperties.h" - -namespace TagLib { - - namespace Ogg { - - //! A namespace containing classes for Opus metadata - - namespace Opus { - - //! An implementation of Ogg::File with Opus specific methods - - /*! - * This is the central class in the Ogg Opus metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Opus specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs an Opus file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an Opus file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the Opus::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns whether or not the given \a stream can be opened as an Opus - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace Opus - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/opusproperties.h b/taglib/include/taglib/opusproperties.h deleted file mode 100644 index 2624fe1..0000000 --- a/taglib/include/taglib/opusproperties.h +++ /dev/null @@ -1,134 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_OPUSPROPERTIES_H -#define TAGLIB_OPUSPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace Ogg { - - namespace Opus { - - class File; - - //! An implementation of audio property reading for Ogg Opus - - /*! - * This reads the data from an Ogg Opus stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Opus::Properties with the data read from the - * Opus::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this Opus::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - * - * \note Always returns 48000, because Opus can decode any stream at a - * sample rate of 8, 12, 16, 24, or 48 kHz, - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * The Opus codec supports decoding at multiple sample rates, there is no - * single sample rate of the encoded stream. This returns the sample rate - * of the original audio stream. - */ - int inputSampleRate() const; - - /*! - * Returns the Opus version, in the range 0...255. - */ - int opusVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace Opus - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/ownershipframe.h b/taglib/include/taglib/ownershipframe.h deleted file mode 100644 index 24113b1..0000000 --- a/taglib/include/taglib/ownershipframe.h +++ /dev/null @@ -1,151 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Rupert Daniel - email : rupert@cancelmonday.com - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_OWNERSHIPFRAME_H -#define TAGLIB_OWNERSHIPFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 "ownership" - - /*! - * This implements the ID3v2 ownership (OWNE frame). It consists of - * a price paid, a date purchased (YYYYMMDD) and the name of the seller. - */ - - class TAGLIB_EXPORT OwnershipFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty ownership frame. - */ - explicit OwnershipFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a ownership based on the data in \a data. - */ - explicit OwnershipFrame(const ByteVector &data); - - /*! - * Destroys this OwnershipFrame instance. - */ - virtual ~OwnershipFrame(); - - /*! - * Returns the text of this popularimeter. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the date purchased. - * - * \see setDatePurchased() - */ - String datePurchased() const; - - /*! - * Set the date purchased. - * - * \see datePurchased() - */ - void setDatePurchased(const String &datePurchased); - - /*! - * Returns the price paid. - * - * \see setPricePaid() - */ - String pricePaid() const; - - /*! - * Set the price paid. - * - * \see pricePaid() - */ - void setPricePaid(const String &pricePaid); - - /*! - * Returns the seller. - * - * \see setSeller() - */ - String seller() const; - - /*! - * Set the seller. - * - * \see seller() - */ - void setSeller(const String &seller); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - OwnershipFrame(const ByteVector &data, Header *h); - OwnershipFrame(const OwnershipFrame &); - OwnershipFrame &operator=(const OwnershipFrame &); - - class OwnershipFramePrivate; - OwnershipFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/podcastframe.h b/taglib/include/taglib/podcastframe.h deleted file mode 100644 index a4a02f4..0000000 --- a/taglib/include/taglib/podcastframe.h +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_PODCASTFRAME_H -#define TAGLIB_PODCASTFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 podcast frame - /*! - * An implementation of ID3v2 podcast flag, a frame with four zero bytes. - */ - class TAGLIB_EXPORT PodcastFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct a podcast frame. - */ - PodcastFrame(); - - /*! - * Destroys this PodcastFrame instance. - */ - virtual ~PodcastFrame(); - - /*! - * Returns a null string. - */ - virtual String toString() const; - - PropertyMap asProperties() const; - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - PodcastFrame(const ByteVector &data, Header *h); - PodcastFrame(const PodcastFrame &); - PodcastFrame &operator=(const PodcastFrame &); - - class PodcastFramePrivate; - PodcastFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/popularimeterframe.h b/taglib/include/taglib/popularimeterframe.h deleted file mode 100644 index 59860b4..0000000 --- a/taglib/include/taglib/popularimeterframe.h +++ /dev/null @@ -1,132 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_POPULARIMETERFRAME_H -#define TAGLIB_POPULARIMETERFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 "popularimeter" - - /*! - * This implements the ID3v2 popularimeter (POPM frame). It consists of - * an email, a rating and an optional counter. - */ - - class TAGLIB_EXPORT PopularimeterFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty popularimeter frame. - */ - explicit PopularimeterFrame(); - - /*! - * Construct a popularimeter based on the data in \a data. - */ - explicit PopularimeterFrame(const ByteVector &data); - - /*! - * Destroys this PopularimeterFrame instance. - */ - virtual ~PopularimeterFrame(); - - /*! - * Returns the text of this popularimeter. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the email. - * - * \see setEmail() - */ - String email() const; - - /*! - * Set the email. - * - * \see email() - */ - void setEmail(const String &email); - - /*! - * Returns the rating. - * - * \see setRating() - */ - int rating() const; - - /*! - * Set the rating. - * - * \see rating() - */ - void setRating(int rating); - - /*! - * Returns the counter. - * - * \see setCounter() - */ - unsigned int counter() const; - - /*! - * Set the counter. - * - * \see counter() - */ - void setCounter(unsigned int counter); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - PopularimeterFrame(const ByteVector &data, Header *h); - PopularimeterFrame(const PopularimeterFrame &); - PopularimeterFrame &operator=(const PopularimeterFrame &); - - class PopularimeterFramePrivate; - PopularimeterFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/privateframe.h b/taglib/include/taglib/privateframe.h deleted file mode 100644 index eeed521..0000000 --- a/taglib/include/taglib/privateframe.h +++ /dev/null @@ -1,111 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Serkan Kalyoncu - copyright : (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_PRIVATEFRAME_H -#define TAGLIB_PRIVATEFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 privateframe - - class TAGLIB_EXPORT PrivateFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty private frame. - */ - PrivateFrame(); - - /*! - * Construct a private frame based on the data in \a data. - * - * \note This is the constructor used when parsing the frame from a file. - */ - explicit PrivateFrame(const ByteVector &data); - - /*! - * Destroys this private frame instance. - */ - virtual ~PrivateFrame(); - - /*! - * Returns the text of this private frame, currently just the owner. - * - * \see text() - */ - virtual String toString() const; - - /*! - * \return The owner of the private frame. - * \note This should contain an email address or link to a website. - */ - String owner() const; - - /*! - * - */ - ByteVector data() const; - - /*! - * Sets the owner of the frame to \a s. - * \note This should contain an email address or link to a website. - */ - void setOwner(const String &s); - - /*! - * - */ - void setData(const ByteVector &v); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - PrivateFrame(const ByteVector &data, Header *h); - - PrivateFrame(const PrivateFrame &); - PrivateFrame &operator=(const PrivateFrame &); - - class PrivateFramePrivate; - PrivateFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/relativevolumeframe.h b/taglib/include/taglib/relativevolumeframe.h deleted file mode 100644 index a3ff9bd..0000000 --- a/taglib/include/taglib/relativevolumeframe.h +++ /dev/null @@ -1,274 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_RELATIVEVOLUMEFRAME_H -#define TAGLIB_RELATIVEVOLUMEFRAME_H - -#include "tlist.h" -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 relative volume adjustment frame implementation - - /*! - * This is an implementation of ID3v2 relative volume adjustment. The - * presence of this frame makes it possible to specify an increase in volume - * for an audio file or specific audio tracks in that file. - * - * Multiple relative volume adjustment frames may be present in the tag - * each with a unique identification and describing volume adjustment for - * different channel types. - */ - - class TAGLIB_EXPORT RelativeVolumeFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * This indicates the type of volume adjustment that should be applied. - */ - enum ChannelType { - //! A type not enumerated below - Other = 0x00, - //! The master volume for the track - MasterVolume = 0x01, - //! The front right audio channel - FrontRight = 0x02, - //! The front left audio channel - FrontLeft = 0x03, - //! The back right audio channel - BackRight = 0x04, - //! The back left audio channel - BackLeft = 0x05, - //! The front center audio channel - FrontCentre = 0x06, - //! The back center audio channel - BackCentre = 0x07, - //! The subwoofer audio channel - Subwoofer = 0x08 - }; - - //! Struct that stores the relevant values for ID3v2 peak volume - - /*! - * The peak volume is described as a series of bits that is padded to fill - * a block of bytes. These two values should always be updated in tandem. - */ - struct PeakVolume - { - /*! - * Constructs an empty peak volume description. - */ - PeakVolume() : bitsRepresentingPeak(0) {} - /*! - * The number of bits (in the range of 0 to 255) used to describe the - * peak volume. - */ - unsigned char bitsRepresentingPeak; - /*! - * The array of bits (represented as a series of bytes) used to describe - * the peak volume. - */ - ByteVector peakVolume; - }; - - /*! - * Constructs a RelativeVolumeFrame. The relevant data should be set - * manually. - */ - RelativeVolumeFrame(); - - /*! - * Constructs a RelativeVolumeFrame based on the contents of \a data. - */ - RelativeVolumeFrame(const ByteVector &data); - - /*! - * Destroys the RelativeVolumeFrame instance. - */ - virtual ~RelativeVolumeFrame(); - - /*! - * Returns the frame's identification. - * - * \see identification() - */ - virtual String toString() const; - - /*! - * Returns a list of channels with information currently in the frame. - */ - List channels() const; - - /*! - * \deprecated Always returns master volume. - */ - TAGLIB_DEPRECATED ChannelType channelType() const; - - /*! - * \deprecated This method no longer has any effect. - */ - TAGLIB_DEPRECATED void setChannelType(ChannelType t); - - /* - * There was a terrible API goof here, and while this can't be changed to - * the way it appears below for binary compatibility reasons, let's at - * least pretend that it looks clean. - */ - -#ifdef DOXYGEN - - /*! - * Returns the relative volume adjustment "index". As indicated by the - * ID3v2 standard this is a 16-bit signed integer that reflects the - * decibels of adjustment when divided by 512. - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setVolumeAdjustmentIndex() - * \see volumeAdjustment() - */ - short volumeAdjustmentIndex(ChannelType type = MasterVolume) const; - - /*! - * Set the volume adjustment to \a index. As indicated by the ID3v2 - * standard this is a 16-bit signed integer that reflects the decibels of - * adjustment when divided by 512. - * - * By default this sets the value for the master volume. - * - * \see volumeAdjustmentIndex() - * \see setVolumeAdjustment() - */ - void setVolumeAdjustmentIndex(short index, ChannelType type = MasterVolume); - - /*! - * Returns the relative volume adjustment in decibels. - * - * \note Because this is actually stored internally as an "index" to this - * value the value returned by this method may not be identical to the - * value set using setVolumeAdjustment(). - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setVolumeAdjustment() - * \see volumeAdjustmentIndex() - */ - float volumeAdjustment(ChannelType type = MasterVolume) const; - - /*! - * Set the relative volume adjustment in decibels to \a adjustment. - * - * By default this sets the value for the master volume. - * - * \note Because this is actually stored internally as an "index" to this - * value the value set by this method may not be identical to the one - * returned by volumeAdjustment(). - * - * \see setVolumeAdjustment() - * \see volumeAdjustmentIndex() - */ - void setVolumeAdjustment(float adjustment, ChannelType type = MasterVolume); - - /*! - * Returns the peak volume (represented as a length and a string of bits). - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setPeakVolume() - */ - PeakVolume peakVolume(ChannelType type = MasterVolume) const; - - /*! - * Sets the peak volume to \a peak. - * - * By default this sets the value for the master volume. - * - * \see peakVolume() - */ - void setPeakVolume(const PeakVolume &peak, ChannelType type = MasterVolume); - -#else - - // BIC: Combine each of the following pairs of functions (or maybe just - // rework this junk altogether). - - short volumeAdjustmentIndex(ChannelType type) const; - short volumeAdjustmentIndex() const; - - void setVolumeAdjustmentIndex(short index, ChannelType type); - void setVolumeAdjustmentIndex(short index); - - float volumeAdjustment(ChannelType type) const; - float volumeAdjustment() const; - - void setVolumeAdjustment(float adjustment, ChannelType type); - void setVolumeAdjustment(float adjustment); - - PeakVolume peakVolume(ChannelType type) const; - PeakVolume peakVolume() const; - - void setPeakVolume(const PeakVolume &peak, ChannelType type); - void setPeakVolume(const PeakVolume &peak); - -#endif - - /*! - * Returns the identification for this frame. - */ - String identification() const; - - /*! - * Sets the identification of the frame to \a s. The string - * is used to identify the situation and/or device where this - * adjustment should apply. - */ - void setIdentification(const String &s); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - RelativeVolumeFrame(const ByteVector &data, Header *h); - RelativeVolumeFrame(const RelativeVolumeFrame &); - RelativeVolumeFrame &operator=(const RelativeVolumeFrame &); - - class RelativeVolumeFramePrivate; - RelativeVolumeFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/rifffile.h b/taglib/include/taglib/rifffile.h deleted file mode 100644 index 1ed4950..0000000 --- a/taglib/include/taglib/rifffile.h +++ /dev/null @@ -1,161 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_RIFFFILE_H -#define TAGLIB_RIFFFILE_H - -#include "taglib_export.h" -#include "tfile.h" - -namespace TagLib { - - //! An implementation of TagLib::File with RIFF specific methods - - namespace RIFF { - - //! An RIFF file class with some useful methods specific to RIFF - - /*! - * This implements the generic TagLib::File API and additionally provides - * access to properties that are distinct to RIFF files, notably access - * to the different ID3 tags. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - protected: - - enum Endianness { BigEndian, LittleEndian }; - - File(FileName file, Endianness endianness); - File(IOStream *stream, Endianness endianness); - - /*! - * \return The size of the main RIFF chunk. - */ - unsigned int riffSize() const; - - /*! - * \return The number of chunks in the file. - */ - unsigned int chunkCount() const; - - /*! - * \return The offset within the file for the selected chunk number. - */ - unsigned int chunkOffset(unsigned int i) const; - - /*! - * \return The size of the chunk data. - */ - unsigned int chunkDataSize(unsigned int i) const; - - /*! - * \return The size of the padding after the chunk (can be either 0 or 1). - */ - unsigned int chunkPadding(unsigned int i) const; - - /*! - * \return The name of the specified chunk, for instance, "COMM" or "ID3 " - */ - ByteVector chunkName(unsigned int i) const; - - /*! - * Reads the chunk data from the file and returns it. - * - * \note This \e will move the read pointer for the file. - */ - ByteVector chunkData(unsigned int i); - - /*! - * Sets the data for the specified chunk to \a data. - * - * \warning This will update the file immediately. - */ - void setChunkData(unsigned int i, const ByteVector &data); - - /*! - * Sets the data for the chunk \a name to \a data. If a chunk with the - * given name already exists it will be overwritten, otherwise it will be - * created after the existing chunks. - * - * \warning This will update the file immediately. - */ - void setChunkData(const ByteVector &name, const ByteVector &data); - - /*! - * Sets the data for the chunk \a name to \a data. If a chunk with the - * given name already exists it will be overwritten, otherwise it will be - * created after the existing chunks. - * - * \note If \a alwaysCreate is true, a new chunk is created regardless of - * whether or not the chunk \a name exists. It should only be used for - * "LIST" chunks. - * - * \warning This will update the file immediately. - */ - void setChunkData(const ByteVector &name, const ByteVector &data, bool alwaysCreate); - - /*! - * Removes the specified chunk. - * - * \warning This will update the file immediately. - */ - void removeChunk(unsigned int i); - - /*! - * Removes the chunk \a name. - * - * \warning This will update the file immediately. - * \warning This removes all the chunks with the given name. - */ - void removeChunk(const ByteVector &name); - - private: - File(const File &); - File &operator=(const File &); - - void read(); - void writeChunk(const ByteVector &name, const ByteVector &data, - unsigned long offset, unsigned long replace = 0); - - /*! - * Update the global RIFF size based on the current internal structure. - */ - void updateGlobalSize(); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace RIFF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/s3mfile.h b/taglib/include/taglib/s3mfile.h deleted file mode 100644 index f9ff605..0000000 --- a/taglib/include/taglib/s3mfile.h +++ /dev/null @@ -1,112 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_S3MFILE_H -#define TAGLIB_S3MFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "s3mproperties.h" - -namespace TagLib { - - namespace S3M { - - class TAGLIB_EXPORT File : public Mod::FileBase { - public: - /*! - * Constructs a ScreamTracker III from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs a ScreamTracker III file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * Forwards to Mod::Tag::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Forwards to Mod::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the S3M::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - S3M::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving ScreamTracker III tags is not supported. - */ - bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace S3M -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/s3mproperties.h b/taglib/include/taglib/s3mproperties.h deleted file mode 100644 index fda5952..0000000 --- a/taglib/include/taglib/s3mproperties.h +++ /dev/null @@ -1,94 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_S3MPROPERTIES_H -#define TAGLIB_S3MPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - namespace S3M { - class TAGLIB_EXPORT Properties : public AudioProperties { - friend class File; - public: - /*! Flag bits. */ - enum { - ST2Vibrato = 1, - ST2Tempo = 2, - AmigaSlides = 4, - Vol0MixOptimizations = 8, - AmigaLimits = 16, - EnableFilter = 32, - CustomData = 128 - }; - - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int lengthInSeconds() const; - int lengthInMilliseconds() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - unsigned short lengthInPatterns() const; - bool stereo() const; - unsigned short sampleCount() const; - unsigned short patternCount() const; - unsigned short flags() const; - unsigned short trackerVersion() const; - unsigned short fileFormatVersion() const; - unsigned char globalVolume() const; - unsigned char masterVolume() const; - unsigned char tempo() const; - unsigned char bpmSpeed() const; - - void setChannels(int channels); - - void setLengthInPatterns (unsigned short lengthInPatterns); - void setStereo (bool stereo); - void setSampleCount (unsigned short sampleCount); - void setPatternCount (unsigned short patternCount); - void setFlags (unsigned short flags); - void setTrackerVersion (unsigned short trackerVersion); - void setFileFormatVersion(unsigned short fileFormatVersion); - void setGlobalVolume (unsigned char globalVolume); - void setMasterVolume (unsigned char masterVolume); - void setTempo (unsigned char tempo); - void setBpmSpeed (unsigned char bpmSpeed); - - private: - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace S3M -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/speexfile.h b/taglib/include/taglib/speexfile.h deleted file mode 100644 index f8c002a..0000000 --- a/taglib/include/taglib/speexfile.h +++ /dev/null @@ -1,138 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_SPEEXFILE_H -#define TAGLIB_SPEEXFILE_H - -#include "oggfile.h" -#include "xiphcomment.h" - -#include "speexproperties.h" - -namespace TagLib { - - namespace Ogg { - - //! A namespace containing classes for Speex metadata - - namespace Speex { - - //! An implementation of Ogg::File with Speex specific methods - - /*! - * This is the central class in the Ogg Speex metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Speex specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs a Speex file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a Speex file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the Speex::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns whether or not the given \a stream can be opened as a Speex - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace Speex - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/speexproperties.h b/taglib/include/taglib/speexproperties.h deleted file mode 100644 index 12f09e0..0000000 --- a/taglib/include/taglib/speexproperties.h +++ /dev/null @@ -1,129 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_SPEEXPROPERTIES_H -#define TAGLIB_SPEEXPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace Ogg { - - namespace Speex { - - class File; - - //! An implementation of audio property reading for Ogg Speex - - /*! - * This reads the data from an Ogg Speex stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Speex::Properties with the data read from the - * Speex::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this Speex::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the nominal bit rate as read from the Speex header in kb/s. - */ - int bitrateNominal() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the Speex version, currently "0" (as specified by the spec). - */ - int speexVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace Speex - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/synchronizedlyricsframe.h b/taglib/include/taglib/synchronizedlyricsframe.h deleted file mode 100644 index a701d21..0000000 --- a/taglib/include/taglib/synchronizedlyricsframe.h +++ /dev/null @@ -1,231 +0,0 @@ -/*************************************************************************** - copyright : (C) 2014 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_SYNCHRONIZEDLYRICSFRAME_H -#define TAGLIB_SYNCHRONIZEDLYRICSFRAME_H - -#include "id3v2frame.h" -#include "tlist.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 synchronized lyrics frame - /*! - * An implementation of ID3v2 synchronized lyrics. - */ - class TAGLIB_EXPORT SynchronizedLyricsFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * Specifies the timestamp format used. - */ - enum TimestampFormat { - //! The timestamp is of unknown format. - Unknown = 0x00, - //! The timestamp represents the number of MPEG frames since - //! the beginning of the audio stream. - AbsoluteMpegFrames = 0x01, - //! The timestamp represents the number of milliseconds since - //! the beginning of the audio stream. - AbsoluteMilliseconds = 0x02 - }; - - /*! - * Specifies the type of text contained. - */ - enum Type { - //! The text is some other type of text. - Other = 0x00, - //! The text contains lyrical data. - Lyrics = 0x01, - //! The text contains a transcription. - TextTranscription = 0x02, - //! The text lists the movements in the piece. - Movement = 0x03, - //! The text describes events that occur. - Events = 0x04, - //! The text contains chord changes that occur in the music. - Chord = 0x05, - //! The text contains trivia or "pop up" information about the media. - Trivia = 0x06, - //! The text contains URLs for relevant webpages. - WebpageUrls = 0x07, - //! The text contains URLs for relevant images. - ImageUrls = 0x08 - }; - - /*! - * Single entry of time stamp and lyrics text. - */ - struct SynchedText { - SynchedText(unsigned int ms, String str) : time(ms), text(str) {} - unsigned int time; - String text; - }; - - /*! - * List of synchronized lyrics. - */ - typedef TagLib::List SynchedTextList; - - /*! - * Construct an empty synchronized lyrics frame that will use the text - * encoding \a encoding. - */ - explicit SynchronizedLyricsFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a synchronized lyrics frame based on the data in \a data. - */ - explicit SynchronizedLyricsFrame(const ByteVector &data); - - /*! - * Destroys this SynchronizedLyricsFrame instance. - */ - virtual ~SynchronizedLyricsFrame(); - - /*! - * Returns the description of this synchronized lyrics frame. - * - * \see description() - */ - virtual String toString() const; - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Returns the language encoding as a 3 byte encoding as specified by - * ISO-639-2. - * - * \note Most taggers simply ignore this value. - * - * \see setLanguage() - */ - ByteVector language() const; - - /*! - * Returns the timestamp format. - */ - TimestampFormat timestampFormat() const; - - /*! - * Returns the type of text contained. - */ - Type type() const; - - /*! - * Returns the description of this synchronized lyrics frame. - * - * \note Most taggers simply ignore this value. - * - * \see setDescription() - */ - String description() const; - - /*! - * Returns the text with the time stamps. - */ - SynchedTextList synchedText() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Set the language using the 3 byte language code from - * ISO-639-2 to - * \a languageCode. - * - * \see language() - */ - void setLanguage(const ByteVector &languageCode); - - /*! - * Set the timestamp format. - * - * \see timestampFormat() - */ - void setTimestampFormat(TimestampFormat f); - - /*! - * Set the type of text contained. - * - * \see type() - */ - void setType(Type t); - - /*! - * Sets the description of the synchronized lyrics frame to \a s. - * - * \see description() - */ - void setDescription(const String &s); - - /*! - * Sets the text with the time stamps. - * - * \see text() - */ - void setSynchedText(const SynchedTextList &t); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - SynchronizedLyricsFrame(const ByteVector &data, Header *h); - SynchronizedLyricsFrame(const SynchronizedLyricsFrame &); - SynchronizedLyricsFrame &operator=(const SynchronizedLyricsFrame &); - - class SynchronizedLyricsFramePrivate; - SynchronizedLyricsFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/tableofcontentsframe.h b/taglib/include/taglib/tableofcontentsframe.h deleted file mode 100644 index 1f327e9..0000000 --- a/taglib/include/taglib/tableofcontentsframe.h +++ /dev/null @@ -1,260 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Lukas Krejci - email : krejclu6@fel.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_TABLEOFCONTENTSFRAME -#define TAGLIB_TABLEOFCONTENTSFRAME - -#include "id3v2tag.h" -#include "id3v2frame.h" - -#include "tbytevectorlist.h" - -namespace TagLib { - - namespace ID3v2 { - - /*! - * This is an implementation of ID3v2 table of contents frames. Purpose - * of this frame is to allow a table of contents to be defined. - */ - - //! An implementation of ID3v2 table of contents frames - - class TAGLIB_EXPORT TableOfContentsFrame : public ID3v2::Frame - { - friend class FrameFactory; - - public: - /*! - * Creates a table of contents frame based on \a data. \a tagHeader is - * required as the internal frames are parsed based on the tag version. - */ - TableOfContentsFrame(const ID3v2::Header *tagHeader, const ByteVector &data); - - /*! - * Creates a table of contents frame with the element ID \a elementID, - * the child elements \a children and embedded frames, which become owned - * by this frame, in \a embeddedFrames. - */ - TableOfContentsFrame(const ByteVector &elementID, - const ByteVectorList &children = ByteVectorList(), - const FrameList &embeddedFrames = FrameList()); - - /*! - * Destroys the frame. - */ - ~TableOfContentsFrame(); - - /*! - * Returns the elementID of the frame. Element ID - * is a null terminated string, however it's not human-readable. - * - * \see setElementID() - */ - ByteVector elementID() const; - - /*! - * Returns true, if the frame is top-level (doesn't have - * any parent CTOC frame). - * - * \see setIsTopLevel() - */ - bool isTopLevel() const; - - /*! - * Returns true, if the child elements list entries - * are ordered. - * - * \see setIsOrdered() - */ - bool isOrdered() const; - - /*! - * Returns count of child elements of the frame. It always - * corresponds to size of child elements list. - * - * \see childElements() - */ - unsigned int entryCount() const; - - /*! - * Returns list of child elements of the frame. - * - * \see setChildElements() - */ - ByteVectorList childElements() const; - - /*! - * Sets the elementID of the frame to \a eID. If \a eID isn't - * null terminated, a null char is appended automatically. - * - * \see elementID() - */ - void setElementID(const ByteVector &eID); - - /*! - * Sets, if the frame is top-level (doesn't have - * any parent CTOC frame). - * - * \see isTopLevel() - */ - void setIsTopLevel(const bool &t); - - /*! - * Sets, if the child elements list entries - * are ordered. - * - * \see isOrdered() - */ - void setIsOrdered(const bool &o); - - /*! - * Sets list of child elements of the frame to \a l. - * - * \see childElements() - */ - void setChildElements(const ByteVectorList &l); - - /*! - * Adds \a cE to list of child elements of the frame. - * - * \see childElements() - */ - void addChildElement(const ByteVector &cE); - - /*! - * Removes \a cE to list of child elements of the frame. - * - * \see childElements() - */ - void removeChildElement(const ByteVector &cE); - - /*! - * Returns a reference to the frame list map. This is an FrameListMap of - * all of the frames embedded in the CTOC frame. - * - * This is the most convenient structure for accessing the CTOC frame's - * embedded frames. Many frame types allow multiple instances of the same - * frame type so this is a map of lists. In most cases however there will - * only be a single frame of a certain type. - * - * \warning You should not modify this data structure directly, instead - * use addEmbeddedFrame() and removeEmbeddedFrame(). - * - * \see embeddedFrameList() - */ - const FrameListMap &embeddedFrameListMap() const; - - /*! - * Returns a reference to the embedded frame list. This is an FrameList - * of all of the frames embedded in the CTOC frame in the order that they - * were parsed. - * - * This can be useful if for example you want iterate over the CTOC frame's - * embedded frames in the order that they occur in the CTOC frame. - * - * \warning You should not modify this data structure directly, instead - * use addEmbeddedFrame() and removeEmbeddedFrame(). - */ - const FrameList &embeddedFrameList() const; - - /*! - * Returns the embedded frame list for frames with the id \a frameID - * or an empty list if there are no embedded frames of that type. This - * is just a convenience and is equivalent to: - * - * \code - * embeddedFrameListMap()[frameID]; - * \endcode - * - * \see embeddedFrameListMap() - */ - const FrameList &embeddedFrameList(const ByteVector &frameID) const; - - /*! - * Add an embedded frame to the CTOC frame. At this point the CTOC frame - * takes ownership of the embedded frame and will handle freeing its memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by embeddedFrameList() - */ - void addEmbeddedFrame(Frame *frame); - - /*! - * Remove an embedded frame from the CTOC frame. If \a del is true the frame's - * memory will be freed; if it is false, it must be deleted by the user. - * - * \note Using this method will invalidate any pointers on the list - * returned by embeddedFrameList() - */ - void removeEmbeddedFrame(Frame *frame, bool del = true); - - /*! - * Remove all embedded frames of type \a id from the CTOC frame and free their - * memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by embeddedFrameList() - */ - void removeEmbeddedFrames(const ByteVector &id); - - virtual String toString() const; - - PropertyMap asProperties() const; - - /*! - * CTOC frames each have a unique element ID. This searches for a CTOC - * frame with the element ID \a eID and returns a pointer to it. This - * can be used to link together parent and child CTOC frames. - * - * \see elementID() - */ - static TableOfContentsFrame *findByElementID(const Tag *tag, const ByteVector &eID); - - /*! - * CTOC frames each contain a flag that indicates, if CTOC frame is top-level (there isn't - * any frame, which contains this frame in its child elements list). Only a single frame - * within tag can be top-level. This searches for a top-level CTOC frame. - * - * \see isTopLevel() - */ - static TableOfContentsFrame *findTopLevel(const Tag *tag); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - TableOfContentsFrame(const ID3v2::Header *tagHeader, const ByteVector &data, Header *h); - TableOfContentsFrame(const TableOfContentsFrame &); - TableOfContentsFrame &operator=(const TableOfContentsFrame &); - - class TableOfContentsFramePrivate; - TableOfContentsFramePrivate *d; - }; - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/tag.h b/taglib/include/taglib/tag.h deleted file mode 100644 index a445880..0000000 --- a/taglib/include/taglib/tag.h +++ /dev/null @@ -1,201 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_TAG_H -#define TAGLIB_TAG_H - -#include "taglib_export.h" -#include "tstring.h" - -namespace TagLib { - - //! A simple, generic interface to common audio meta data fields - - /*! - * This is an attempt to abstract away the difference in the meta data formats - * of various audio codecs and tagging schemes. As such it is generally a - * subset of what is available in the specific formats but should be suitable - * for most applications. This is meant to compliment the generic APIs found - * in TagLib::AudioProperties, TagLib::File and TagLib::FileRef. - */ - - class PropertyMap; - - class TAGLIB_EXPORT Tag - { - public: - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Exports the tags of the file as dictionary mapping (human readable) tag - * names (Strings) to StringLists of tag values. - * The default implementation in this class considers only the usual built-in - * tags (artist, album, ...) and only one value per key. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties, or a subset of them, from the tag. - * The parameter \a properties must contain only entries from - * properties().unsupportedData(). - * BIC: Will become virtual in future releases. Currently the non-virtual - * standard implementation of TagLib::Tag does nothing, since there are - * no unsupported elements. - */ - void removeUnsupportedProperties(const StringList& properties); - - /*! - * Sets the tags of this File to those specified in \a properties. This default - * implementation sets only the tags for which setter methods exist in this class - * (artist, album, ...), and only one value per key; the rest will be contained - * in the returned PropertyMap. - */ - PropertyMap setProperties(const PropertyMap &properties); - - /*! - * Returns the track name; if no track name is present in the tag - * String::null will be returned. - */ - virtual String title() const = 0; - - /*! - * Returns the artist name; if no artist name is present in the tag - * String::null will be returned. - */ - virtual String artist() const = 0; - - /*! - * Returns the album name; if no album name is present in the tag - * String::null will be returned. - */ - virtual String album() const = 0; - - /*! - * Returns the track comment; if no comment is present in the tag - * String::null will be returned. - */ - virtual String comment() const = 0; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String genre() const = 0; - - /*! - * Returns the year; if there is no year set, this will return 0. - */ - virtual unsigned int year() const = 0; - - /*! - * Returns the track number; if there is no track number set, this will - * return 0. - */ - virtual unsigned int track() const = 0; - - /*! - * Sets the title to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setTitle(const String &s) = 0; - - /*! - * Sets the artist to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setArtist(const String &s) = 0; - - /*! - * Sets the album to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setAlbum(const String &s) = 0; - - /*! - * Sets the comment to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setComment(const String &s) = 0; - - /*! - * Sets the genre to \a s. If \a s is String::null then this value will be - * cleared. For tag formats that use a fixed set of genres, the appropriate - * value will be selected based on a string comparison. A list of available - * genres for those formats should be available in that type's - * implementation. - */ - virtual void setGenre(const String &s) = 0; - - /*! - * Sets the year to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setYear(unsigned int i) = 0; - - /*! - * Sets the track to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setTrack(unsigned int i) = 0; - - /*! - * Returns true if the tag does not contain any data. This should be - * reimplemented in subclasses that provide more than the basic tagging - * abilities in this class. - */ - virtual bool isEmpty() const; - - /*! - * Copies the generic data from one tag to another. - * - * \note This will no affect any of the lower level details of the tag. For - * instance if any of the tag type specific data (maybe a URL for a band) is - * set, this will not modify or copy that. This just copies using the API - * in this class. - * - * If \a overwrite is true then the values will be unconditionally copied. - * If false only empty values will be overwritten. - */ - static void duplicate(const Tag *source, Tag *target, bool overwrite = true); - - protected: - /*! - * Construct a Tag. This is protected since tags should only be instantiated - * through subclasses. - */ - Tag(); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/tag_c.h b/taglib/include/taglib/tag_c.h deleted file mode 100644 index 8d5f85f..0000000 --- a/taglib/include/taglib/tag_c.h +++ /dev/null @@ -1,299 +0,0 @@ -/*************************************************************************** - 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 * - ***************************************************************************/ - -#ifndef TAGLIB_TAG_C -#define TAGLIB_TAG_C - -/* Do not include this in the main TagLib documentation. */ -#ifndef DO_NOT_DOCUMENT - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(TAGLIB_STATIC) -#define TAGLIB_C_EXPORT -#elif defined(_WIN32) || defined(_WIN64) -#ifdef MAKE_TAGLIB_C_LIB -#define TAGLIB_C_EXPORT __declspec(dllexport) -#else -#define TAGLIB_C_EXPORT __declspec(dllimport) -#endif -#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) -#define TAGLIB_C_EXPORT __attribute__ ((visibility("default"))) -#else -#define TAGLIB_C_EXPORT -#endif - -#ifndef BOOL -#define BOOL int -#endif - -/******************************************************************************* - * [ TagLib C Binding ] - * - * This is an interface to TagLib's "simple" API, meaning that you can read and - * modify media files in a generic, but not specialized way. This is a rough - * representation of TagLib::File and TagLib::Tag, for which the documentation - * is somewhat more complete and worth consulting. - *******************************************************************************/ - -/* - * These are used for type provide some type safety to the C API (as opposed to - * using void *, but pointers to them are simply cast to the corresponding C++ - * types in the implementation. - */ - -typedef struct { int dummy; } TagLib_File; -typedef struct { int dummy; } TagLib_Tag; -typedef struct { int dummy; } TagLib_AudioProperties; - -/*! - * By default all strings coming into or out of TagLib's C API are in UTF8. - * However, it may be desirable for TagLib to operate on Latin1 (ISO-8859-1) - * strings in which case this should be set to FALSE. - */ -TAGLIB_C_EXPORT void taglib_set_strings_unicode(BOOL unicode); - -/*! - * TagLib can keep track of strings that are created when outputting tag values - * and clear them using taglib_tag_clear_strings(). This is enabled by default. - * However if you wish to do more fine grained management of strings, you can do - * so by setting \a management to FALSE. - */ -TAGLIB_C_EXPORT void taglib_set_string_management_enabled(BOOL management); - -/*! - * Explicitly free a string returned from TagLib - */ -TAGLIB_C_EXPORT void taglib_free(void* pointer); - -/******************************************************************************* - * File API - ******************************************************************************/ - -typedef enum { - TagLib_File_MPEG, - TagLib_File_OggVorbis, - TagLib_File_FLAC, - TagLib_File_MPC, - TagLib_File_OggFlac, - TagLib_File_WavPack, - TagLib_File_Speex, - TagLib_File_TrueAudio, - TagLib_File_MP4, - TagLib_File_ASF -} TagLib_File_Type; - -/*! - * Creates a TagLib file based on \a filename. TagLib will try to guess the file - * type. - * - * \returns NULL if the file type cannot be determined or the file cannot - * be opened. - */ -TAGLIB_C_EXPORT TagLib_File *taglib_file_new(const char *filename); - -/*! - * Creates a TagLib file based on \a filename. Rather than attempting to guess - * the type, it will use the one specified by \a type. - */ -TAGLIB_C_EXPORT TagLib_File *taglib_file_new_type(const char *filename, TagLib_File_Type type); - -/*! - * Frees and closes the file. - */ -TAGLIB_C_EXPORT void taglib_file_free(TagLib_File *file); - -/*! - * Returns true if the file is open and readable and valid information for - * the Tag and / or AudioProperties was found. - */ - -TAGLIB_C_EXPORT BOOL taglib_file_is_valid(const TagLib_File *file); - -/*! - * Returns a pointer to the tag associated with this file. This will be freed - * automatically when the file is freed. - */ -TAGLIB_C_EXPORT TagLib_Tag *taglib_file_tag(const TagLib_File *file); - -/*! - * Returns a pointer to the audio properties associated with this file. This - * will be freed automatically when the file is freed. - */ -TAGLIB_C_EXPORT const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file); - -/*! - * Saves the \a file to disk. - */ -TAGLIB_C_EXPORT BOOL taglib_file_save(TagLib_File *file); - -/****************************************************************************** - * Tag API - ******************************************************************************/ - -/*! - * Returns a string with this tag's title. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_title(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's artist. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_artist(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's album name. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_album(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's comment. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_comment(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's genre. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_genre(const TagLib_Tag *tag); - -/*! - * Returns the tag's year or 0 if year is not set. - */ -TAGLIB_C_EXPORT unsigned int taglib_tag_year(const TagLib_Tag *tag); - -/*! - * Returns the tag's track number or 0 if track number is not set. - */ -TAGLIB_C_EXPORT unsigned int taglib_tag_track(const TagLib_Tag *tag); - -/*! - * Sets the tag's title. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_title(TagLib_Tag *tag, const char *title); - -/*! - * Sets the tag's artist. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_artist(TagLib_Tag *tag, const char *artist); - -/*! - * Sets the tag's album. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_album(TagLib_Tag *tag, const char *album); - -/*! - * Sets the tag's comment. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_comment(TagLib_Tag *tag, const char *comment); - -/*! - * Sets the tag's genre. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_genre(TagLib_Tag *tag, const char *genre); - -/*! - * Sets the tag's year. 0 indicates that this field should be cleared. - */ -TAGLIB_C_EXPORT void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year); - -/*! - * Sets the tag's track number. 0 indicates that this field should be cleared. - */ -TAGLIB_C_EXPORT void taglib_tag_set_track(TagLib_Tag *tag, unsigned int track); - -/*! - * Frees all of the strings that have been created by the tag. - */ -TAGLIB_C_EXPORT void taglib_tag_free_strings(void); - -/****************************************************************************** - * Audio Properties API - ******************************************************************************/ - -/*! - * Returns the length of the file in seconds. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties); - -/*! - * Returns the bitrate of the file in kb/s. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties); - -/*! - * Returns the sample rate of the file in Hz. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties); - -/*! - * Returns the number of channels in the audio stream. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties); - -/******************************************************************************* - * Special convenience ID3v2 functions - *******************************************************************************/ - -typedef enum { - TagLib_ID3v2_Latin1, - TagLib_ID3v2_UTF16, - TagLib_ID3v2_UTF16BE, - TagLib_ID3v2_UTF8 -} TagLib_ID3v2_Encoding; - -/*! - * This sets the default encoding for ID3v2 frames that are written to tags. - */ - -TAGLIB_C_EXPORT void taglib_id3v2_set_default_text_encoding(TagLib_ID3v2_Encoding encoding); - -#ifdef __cplusplus -} -#endif -#endif /* DO_NOT_DOCUMENT */ -#endif diff --git a/taglib/include/taglib/taglib.h b/taglib/include/taglib/taglib.h deleted file mode 100644 index b754b26..0000000 --- a/taglib/include/taglib/taglib.h +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_H -#define TAGLIB_H - -#include "taglib_config.h" - -#define TAGLIB_MAJOR_VERSION 1 -#define TAGLIB_MINOR_VERSION 13 -#define TAGLIB_PATCH_VERSION 1 - -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) || defined(__clang__) -#define TAGLIB_IGNORE_MISSING_DESTRUCTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"") -#else -#define TAGLIB_IGNORE_MISSING_DESTRUCTOR -#endif - -#if (defined(_MSC_VER) && _MSC_VER >= 1600) -#define TAGLIB_CONSTRUCT_BITSET(x) static_cast(x) -#else -#define TAGLIB_CONSTRUCT_BITSET(x) static_cast(x) -#endif - -#if __cplusplus >= 201402 -#define TAGLIB_DEPRECATED [[deprecated]] -#elif defined(__GNUC__) || defined(__clang__) -#define TAGLIB_DEPRECATED __attribute__((deprecated)) -#elif defined(_MSC_VER) -#define TAGLIB_DEPRECATED __declspec(deprecated) -#else -#define TAGLIB_DEPRECATED -#endif - -#include - -//! A namespace for all TagLib related classes and functions - -/*! - * This namespace contains everything in TagLib. For projects working with - * TagLib extensively it may be convenient to add a - * \code - * using namespace TagLib; - * \endcode - */ - -namespace TagLib { - - class String; - - // These integer types are deprecated. Do not use them. - - typedef wchar_t wchar; // Assumed to be sufficient to store a UTF-16 char. - typedef unsigned char uchar; - typedef unsigned short ushort; - typedef unsigned int uint; - typedef unsigned long ulong; - typedef unsigned long long ulonglong; - - /*! - * Unfortunately std::wstring isn't defined on some systems, (i.e. GCC < 3) - * so I'm providing something here that should be constant. - */ - typedef std::basic_string wstring; -} // namespace TagLib - -/*! - * \mainpage TagLib - * - * \section intro Introduction - * - * TagLib is a library for reading and editing audio meta data, commonly know as \e tags. - * - * Features: - * - A clean, high level, C++ API to handling audio meta data. - * - Format specific APIs for advanced API users. - * - ID3v1, ID3v2, APE, FLAC, Xiph, iTunes-style MP4 and WMA tag formats. - * - MP3, MPC, FLAC, MP4, ASF, AIFF, WAV, TrueAudio, WavPack, Ogg FLAC, Ogg Vorbis, Speex and Opus file formats. - * - Basic audio file properties such as length, sample rate, etc. - * - Long term binary and source compatibility. - * - Extensible design, notably the ability to add other formats or extend current formats as a library user. - * - Full support for unicode and internationalized tags. - * - Dual MPL and - * LGPL licenses. - * - No external toolkit dependencies. - * - * \section why Why TagLib? - * - * TagLib originally was written to provide an updated and improved ID3v2 implementation in C++ for use - * in a variety of Open Source projects. Since development began in 2002 and the 1.0 release in 2004 - * it has expanded to cover a wide variety of tag and file formats and is used in a wide variety of - * Open Source and proprietary applications. It now supports a variety of UNIXes, including Apple's OS - * X, as well as Microsoft Windows. - * - * \section commercial Usage in Commercial Applications - * - * TagLib's licenses \e do allow usage within propriety (\e closed) applications, however TagLib is \e not - * public domain. Please note the requirements of the LGPL or MPL, and adhere to at least one of them. - * In simple terms, you must at a minimum note your usage of TagLib, note the licensing terms of TagLib and - * if you make changes to TagLib publish them. Please review the licenses above before using TagLib in your - * software. Note that you may choose either the MPL or the LGPL, you do not have to fulfill the - * requirements of both. - * - * \section installing Installing TagLib - * - * Please see the TagLib website for the latest - * downloads. - * - * TagLib can be built using the CMake build system. TagLib installs a taglib-config and pkg-config file to - * make it easier to integrate into various build systems. Note that TagLib's include install directory \e must - * be included in the header include path. Simply adding will \e not work. - * - * \section start Getting Started - * - * TagLib provides both simple, abstract APIs which make it possible to ignore the differences between tagging - * formats and format specific APIs which allow programmers to work with the features of specific tagging - * schemes. There is a similar abstraction mechanism for AudioProperties. - * - * The best place to start is with the Class Hierarchy linked at the top of the page. The File and - * AudioProperties classes and their subclasses are the core of TagLib. The FileRef class is also a convenient - * way for using a value-based handle. - * - * \note When working with FileRef please consider that it has only the most basic (extension-based) file - * type resolution. Please see its documentation on how to plug in more advanced file type resolution. (Such - * resolution may be part of later TagLib releases by default.) - * - * Here's a very simple example with TagLib: - * - * \code - * - * TagLib::FileRef f("Latex Solar Beef.mp3"); - * TagLib::String artist = f.tag()->artist(); // artist == "Frank Zappa" - * - * f.tag()->setAlbum("Fillmore East"); - * f.save(); - * - * TagLib::FileRef g("Free City Rhymes.ogg"); - * TagLib::String album = g.tag()->album(); // album == "NYC Ghosts & Flowers" - * - * g.tag()->setTrack(1); - * g.save(); - * - * \endcode - * - * More examples can be found in the \e examples directory of the source distribution. - * - * \section Contact - * - * Questions about TagLib should be directed to the TagLib mailing list, not directly to the author. - * - * - TagLib Homepage - * - TagLib Mailing List (taglib-devel@kde.org) - * - * \author TagLib authors. - */ - -#endif diff --git a/taglib/include/taglib/taglib_config.h b/taglib/include/taglib/taglib_config.h deleted file mode 100644 index 915f130..0000000 --- a/taglib/include/taglib/taglib_config.h +++ /dev/null @@ -1,11 +0,0 @@ -/* taglib_config.h. Generated by cmake from taglib_config.h.cmake */ - -#ifndef TAGLIB_TAGLIB_CONFIG_H -#define TAGLIB_TAGLIB_CONFIG_H - -/* These values are no longer used. This file is present only for compatibility reasons. */ - -#define TAGLIB_WITH_ASF 1 -#define TAGLIB_WITH_MP4 1 - -#endif diff --git a/taglib/include/taglib/taglib_export.h b/taglib/include/taglib/taglib_export.h deleted file mode 100644 index 737ae64..0000000 --- a/taglib/include/taglib/taglib_export.h +++ /dev/null @@ -1,43 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_EXPORT_H -#define TAGLIB_EXPORT_H - -#if defined(TAGLIB_STATIC) -#define TAGLIB_EXPORT -#elif (defined(_WIN32) || defined(_WIN64)) -#ifdef MAKE_TAGLIB_LIB -#define TAGLIB_EXPORT __declspec(dllexport) -#else -#define TAGLIB_EXPORT __declspec(dllimport) -#endif -#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) -#define TAGLIB_EXPORT __attribute__ ((visibility("default"))) -#else -#define TAGLIB_EXPORT -#endif - -#endif diff --git a/taglib/include/taglib/tbytevector.h b/taglib/include/taglib/tbytevector.h deleted file mode 100644 index bc8eda7..0000000 --- a/taglib/include/taglib/tbytevector.h +++ /dev/null @@ -1,635 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTOR_H -#define TAGLIB_BYTEVECTOR_H - -#include "taglib.h" -#include "taglib_export.h" - -#include -#include - -namespace TagLib { - - //! A byte vector - - /*! - * This class provides a byte vector with some methods that are useful for - * tagging purposes. Many of the search functions are tailored to what is - * useful for finding tag related patterns in a data array. - */ - - class TAGLIB_EXPORT ByteVector - { - public: -#ifndef DO_NOT_DOCUMENT - typedef std::vector::iterator Iterator; - typedef std::vector::const_iterator ConstIterator; - typedef std::vector::reverse_iterator ReverseIterator; - typedef std::vector::const_reverse_iterator ConstReverseIterator; -#endif - - /*! - * Constructs an empty byte vector. - */ - ByteVector(); - - /*! - * Construct a vector of size \a size with all values set to \a value by - * default. - */ - ByteVector(unsigned int size, char value = 0); - - /*! - * Constructs a byte vector that is a copy of \a v. - */ - ByteVector(const ByteVector &v); - - /*! - * Constructs a byte vector that is a copy of \a v. - */ - ByteVector(const ByteVector &v, unsigned int offset, unsigned int length); - - /*! - * Constructs a byte vector that contains \a c. - */ - ByteVector(char c); - - /*! - * Constructs a byte vector that copies \a data for up to \a length bytes. - */ - ByteVector(const char *data, unsigned int length); - - /*! - * Constructs a byte vector that copies \a data up to the first null - * byte. This is particularly useful for constructing byte arrays from - * string constants. - * - * \warning The behavior is undefined if \a data is not null terminated. - */ - ByteVector(const char *data); - - /*! - * Destroys this ByteVector instance. - */ - virtual ~ByteVector(); - - /*! - * Sets the data for the byte array using the first \a length bytes of \a data - */ - ByteVector &setData(const char *data, unsigned int length); - - /*! - * Sets the data for the byte array copies \a data up to the first null - * byte. The behavior is undefined if \a data is not null terminated. - */ - ByteVector &setData(const char *data); - - /*! - * Returns a pointer to the internal data structure. - * - * \warning Care should be taken when modifying this data structure as it is - * easy to corrupt the ByteVector when doing so. Specifically, while the - * data may be changed, its length may not be. - */ - char *data(); - - /*! - * Returns a pointer to the internal data structure which may not be modified. - */ - const char *data() const; - - /*! - * Returns a byte vector made up of the bytes starting at \a index and - * for \a length bytes. If \a length is not specified it will return the bytes - * from \a index to the end of the vector. - */ - ByteVector mid(unsigned int index, unsigned int length = 0xffffffff) const; - - /*! - * This essentially performs the same as operator[](), but instead of causing - * a runtime error if the index is out of bounds, it will return a null byte. - */ - char at(unsigned int index) const; - - /*! - * Searches the ByteVector for \a pattern starting at \a offset and returns - * the offset. Returns -1 if the pattern was not found. If \a byteAlign is - * specified the pattern will only be matched if it starts on a byte divisible - * by \a byteAlign (starting from \a offset). - */ - int find(const ByteVector &pattern, unsigned int offset = 0, int byteAlign = 1) const; - - /*! - * Searches the char for \a c starting at \a offset and returns - * the offset. Returns \a -1 if the pattern was not found. If \a byteAlign is - * specified the pattern will only be matched if it starts on a byte divisible - * by \a byteAlign (starting from \a offset). - */ - int find(char c, unsigned int offset = 0, int byteAlign = 1) const; - - /*! - * Searches the ByteVector for \a pattern starting from either the end of the - * vector or \a offset and returns the offset. Returns -1 if the pattern was - * not found. If \a byteAlign is specified the pattern will only be matched - * if it starts on a byte divisible by \a byteAlign (starting from \a offset). - */ - int rfind(const ByteVector &pattern, unsigned int offset = 0, int byteAlign = 1) const; - - /*! - * Checks to see if the vector contains the \a pattern starting at position - * \a offset. Optionally, if you only want to search for part of the pattern - * you can specify an offset within the pattern to start from. Also, you can - * specify to only check for the first \a patternLength bytes of \a pattern with - * the \a patternLength argument. - */ - bool containsAt(const ByteVector &pattern, unsigned int offset, - unsigned int patternOffset = 0, unsigned int patternLength = 0xffffffff) const; - - /*! - * Returns true if the vector starts with \a pattern. - */ - bool startsWith(const ByteVector &pattern) const; - - /*! - * Returns true if the vector ends with \a pattern. - */ - bool endsWith(const ByteVector &pattern) const; - - /*! - * Replaces \a oldByte with \a newByte and returns a reference to the - * ByteVector after the operation. This \e does modify the vector. - */ - ByteVector &replace(char oldByte, char newByte); - - /*! - * Replaces \a pattern with \a with and returns a reference to the ByteVector - * after the operation. This \e does modify the vector. - */ - ByteVector &replace(const ByteVector &pattern, const ByteVector &with); - - /*! - * Checks for a partial match of \a pattern at the end of the vector. It - * returns the offset of the partial match within the vector, or -1 if the - * pattern is not found. This method is particularly useful when searching for - * patterns that start in one vector and end in another. When combined with - * startsWith() it can be used to find a pattern that overlaps two buffers. - * - * \note This will not match the complete pattern at the end of the string; use - * endsWith() for that. - */ - int endsWithPartialMatch(const ByteVector &pattern) const; - - /*! - * Appends \a v to the end of the ByteVector. - */ - ByteVector &append(const ByteVector &v); - - /*! - * Appends \a c to the end of the ByteVector. - */ - ByteVector &append(char c); - - /*! - * Clears the data. - */ - ByteVector &clear(); - - /*! - * Returns the size of the array. - */ - unsigned int size() const; - - /*! - * Resize the vector to \a size. If the vector is currently less than - * \a size, pad the remaining spaces with \a padding. Returns a reference - * to the resized vector. - */ - ByteVector &resize(unsigned int size, char padding = 0); - - /*! - * Returns an Iterator that points to the front of the vector. - */ - Iterator begin(); - - /*! - * Returns a ConstIterator that points to the front of the vector. - */ - ConstIterator begin() const; - - /*! - * Returns an Iterator that points to the back of the vector. - */ - Iterator end(); - - /*! - * Returns a ConstIterator that points to the back of the vector. - */ - ConstIterator end() const; - - /*! - * Returns a ReverseIterator that points to the front of the vector. - */ - ReverseIterator rbegin(); - - /*! - * Returns a ConstReverseIterator that points to the front of the vector. - */ - ConstReverseIterator rbegin() const; - - /*! - * Returns a ReverseIterator that points to the back of the vector. - */ - ReverseIterator rend(); - - /*! - * Returns a ConstReverseIterator that points to the back of the vector. - */ - ConstReverseIterator rend() const; - - /*! - * Returns true if the vector is null. - * - * \note A vector may be empty without being null. So do not use this - * method to check if the vector is empty. - * - * \see isEmpty() - * - * \deprecated Use isEmpty(), do not differentiate between null and empty. - */ - // BIC: remove - TAGLIB_DEPRECATED bool isNull() const; - - /*! - * Returns true if the ByteVector is empty. - * - * \see size() - * \see isNull() - */ - bool isEmpty() const; - - /*! - * Returns a CRC checksum of the byte vector's data. - * - * \note This uses an uncommon variant of CRC32 specializes in Ogg. - */ - // BIC: Remove or make generic. - unsigned int checksum() const; - - /*! - * Converts the first 4 bytes of the vector to an unsigned integer. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see fromUInt() - */ - unsigned int toUInt(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 4 bytes at \a offset of the vector to an unsigned integer. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see fromUInt() - */ - unsigned int toUInt(unsigned int offset, bool mostSignificantByteFirst = true) const; - - /*! - * Converts the \a length bytes at \a offset of the vector to an unsigned - * integer. If \a length is larger than 4, the excess is ignored. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see fromUInt() - */ - unsigned int toUInt(unsigned int offset, unsigned int length, - bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 2 bytes of the vector to a (signed) short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - short toShort(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 2 bytes at \a offset of the vector to a (signed) short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - short toShort(unsigned int offset, bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 2 bytes of the vector to a unsigned short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - unsigned short toUShort(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 2 bytes at \a offset of the vector to a unsigned short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - unsigned short toUShort(unsigned int offset, bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 8 bytes of the vector to a (signed) long long. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 00 00 00 00 00 00 01 == 0x0000000000000001 == 1, - * if false, $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see fromUInt() - */ - long long toLongLong(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 8 bytes at \a offset of the vector to a (signed) long long. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 00 00 00 00 00 00 01 == 0x0000000000000001 == 1, - * if false, $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see fromUInt() - */ - long long toLongLong(unsigned int offset, bool mostSignificantByteFirst = true) const; - - /* - * Converts the 4 bytes at \a offset of the vector to a float as an IEEE754 - * 32-bit little-endian floating point number. - */ - float toFloat32LE(size_t offset) const; - - /* - * Converts the 4 bytes at \a offset of the vector to a float as an IEEE754 - * 32-bit big-endian floating point number. - */ - float toFloat32BE(size_t offset) const; - - /* - * Converts the 8 bytes at \a offset of the vector to a double as an IEEE754 - * 64-bit little-endian floating point number. - */ - double toFloat64LE(size_t offset) const; - - /* - * Converts the 8 bytes at \a offset of the vector to a double as an IEEE754 - * 64-bit big-endian floating point number. - */ - double toFloat64BE(size_t offset) const; - - /* - * Converts the 10 bytes at \a offset of the vector to a long double as an - * IEEE754 80-bit little-endian floating point number. - * - * \note This may compromise the precision depends on the size of long double. - */ - long double toFloat80LE(size_t offset) const; - - /* - * Converts the 10 bytes at \a offset of the vector to a long double as an - * IEEE754 80-bit big-endian floating point number. - * - * \note This may compromise the precision depends on the size of long double. - */ - long double toFloat80BE(size_t offset) const; - - /*! - * Creates a 4 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 00 00 01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see toUInt() - */ - static ByteVector fromUInt(unsigned int value, bool mostSignificantByteFirst = true); - - /*! - * Creates a 2 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 01 == 0x0001 == 1, if false, $01 00 == 0x0100 == 1. - * - * \see toShort() - */ - static ByteVector fromShort(short value, bool mostSignificantByteFirst = true); - - /*! - * Creates a 8 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 00 00 01 == 0x0000000000000001 == 1, if false, - * $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see toLongLong() - */ - static ByteVector fromLongLong(long long value, bool mostSignificantByteFirst = true); - - /*! - * Creates a 4 byte ByteVector based on \a value as an IEEE754 32-bit - * little-endian floating point number. - * - * \see fromFloat32BE() - */ - static ByteVector fromFloat32LE(float value); - - /*! - * Creates a 4 byte ByteVector based on \a value as an IEEE754 32-bit - * big-endian floating point number. - * - * \see fromFloat32LE() - */ - static ByteVector fromFloat32BE(float value); - - /*! - * Creates a 8 byte ByteVector based on \a value as an IEEE754 64-bit - * little-endian floating point number. - * - * \see fromFloat64BE() - */ - static ByteVector fromFloat64LE(double value); - - /*! - * Creates a 8 byte ByteVector based on \a value as an IEEE754 64-bit - * big-endian floating point number. - * - * \see fromFloat64LE() - */ - static ByteVector fromFloat64BE(double value); - - /*! - * Returns a ByteVector based on the CString \a s. - */ - static ByteVector fromCString(const char *s, unsigned int length = 0xffffffff); - - /*! - * Returns a const reference to the byte at \a index. - */ - const char &operator[](int index) const; - - /*! - * Returns a reference to the byte at \a index. - */ - char &operator[](int index); - - /*! - * Returns true if this ByteVector and \a v are equal. - */ - bool operator==(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector and \a v are not equal. - */ - bool operator!=(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector and the null terminated C string \a s - * contain the same data. - */ - bool operator==(const char *s) const; - - /*! - * Returns true if this ByteVector and the null terminated C string \a s - * do not contain the same data. - */ - bool operator!=(const char *s) const; - - /*! - * Returns true if this ByteVector is less than \a v. The value of the - * vectors is determined by evaluating the character from left to right, and - * in the event one vector is a superset of the other, the size is used. - */ - bool operator<(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector is greater than \a v. - */ - bool operator>(const ByteVector &v) const; - - /*! - * Returns a vector that is \a v appended to this vector. - */ - ByteVector operator+(const ByteVector &v) const; - - /*! - * Copies ByteVector \a v. - */ - ByteVector &operator=(const ByteVector &v); - - /*! - * Copies a byte \a c. - */ - ByteVector &operator=(char c); - - /*! - * Copies \a data up to the first null byte. - * - * \warning The behavior is undefined if \a data is not null terminated. - */ - ByteVector &operator=(const char *data); - - /*! - * Exchanges the content of the ByteVector by the content of \a v. - */ - void swap(ByteVector &v); - - /*! - * A static, empty ByteVector which is convenient and fast (since returning - * an empty or "null" value does not require instantiating a new ByteVector). - * - * \warning Do not modify this variable. It will mess up the internal state - * of TagLib. - * - * \deprecated Use ByteVector(). - */ - // BIC: remove - TAGLIB_DEPRECATED static ByteVector null; - - /*! - * Returns a hex-encoded copy of the byte vector. - */ - ByteVector toHex() const; - - /*! - * Returns a base64 encoded copy of the byte vector - */ - ByteVector toBase64() const; - - /*! - * Decodes the base64 encoded byte vector. - */ - static ByteVector fromBase64(const ByteVector &); - - protected: - /* - * If this ByteVector is being shared via implicit sharing, do a deep copy - * of the data and separate from the shared members. This should be called - * by all non-const subclass members. - */ - void detach(); - - private: - class ByteVectorPrivate; - ByteVectorPrivate *d; - }; -} // namespace TagLib - -/*! - * \relates TagLib::ByteVector - * Streams the ByteVector \a v to the output stream \a s. - */ -TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::ByteVector &v); - -#endif diff --git a/taglib/include/taglib/tbytevectorlist.h b/taglib/include/taglib/tbytevectorlist.h deleted file mode 100644 index 27fc64a..0000000 --- a/taglib/include/taglib/tbytevectorlist.h +++ /dev/null @@ -1,91 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTORLIST_H -#define TAGLIB_BYTEVECTORLIST_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "tlist.h" - -namespace TagLib { - - //! A list of ByteVectors - - /*! - * A List specialization with some handy features useful for ByteVectors. - */ - - class TAGLIB_EXPORT ByteVectorList : public List - { - public: - - /*! - * Construct an empty ByteVectorList. - */ - ByteVectorList(); - - /*! - * Destroys this ByteVectorList instance. - */ - virtual ~ByteVectorList(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - ByteVectorList(const ByteVectorList &l); - - /*! - * Convert the ByteVectorList to a ByteVector separated by \a separator. By - * default a space is used. - */ - ByteVector toByteVector(const ByteVector &separator = " ") const; - - /*! - * Splits the ByteVector \a v into several strings at \a pattern. This will - * not include the pattern in the returned ByteVectors. - */ - static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, - int byteAlign = 1); - /*! - * Splits the ByteVector \a v into several strings at \a pattern. This will - * not include the pattern in the returned ByteVectors. \a max is the - * maximum number of entries that will be separated. If \a max for instance - * is 2 then a maximum of 1 match will be found and the vector will be split - * on that match. - */ - // BIC: merge with the function above - static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, - int byteAlign, int max); - private: - class ByteVectorListPrivate; - ByteVectorListPrivate *d; - }; - -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/tbytevectorstream.h b/taglib/include/taglib/tbytevectorstream.h deleted file mode 100644 index 5aa8fcf..0000000 --- a/taglib/include/taglib/tbytevectorstream.h +++ /dev/null @@ -1,145 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTORSTREAM_H -#define TAGLIB_BYTEVECTORSTREAM_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" -#include "tiostream.h" - -namespace TagLib { - - class String; - class Tag; - class AudioProperties; - - //! In-memory Stream class using ByteVector for its storage. - - class TAGLIB_EXPORT ByteVectorStream : public IOStream - { - public: - /*! - * Construct a File object and opens the \a file. \a file should be a - * be a C-string in the local file system encoding. - */ - ByteVectorStream(const ByteVector &data); - - /*! - * Destroys this ByteVectorStream instance. - */ - virtual ~ByteVectorStream(); - - /*! - * Returns the file name in the local file system encoding. - */ - FileName name() const; - - /*! - * Reads a block of size \a length at the current get pointer. - */ - ByteVector readBlock(unsigned long length); - - /*! - * Attempts to write the block \a data at the current get pointer. If the - * file is currently only opened read only -- i.e. readOnly() returns true -- - * this attempts to reopen the file in read/write mode. - * - * \note This should be used instead of using the streaming output operator - * for a ByteVector. And even this function is significantly slower than - * doing output with a char[]. - */ - void writeBlock(const ByteVector &data); - - /*! - * Insert \a data at position \a start in the file overwriting \a replace - * bytes of the original content. - * - * \note This method is slow since it requires rewriting all of the file - * after the insertion point. - */ - void insert(const ByteVector &data, unsigned long start = 0, unsigned long replace = 0); - - /*! - * Removes a block of the file starting a \a start and continuing for - * \a length bytes. - * - * \note This method is slow since it involves rewriting all of the file - * after the removed portion. - */ - void removeBlock(unsigned long start = 0, unsigned long length = 0); - - /*! - * Returns true if the file is read only (or if the file can not be opened). - */ - bool readOnly() const; - - /*! - * Since the file can currently only be opened as an argument to the - * constructor (sort-of by design), this returns if that open succeeded. - */ - bool isOpen() const; - - /*! - * Move the I/O pointer to \a offset in the file from position \a p. This - * defaults to seeking from the beginning of the file. - * - * \see Position - */ - void seek(long offset, Position p = Beginning); - - /*! - * Reset the end-of-file and error flags on the file. - */ - void clear(); - - /*! - * Returns the current offset within the file. - */ - long tell() const; - - /*! - * Returns the length of the file. - */ - long length(); - - /*! - * Truncates the file to a \a length. - */ - void truncate(long length); - - ByteVector *data(); - - protected: - - private: - class ByteVectorStreamPrivate; - ByteVectorStreamPrivate *d; - }; - -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/tdebuglistener.h b/taglib/include/taglib/tdebuglistener.h deleted file mode 100644 index e4e4279..0000000 --- a/taglib/include/taglib/tdebuglistener.h +++ /dev/null @@ -1,74 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_DEBUGLISTENER_H -#define TAGLIB_DEBUGLISTENER_H - -#include "taglib_export.h" -#include "tstring.h" - -namespace TagLib -{ - //! An abstraction for the listener to the debug messages. - - /*! - * This class enables you to handle the debug messages in your preferred - * way by subclassing this class, reimplementing printMessage() and setting - * your reimplementation as the default with setDebugListener(). - * - * \see setDebugListener() - */ - class TAGLIB_EXPORT DebugListener - { - public: - DebugListener(); - virtual ~DebugListener(); - - /*! - * When overridden in a derived class, redirects \a msg to your preferred - * channel such as stderr, Windows debugger or so forth. - */ - virtual void printMessage(const String &msg) = 0; - - private: - // Noncopyable - DebugListener(const DebugListener &); - DebugListener &operator=(const DebugListener &); - }; - - /*! - * Sets the listener that decides how the debug messages are redirected. - * If the parameter \a listener is null, the previous listener is released - * and default stderr listener is restored. - * - * \note The caller is responsible for deleting the previous listener - * as needed after it is released. - * - * \see DebugListener - */ - TAGLIB_EXPORT void setDebugListener(DebugListener *listener); -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/textidentificationframe.h b/taglib/include/taglib/textidentificationframe.h deleted file mode 100644 index cc73f59..0000000 --- a/taglib/include/taglib/textidentificationframe.h +++ /dev/null @@ -1,313 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_TEXTIDENTIFICATIONFRAME_H -#define TAGLIB_TEXTIDENTIFICATIONFRAME_H - -#include "tstringlist.h" -#include "tmap.h" -#include "taglib_export.h" - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - class Tag; - typedef Map KeyConversionMap; - - //! An ID3v2 text identification frame implementation - - /*! - * This is an implementation of the most common type of ID3v2 frame -- text - * identification frames. There are a number of variations on this. Those - * enumerated in the ID3v2.4 standard are: - * - *
    - *
  • TALB Album/Movie/Show title
  • - *
  • TBPM BPM (beats per minute)
  • - *
  • TCOM Composer
  • - *
  • TCON Content type
  • - *
  • TCOP Copyright message
  • - *
  • TDEN Encoding time
  • - *
  • TDLY Playlist delay
  • - *
  • TDOR Original release time
  • - *
  • TDRC Recording time
  • - *
  • TDRL Release time
  • - *
  • TDTG Tagging time
  • - *
  • TENC Encoded by
  • - *
  • TEXT Lyricist/Text writer
  • - *
  • TFLT File type
  • - *
  • TIPL Involved people list
  • - *
  • TIT1 Content group description
  • - *
  • TIT2 Title/songname/content description
  • - *
  • TIT3 Subtitle/Description refinement
  • - *
  • TKEY Initial key
  • - *
  • TLAN Language(s)
  • - *
  • TLEN Length
  • - *
  • TMCL Musician credits list
  • - *
  • TMED Media type
  • - *
  • TMOO Mood
  • - *
  • TOAL Original album/movie/show title
  • - *
  • TOFN Original filename
  • - *
  • TOLY Original lyricist(s)/text writer(s)
  • - *
  • TOPE Original artist(s)/performer(s)
  • - *
  • TOWN File owner/licensee
  • - *
  • TPE1 Lead performer(s)/Soloist(s)
  • - *
  • TPE2 Band/orchestra/accompaniment
  • - *
  • TPE3 Conductor/performer refinement
  • - *
  • TPE4 Interpreted, remixed, or otherwise modified by
  • - *
  • TPOS Part of a set
  • - *
  • TPRO Produced notice
  • - *
  • TPUB Publisher
  • - *
  • TRCK Track number/Position in set
  • - *
  • TRSN Internet radio station name
  • - *
  • TRSO Internet radio station owner
  • - *
  • TSOA Album sort order
  • - *
  • TSOP Performer sort order
  • - *
  • TSOT Title sort order
  • - *
  • TSRC ISRC (international standard recording code)
  • - *
  • TSSE Software/Hardware and settings used for encoding
  • - *
  • TSST Set subtitle
  • - *
- * - * The ID3v2 Frames document gives a description of each of these formats - * and the expected order of strings in each. ID3v2::Header::frameID() can - * be used to determine the frame type. - * - * \note If non-Latin1 compatible strings are used with this class, even if - * the text encoding is set to Latin1, the frame will be written using UTF8 - * (with the encoding flag appropriately set in the output). - */ - - class TAGLIB_EXPORT TextIdentificationFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty frame of type \a type. Uses \a encoding as the - * default text encoding. - * - * \note In this case you must specify the text encoding as it - * resolves the ambiguity between constructors. - * - * \note Please see the note in the class description regarding Latin1. - */ - TextIdentificationFrame(const ByteVector &type, String::Type encoding); - - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit TextIdentificationFrame(const ByteVector &data); - - /*! - * This is a special factory method to create a TIPL (involved people list) - * frame from the given \a properties. Will parse key=[list of values] data - * into the TIPL format as specified in the ID3 standard. - */ - static TextIdentificationFrame *createTIPLFrame(const PropertyMap &properties); - - /*! - * This is a special factory method to create a TMCL (musician credits list) - * frame from the given \a properties. Will parse key=[list of values] data - * into the TMCL format as specified in the ID3 standard, where key should be - * of the form instrumentPrefix:instrument. - */ - static TextIdentificationFrame *createTMCLFrame(const PropertyMap &properties); - /*! - * Destroys this TextIdentificationFrame instance. - */ - virtual ~TextIdentificationFrame(); - - /*! - * Text identification frames are a list of string fields. - * - * This function will accept either a StringList or a String (using the - * StringList constructor that accepts a single String). - * - * \note This will not change the text encoding of the frame even if the - * strings passed in are not of the same encoding. Please use - * setEncoding(s.type()) if you wish to change the encoding of the frame. - */ - void setText(const StringList &l); - - // Reimplementations. - - virtual void setText(const String &s); - virtual String toString() const; - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \note Please see the note in the class description regarding Latin1. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \note Please see the note in the class description regarding Latin1. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns a list of the strings in this frame. - */ - StringList fieldList() const; - - /*! - * Returns a KeyConversionMap mapping a role as it would be used in a PropertyMap - * to the corresponding key used in a TIPL ID3 frame to describe that role. - */ - static const KeyConversionMap &involvedPeopleMap(); - - PropertyMap asProperties() const; - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - TextIdentificationFrame(const ByteVector &data, Header *h); - - private: - TextIdentificationFrame(const TextIdentificationFrame &); - TextIdentificationFrame &operator=(const TextIdentificationFrame &); - - /*! - * Parses the special structure of a TIPL frame - * Only the whitelisted roles "ARRANGER", "ENGINEER", "PRODUCER", - * "DJMIXER" (ID3: "DJ-MIX") and "MIXER" (ID3: "MIX") are allowed. - */ - PropertyMap makeTIPLProperties() const; - /*! - * Parses the special structure of a TMCL frame. - */ - PropertyMap makeTMCLProperties() const; - class TextIdentificationFramePrivate; - TextIdentificationFramePrivate *d; - }; - - /*! - * This is a specialization of text identification frames that allows for - * user defined entries. Each entry has a description in addition to the - * normal list of fields that a text identification frame has. - * - * This description identifies the frame and must be unique. - */ - - //! An ID3v2 custom text identification frame implementation - - class TAGLIB_EXPORT UserTextIdentificationFrame : public TextIdentificationFrame - { - friend class FrameFactory; - - public: - /*! - * Constructs an empty user defined text identification frame. For this to be - * a useful frame both a description and text must be set. - */ - explicit UserTextIdentificationFrame(String::Type encoding = String::Latin1); - - /*! - * Creates a frame based on \a data. - */ - explicit UserTextIdentificationFrame(const ByteVector &data); - - /*! - * Creates a user defined text identification frame with the given \a description - * and \a values. - */ - UserTextIdentificationFrame(const String &description, const StringList &values, String::Type encoding = String::UTF8); - - virtual String toString() const; - - /*! - * Returns the description for this frame. - */ - String description() const; - - /*! - * Sets the description of the frame to \a s. \a s must be unique. You can - * check for the presence of another user defined text frame of the same type - * using find() and testing for null. - */ - void setDescription(const String &s); - - StringList fieldList() const; - void setText(const String &text); - void setText(const StringList &fields); - - /*! - * A UserTextIdentificationFrame is parsed into a PropertyMap as follows: - * - the key is the frame's description, uppercased - * - if the description contains '::', only the substring after that - * separator is considered as key (compatibility with exfalso) - * - if the above rules don't yield a valid key (e.g. containing non-ASCII - * characters), the returned map will contain an entry "TXXX/" - * in its unsupportedData() list. - * - The values will be copies of the fieldList(). - * - If the description() appears as value in fieldList(), it will be omitted - * in the value list, in order to be compatible with TagLib which copies - * the description() into the fieldList(). - */ - PropertyMap asProperties() const; - - /*! - * Searches for the user defined text frame with the description \a description - * in \a tag. This returns null if no matching frames were found. - */ - static UserTextIdentificationFrame *find(Tag *tag, const String &description); - - private: - UserTextIdentificationFrame(const ByteVector &data, Header *h); - UserTextIdentificationFrame(const TextIdentificationFrame &); - UserTextIdentificationFrame &operator=(const UserTextIdentificationFrame &); - - void checkFields(); - - class UserTextIdentificationFramePrivate; - UserTextIdentificationFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/tfile.h b/taglib/include/taglib/tfile.h deleted file mode 100644 index bb8c2b3..0000000 --- a/taglib/include/taglib/tfile.h +++ /dev/null @@ -1,323 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_FILE_H -#define TAGLIB_FILE_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tag.h" -#include "tbytevector.h" -#include "tiostream.h" - -namespace TagLib { - - class String; - class Tag; - class AudioProperties; - class PropertyMap; - - //! A file class with some useful methods for tag manipulation - - /*! - * This class is a basic file class with some methods that are particularly - * useful for tag editors. It has methods to take advantage of - * ByteVector and a binary search method for finding patterns in a file. - */ - - class TAGLIB_EXPORT File - { - public: - /*! - * Position in the file used for seeking. - */ - enum Position { - //! Seek from the beginning of the file. - Beginning, - //! Seek from the current position in the file. - Current, - //! Seek from the end of the file. - End - }; - - /*! - * Specify which tags to strip either explicitly, or on save. - */ - enum StripTags { - StripNone, // - -namespace TagLib { - - //! A generic, implicitly shared list. - - /*! - * This is basic generic list that's somewhere between a std::list and a - * QValueList. This class is implicitly shared. For example: - * - * \code - * - * TagLib::List l = someOtherIntList; - * - * \endcode - * - * The above example is very cheap. This also makes lists suitable for the - * return types of functions. The above example will just copy a pointer rather - * than copying the data in the list. When your \e shared list's data changes, - * only \e then will the data be copied. - */ - - template class List - { - public: -#ifndef DO_NOT_DOCUMENT - typedef typename std::list::iterator Iterator; - typedef typename std::list::const_iterator ConstIterator; -#endif - - /*! - * Constructs an empty list. - */ - List(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - List(const List &l); - - /*! - * Destroys this List instance. If auto deletion is enabled and this list - * contains a pointer type all of the members are also deleted. - */ - virtual ~List(); - - /*! - * Returns an STL style iterator to the beginning of the list. See - * std::list::const_iterator for the semantics. - */ - Iterator begin(); - - /*! - * Returns an STL style constant iterator to the beginning of the list. See - * std::list::iterator for the semantics. - */ - ConstIterator begin() const; - - /*! - * Returns an STL style iterator to the end of the list. See - * std::list::iterator for the semantics. - */ - Iterator end(); - - /*! - * Returns an STL style constant iterator to the end of the list. See - * std::list::const_iterator for the semantics. - */ - ConstIterator end() const; - - /*! - * Inserts a copy of \a value before \a it. - */ - Iterator insert(Iterator it, const T &value); - - /*! - * Inserts the \a value into the list. This assumes that the list is - * currently sorted. If \a unique is true then the value will not - * be inserted if it is already in the list. - */ - List &sortedInsert(const T &value, bool unique = false); - - /*! - * Appends \a item to the end of the list and returns a reference to the - * list. - */ - List &append(const T &item); - - /*! - * Appends all of the values in \a l to the end of the list and returns a - * reference to the list. - */ - List &append(const List &l); - - /*! - * Prepends \a item to the beginning list and returns a reference to the - * list. - */ - List &prepend(const T &item); - - /*! - * Prepends all of the items in \a l to the beginning list and returns a - * reference to the list. - */ - List &prepend(const List &l); - - /*! - * Clears the list. If auto deletion is enabled and this list contains a - * pointer type the members are also deleted. - * - * \see setAutoDelete() - */ - List &clear(); - - /*! - * Returns the number of elements in the list. - * - * \see isEmpty() - */ - unsigned int size() const; - - /*! - * Returns whether or not the list is empty. - * - * \see size() - */ - bool isEmpty() const; - - /*! - * Find the first occurrence of \a value. - */ - Iterator find(const T &value); - - /*! - * Find the first occurrence of \a value. - */ - ConstIterator find(const T &value) const; - - /*! - * Returns true if the list contains \a value. - */ - bool contains(const T &value) const; - - /*! - * Erase the item at \a it from the list. - */ - Iterator erase(Iterator it); - - /*! - * Returns a reference to the first item in the list. - */ - const T &front() const; - - /*! - * Returns a reference to the first item in the list. - */ - T &front(); - - /*! - * Returns a reference to the last item in the list. - */ - const T &back() const; - - /*! - * Returns a reference to the last item in the list. - */ - T &back(); - - /*! - * Auto delete the members of the list when the last reference to the list - * passes out of scope. This will have no effect on lists which do not - * contain a pointer type. - * - * \note This relies on partial template instantiation -- most modern C++ - * compilers should now support this. - */ - void setAutoDelete(bool autoDelete); - - /*! - * Returns a reference to item \a i in the list. - * - * \warning This method is slow. Use iterators to loop through the list. - */ - T &operator[](unsigned int i); - - /*! - * Returns a const reference to item \a i in the list. - * - * \warning This method is slow. Use iterators to loop through the list. - */ - const T &operator[](unsigned int i) const; - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - List &operator=(const List &l); - - /*! - * Exchanges the content of this list by the content of \a l. - */ - void swap(List &l); - - /*! - * Compares this list with \a l and returns true if all of the elements are - * the same. - */ - bool operator==(const List &l) const; - - /*! - * Compares this list with \a l and returns true if the lists differ. - */ - bool operator!=(const List &l) const; - - protected: - /* - * If this List is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: -#ifndef DO_NOT_DOCUMENT - template class ListPrivate; - ListPrivate *d; -#endif - }; - -} // namespace TagLib - -// Since GCC doesn't support the "export" keyword, we have to include the -// implementation. - -#include "tlist.tcc" - -#endif diff --git a/taglib/include/taglib/tlist.tcc b/taglib/include/taglib/tlist.tcc deleted file mode 100644 index 478f098..0000000 --- a/taglib/include/taglib/tlist.tcc +++ /dev/null @@ -1,323 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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 -#include "trefcounter.h" - -namespace TagLib { - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -// The functionality of List::setAutoDelete() is implemented here partial -// template specialization. This is implemented in such a way that calling -// setAutoDelete() on non-pointer types will simply have no effect. - -// A base for the generic and specialized private class types. New -// non-templatized members should be added here. - -// BIC change to RefCounter -class ListPrivateBase : public RefCounterOld -{ -public: - ListPrivateBase() : autoDelete(false) {} - bool autoDelete; -}; - -// A generic implementation - -template -template class List::ListPrivate : public ListPrivateBase -{ -public: - ListPrivate() : ListPrivateBase() {} - ListPrivate(const std::list &l) : ListPrivateBase(), list(l) {} - void clear() { - list.clear(); - } - std::list list; -}; - -// A partial specialization for all pointer types that implements the -// setAutoDelete() functionality. - -template -template class List::ListPrivate : public ListPrivateBase -{ -public: - ListPrivate() : ListPrivateBase() {} - ListPrivate(const std::list &l) : ListPrivateBase(), list(l) {} - ~ListPrivate() { - clear(); - } - void clear() { - if(autoDelete) { - typename std::list::const_iterator it = list.begin(); - for(; it != list.end(); ++it) - delete *it; - } - list.clear(); - } - std::list list; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -template -List::List() : - d(new ListPrivate()) -{ -} - -template -List::List(const List &l) : d(l.d) -{ - d->ref(); -} - -template -List::~List() -{ - if(d->deref()) - delete d; -} - -template -typename List::Iterator List::begin() -{ - detach(); - return d->list.begin(); -} - -template -typename List::ConstIterator List::begin() const -{ - return d->list.begin(); -} - -template -typename List::Iterator List::end() -{ - detach(); - return d->list.end(); -} - -template -typename List::ConstIterator List::end() const -{ - return d->list.end(); -} - -template -typename List::Iterator List::insert(Iterator it, const T &item) -{ - detach(); - return d->list.insert(it, item); -} - -template -List &List::sortedInsert(const T &value, bool unique) -{ - detach(); - Iterator it = begin(); - while(it != end() && *it < value) - ++it; - if(unique && it != end() && *it == value) - return *this; - insert(it, value); - return *this; -} - -template -List &List::append(const T &item) -{ - detach(); - d->list.push_back(item); - return *this; -} - -template -List &List::append(const List &l) -{ - detach(); - d->list.insert(d->list.end(), l.begin(), l.end()); - return *this; -} - -template -List &List::prepend(const T &item) -{ - detach(); - d->list.push_front(item); - return *this; -} - -template -List &List::prepend(const List &l) -{ - detach(); - d->list.insert(d->list.begin(), l.begin(), l.end()); - return *this; -} - -template -List &List::clear() -{ - detach(); - d->clear(); - return *this; -} - -template -unsigned int List::size() const -{ - return static_cast(d->list.size()); -} - -template -bool List::isEmpty() const -{ - return d->list.empty(); -} - -template -typename List::Iterator List::find(const T &value) -{ - detach(); - return std::find(d->list.begin(), d->list.end(), value); -} - -template -typename List::ConstIterator List::find(const T &value) const -{ - return std::find(d->list.begin(), d->list.end(), value); -} - -template -bool List::contains(const T &value) const -{ - return std::find(d->list.begin(), d->list.end(), value) != d->list.end(); -} - -template -typename List::Iterator List::erase(Iterator it) -{ - return d->list.erase(it); -} - -template -const T &List::front() const -{ - return d->list.front(); -} - -template -T &List::front() -{ - detach(); - return d->list.front(); -} - -template -const T &List::back() const -{ - return d->list.back(); -} - -template -void List::setAutoDelete(bool autoDelete) -{ - d->autoDelete = autoDelete; -} - -template -T &List::back() -{ - detach(); - return d->list.back(); -} - -template -T &List::operator[](unsigned int i) -{ - Iterator it = d->list.begin(); - std::advance(it, i); - - return *it; -} - -template -const T &List::operator[](unsigned int i) const -{ - ConstIterator it = d->list.begin(); - std::advance(it, i); - - return *it; -} - -template -List &List::operator=(const List &l) -{ - List(l).swap(*this); - return *this; -} - -template -void List::swap(List &l) -{ - using std::swap; - - swap(d, l.d); -} - -template -bool List::operator==(const List &l) const -{ - return d->list == l.d->list; -} - -template -bool List::operator!=(const List &l) const -{ - return d->list != l.d->list; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -template -void List::detach() -{ - if(d->count() > 1) { - d->deref(); - d = new ListPrivate(d->list); - } -} - -} // namespace TagLib diff --git a/taglib/include/taglib/tmap.h b/taglib/include/taglib/tmap.h deleted file mode 100644 index 520a267..0000000 --- a/taglib/include/taglib/tmap.h +++ /dev/null @@ -1,212 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_MAP_H -#define TAGLIB_MAP_H - -#include - -#include "taglib.h" - -namespace TagLib { - - //! A generic, implicitly shared map. - - /*! - * This implements a standard map container that associates a key with a value - * and has fast key-based lookups. This map is also implicitly shared making - * it suitable for pass-by-value usage. - */ - - template class Map - { - public: -#ifndef DO_NOT_DOCUMENT -#ifdef WANT_CLASS_INSTANTIATION_OF_MAP - // Some STL implementations get snippy over the use of the - // class keyword to distinguish different templates; Sun Studio - // in particular finds multiple specializations in certain rare - // cases and complains about that. GCC doesn't seem to mind, - // and uses the typedefs further below without the class keyword. - // Not all the specializations of Map can use the class keyword - // (when T is not actually a class type), so don't apply this - // generally. - typedef typename std::map::iterator Iterator; - typedef typename std::map::const_iterator ConstIterator; -#else - typedef typename std::map::iterator Iterator; - typedef typename std::map::const_iterator ConstIterator; -#endif -#endif - - /*! - * Constructs an empty Map. - */ - Map(); - - /*! - * Make a shallow, implicitly shared, copy of \a m. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - Map(const Map &m); - - /*! - * Destroys this instance of the Map. - */ - virtual ~Map(); - - /*! - * Returns an STL style iterator to the beginning of the map. See - * std::map::iterator for the semantics. - */ - Iterator begin(); - - /*! - * Returns an STL style iterator to the beginning of the map. See - * std::map::const_iterator for the semantics. - */ - ConstIterator begin() const; - - /*! - * Returns an STL style iterator to the end of the map. See - * std::map::iterator for the semantics. - */ - Iterator end(); - - /*! - * Returns an STL style iterator to the end of the map. See - * std::map::const_iterator for the semantics. - */ - ConstIterator end() const; - - /*! - * Inserts \a value under \a key in the map. If a value for \a key already - * exists it will be overwritten. - */ - Map &insert(const Key &key, const T &value); - - /*! - * Removes all of the elements from elements from the map. This however - * will not delete pointers if the mapped type is a pointer type. - */ - Map &clear(); - - /*! - * The number of elements in the map. - * - * \see isEmpty() - */ - unsigned int size() const; - - /*! - * Returns true if the map is empty. - * - * \see size() - */ - bool isEmpty() const; - - /*! - * Find the first occurrence of \a key. - */ - Iterator find(const Key &key); - - /*! - * Find the first occurrence of \a key. - */ - ConstIterator find(const Key &key) const; - - /*! - * Returns true if the map contains an instance of \a key. - */ - bool contains(const Key &key) const; - - /*! - * Erase the item at \a it from the list. - */ - Map &erase(Iterator it); - - /*! - * Erase the item with \a key from the list. - */ - Map &erase(const Key &key); - - /*! - * Returns the value associated with \a key. - * - * If the map does not contain \a key, it returns defaultValue. - * If no defaultValue is specified, it returns a default-constructed value. - */ - T value(const Key &key, const T &defaultValue = T()) const; - - /*! - * Returns a reference to the value associated with \a key. - * - * \note This has undefined behavior if the key is not present in the map. - */ - const T &operator[](const Key &key) const; - - /*! - * Returns a reference to the value associated with \a key. - * - * \note This has undefined behavior if the key is not present in the map. - */ - T &operator[](const Key &key); - - /*! - * Make a shallow, implicitly shared, copy of \a m. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - Map &operator=(const Map &m); - - /*! - * Exchanges the content of this map by the content of \a m. - */ - void swap(Map &m); - - protected: - /* - * If this List is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: -#ifndef DO_NOT_DOCUMENT - template class MapPrivate; - MapPrivate *d; -#endif - }; - -} // namespace TagLib - -// Since GCC doesn't support the "export" keyword, we have to include the -// implementation. - -#include "tmap.tcc" - -#endif diff --git a/taglib/include/taglib/tmap.tcc b/taglib/include/taglib/tmap.tcc deleted file mode 100644 index 7964913..0000000 --- a/taglib/include/taglib/tmap.tcc +++ /dev/null @@ -1,206 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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 "trefcounter.h" - -namespace TagLib { - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -// BIC change to RefCounter -template -template -class Map::MapPrivate : public RefCounterOld -{ -public: - MapPrivate() : RefCounterOld() {} -#ifdef WANT_CLASS_INSTANTIATION_OF_MAP - MapPrivate(const std::map& m) : RefCounterOld(), map(m) {} - std::map map; -#else - MapPrivate(const std::map& m) : RefCounterOld(), map(m) {} - std::map map; -#endif -}; - -template -Map::Map() : - d(new MapPrivate()) -{ -} - -template -Map::Map(const Map &m) : d(m.d) -{ - d->ref(); -} - -template -Map::~Map() -{ - if(d->deref()) - delete(d); -} - -template -typename Map::Iterator Map::begin() -{ - detach(); - return d->map.begin(); -} - -template -typename Map::ConstIterator Map::begin() const -{ - return d->map.begin(); -} - -template -typename Map::Iterator Map::end() -{ - detach(); - return d->map.end(); -} - -template -typename Map::ConstIterator Map::end() const -{ - return d->map.end(); -} - -template -Map &Map::insert(const Key &key, const T &value) -{ - detach(); - d->map[key] = value; - return *this; -} - -template -Map &Map::clear() -{ - detach(); - d->map.clear(); - return *this; -} - -template -bool Map::isEmpty() const -{ - return d->map.empty(); -} - -template -typename Map::Iterator Map::find(const Key &key) -{ - detach(); - return d->map.find(key); -} - -template -typename Map::ConstIterator Map::find(const Key &key) const -{ - return d->map.find(key); -} - -template -bool Map::contains(const Key &key) const -{ - return d->map.find(key) != d->map.end(); -} - -template -Map &Map::erase(Iterator it) -{ - detach(); - d->map.erase(it); - return *this; -} - -template -Map &Map::erase(const Key &key) -{ - detach(); - d->map.erase(key); - return *this; -} - -template -unsigned int Map::size() const -{ - return static_cast(d->map.size()); -} - -template -T Map::value(const Key &key, const T &defaultValue) const -{ - ConstIterator it = d->map.find(key); - return it != d->map.end() ? it->second : defaultValue; -} - -template -const T &Map::operator[](const Key &key) const -{ - return d->map[key]; -} - -template -T &Map::operator[](const Key &key) -{ - detach(); - return d->map[key]; -} - -template -Map &Map::operator=(const Map &m) -{ - Map(m).swap(*this); - return *this; -} - -template -void Map::swap(Map &m) -{ - using std::swap; - - swap(d, m.d); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -template -void Map::detach() -{ - if(d->count() > 1) { - d->deref(); - d = new MapPrivate(d->map); - } -} - -} // namespace TagLib diff --git a/taglib/include/taglib/tpropertymap.h b/taglib/include/taglib/tpropertymap.h deleted file mode 100644 index 9231642..0000000 --- a/taglib/include/taglib/tpropertymap.h +++ /dev/null @@ -1,256 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Michael Helmling - email : helmling@mathematik.uni-kl.de - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_PROPERTYMAP_H_ -#define TAGLIB_PROPERTYMAP_H_ - -#include "tmap.h" -#include "tstringlist.h" - -#ifdef _MSC_VER -// Explained at end of tpropertymap.cpp -extern template class TAGLIB_EXPORT TagLib::Map; -#endif - -namespace TagLib { - - typedef Map SimplePropertyMap; - - //! A map for format-independent tag representations. - - /*! - * This map implements a generic representation of textual audio metadata - * ("tags") realized as pairs of a case-insensitive key - * and a nonempty list of corresponding values, each value being an arbitrary - * unicode String. - * - * Note that most metadata formats pose additional conditions on the tag keys. The - * most popular ones (Vorbis, APE, ID3v2) should support all ASCII only words of - * length between 2 and 16. - * - * This class can contain any tags, but here is a list of "well-known" tags that - * you might want to use: - * - * Basic tags: - * - * - TITLE - * - ALBUM - * - ARTIST - * - ALBUMARTIST - * - SUBTITLE - * - TRACKNUMBER - * - DISCNUMBER - * - DATE - * - ORIGINALDATE - * - GENRE - * - COMMENT - * - * Sort names: - * - * - TITLESORT - * - ALBUMSORT - * - ARTISTSORT - * - ALBUMARTISTSORT - * - COMPOSERSORT - * - * Credits: - * - * - COMPOSER - * - LYRICIST - * - CONDUCTOR - * - REMIXER - * - PERFORMER:\ - * - * Other tags: - * - * - ISRC - * - ASIN - * - BPM - * - COPYRIGHT - * - ENCODEDBY - * - MOOD - * - COMMENT - * - MEDIA - * - LABEL - * - CATALOGNUMBER - * - BARCODE - * - RELEASECOUNTRY - * - RELEASESTATUS - * - RELEASETYPE - * - * MusicBrainz identifiers: - * - * - MUSICBRAINZ_TRACKID - * - MUSICBRAINZ_ALBUMID - * - MUSICBRAINZ_RELEASEGROUPID - * - MUSICBRAINZ_RELEASETRACKID - * - MUSICBRAINZ_WORKID - * - MUSICBRAINZ_ARTISTID - * - MUSICBRAINZ_ALBUMARTISTID - * - ACOUSTID_ID - * - ACOUSTID_FINGERPRINT - * - MUSICIP_PUID - * - */ - - class TAGLIB_EXPORT PropertyMap: public SimplePropertyMap - { - public: - - typedef SimplePropertyMap::Iterator Iterator; - typedef SimplePropertyMap::ConstIterator ConstIterator; - - PropertyMap(); - - PropertyMap(const PropertyMap &m); - - /*! - * Creates a PropertyMap initialized from a SimplePropertyMap. Copies all - * entries from \a m that have valid keys. - * Invalid keys will be appended to the unsupportedData() list. - */ - PropertyMap(const SimplePropertyMap &m); - - virtual ~PropertyMap(); - - /*! - * Inserts \a values under \a key in the map. If \a key already exists, - * then \a values will be appended to the existing StringList. - * The returned value indicates success, i.e. whether \a key is a - * valid key. - */ - bool insert(const String &key, const StringList &values); - - /*! - * Replaces any existing values for \a key with the given \a values, - * and simply insert them if \a key did not exist before. - * The returned value indicates success, i.e. whether \a key is a - * valid key. - */ - bool replace(const String &key, const StringList &values); - - /*! - * Find the first occurrence of \a key. - */ - Iterator find(const String &key); - - /*! - * Find the first occurrence of \a key. - */ - ConstIterator find(const String &key) const; - - /*! - * Returns true if the map contains values for \a key. - */ - bool contains(const String &key) const; - - /*! - * Returns true if this map contains all keys of \a other - * and the values coincide for that keys. Does not take - * the unsupportedData list into account. - */ - bool contains(const PropertyMap &other) const; - - /*! - * Erase the \a key and its values from the map. - */ - PropertyMap &erase(const String &key); - - /*! - * Erases from this map all keys that appear in \a other. - */ - PropertyMap &erase(const PropertyMap &other); - - /*! - * Merge the contents of \a other into this PropertyMap. - * If a key is contained in both maps, the values of the second - * are appended to that of the first. - * The unsupportedData() lists are concatenated as well. - */ - PropertyMap &merge(const PropertyMap &other); - - /*! - * Returns the value associated with \a key. - * - * If the map does not contain \a key, it returns defaultValue. - * If no defaultValue is specified, it returns an empty string list. - */ - StringList value(const String &key, - const StringList &defaultValue = StringList()) const; - - /*! - * Returns a reference to the value associated with \a key. - * - * \note: If \a key is not contained in the map, an empty - * StringList is returned without error. - */ - const StringList &operator[](const String &key) const; - - /*! - * Returns a reference to the value associated with \a key. - * - * \note: If \a key is not contained in the map, an empty - * StringList is returned. You can also directly add entries - * by using this function as an lvalue. - */ - StringList &operator[](const String &key); - - /*! - * Returns true if and only if \a other has the same contents as this map. - */ - bool operator==(const PropertyMap &other) const; - - /*! - * Returns false if and only \a other has the same contents as this map. - */ - bool operator!=(const PropertyMap &other) const; - - /*! - * If a PropertyMap is read from a File object using File::properties(), - * the StringList returned from this function will represent metadata - * that could not be parsed into the PropertyMap representation. This could - * be e.g. binary data, unknown ID3 frames, etc. - * You can remove items from the returned list, which tells TagLib to remove - * those unsupported elements if you call File::setProperties() with the - * same PropertyMap as argument. - */ - StringList &unsupportedData(); - const StringList &unsupportedData() const; - - /*! - * Removes all entries which have an empty value list. - */ - void removeEmpty(); - - String toString() const; - - private: - - - StringList unsupported; - }; - -} // namespace TagLib -#endif /* TAGLIB_PROPERTYMAP_H_ */ diff --git a/taglib/include/taglib/trefcounter.h b/taglib/include/taglib/trefcounter.h deleted file mode 100644 index b3ce883..0000000 --- a/taglib/include/taglib/trefcounter.h +++ /dev/null @@ -1,114 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_REFCOUNTER_H -#define TAGLIB_REFCOUNTER_H - -#include "taglib_export.h" -#include "taglib.h" - -#ifdef __APPLE__ -# define OSATOMIC_DEPRECATED 0 -# include -# define TAGLIB_ATOMIC_MAC -#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# ifndef NOMINMAX -# define NOMINMAX -# endif -# include -# define TAGLIB_ATOMIC_WIN -#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 401) \ - && (defined(__i386__) || defined(__i486__) || defined(__i586__) || \ - defined(__i686__) || defined(__x86_64) || defined(__ia64)) \ - && !defined(__INTEL_COMPILER) -# define TAGLIB_ATOMIC_GCC -#elif defined(__ia64) && defined(__INTEL_COMPILER) -# include -# define TAGLIB_ATOMIC_GCC -#endif - -#ifndef DO_NOT_DOCUMENT // Tell Doxygen to skip this class. -/*! - * \internal - * This is just used as a base class for shared classes in TagLib. - * - * \warning This is not part of the TagLib public API! - */ -namespace TagLib -{ - - class TAGLIB_EXPORT RefCounter - { - public: - RefCounter(); - virtual ~RefCounter(); - - void ref(); - bool deref(); - int count() const; - - private: - class RefCounterPrivate; - RefCounterPrivate *d; - }; - - // BIC this old class is needed by tlist.tcc and tmap.tcc - class RefCounterOld - { - public: - RefCounterOld() : refCount(1) {} - -#ifdef TAGLIB_ATOMIC_MAC - void ref() { OSAtomicIncrement32Barrier(const_cast(&refCount)); } - bool deref() { return ! OSAtomicDecrement32Barrier(const_cast(&refCount)); } - int32_t count() { return refCount; } - private: - volatile int32_t refCount; -#elif defined(TAGLIB_ATOMIC_WIN) - void ref() { InterlockedIncrement(&refCount); } - bool deref() { return ! InterlockedDecrement(&refCount); } - long count() { return refCount; } - private: - volatile long refCount; -#elif defined(TAGLIB_ATOMIC_GCC) - void ref() { __sync_add_and_fetch(&refCount, 1); } - bool deref() { return ! __sync_sub_and_fetch(&refCount, 1); } - int count() { return refCount; } - private: - volatile int refCount; -#else - void ref() { refCount++; } - bool deref() { return ! --refCount; } - int count() { return refCount; } - private: - unsigned int refCount; -#endif - }; - -} // namespace TagLib - -#endif // DO_NOT_DOCUMENT -#endif - diff --git a/taglib/include/taglib/trueaudiofile.h b/taglib/include/taglib/trueaudiofile.h deleted file mode 100644 index 1019bfc..0000000 --- a/taglib/include/taglib/trueaudiofile.h +++ /dev/null @@ -1,259 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_TRUEAUDIOFILE_H -#define TAGLIB_TRUEAUDIOFILE_H - -#include "tfile.h" -#include "trueaudioproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v2 { class Tag; class FrameFactory; } - namespace ID3v1 { class Tag; } - - //! An implementation of TrueAudio metadata - - /*! - * This is implementation of TrueAudio metadata. - * - * This supports ID3v1 and ID3v2 tags as well as reading stream - * properties from the file. - */ - - namespace TrueAudio { - - //! An implementation of TagLib::File with TrueAudio specific methods - - /*! - * This implements and provides an interface for TrueAudio files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to TrueAudio files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs a TrueAudio file from \a file. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a TrueAudio file from \a file. If \a readProperties is true - * the file's audio properties will also be read. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a TrueAudio file from \a stream. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a TrueAudio file from \a stream. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both ID3v1 and v2 tags, only ID3v2 will be - * converted to the PropertyMap. - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Creates in ID3v2 tag if necessary. If an ID3v1 tag exists, it will - * be updated as well, within the limitations of ID3v1. - */ - PropertyMap setProperties(const PropertyMap &); - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Returns the TrueAudio::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Set the ID3v2::FrameFactory to something other than the default. - * - * \see ID3v2FrameFactory - * \deprecated This value should be passed in via the constructor. - */ - TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - /*! - * Returns whether or not the given \a stream can be opened as a TrueAudio - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace TrueAudio -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/trueaudioproperties.h b/taglib/include/taglib/trueaudioproperties.h deleted file mode 100644 index 490fea8..0000000 --- a/taglib/include/taglib/trueaudioproperties.h +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_TRUEAUDIOPROPERTIES_H -#define TAGLIB_TRUEAUDIOPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace TrueAudio { - - static const unsigned int HeaderSize = 18; - - //! An implementation of audio property reading for TrueAudio - - /*! - * This reads the data from an TrueAudio stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of TrueAudio::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this TrueAudio::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample. - */ - int bitsPerSample() const; - - /*! - * Returns the total number of sample frames - */ - unsigned int sampleFrames() const; - - /*! - * Returns the major version number. - */ - int ttaVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(const ByteVector &data, long streamLength); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace TrueAudio -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/tstring.h b/taglib/include/taglib/tstring.h deleted file mode 100644 index e3853d8..0000000 --- a/taglib/include/taglib/tstring.h +++ /dev/null @@ -1,580 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_STRING_H -#define TAGLIB_STRING_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" - -#include -#include - -/*! - * \relates TagLib::String - * - * Converts a QString to a TagLib::String without a requirement to link to Qt. - * - * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 - * conversion happening in the background - */ - -#if defined(QT_VERSION) && (QT_VERSION >= 0x040000) -#define QStringToTString(s) TagLib::String(s.toUtf8().data(), TagLib::String::UTF8) -#else -#define QStringToTString(s) TagLib::String((s).utf8().data(), TagLib::String::UTF8) -#endif - -/*! - * \relates TagLib::String - * - * Converts a TagLib::String to a QString without a requirement to link to Qt. - * - * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 - * conversion happening in the background - * - */ - -#define TStringToQString(s) QString::fromUtf8((s).toCString(true)) - -namespace TagLib { - - class StringList; - - //! A \e wide string class suitable for unicode. - - /*! - * This is an implicitly shared \e wide string. For storage it uses - * TagLib::wstring, but as this is an implementation detail this of - * course could change. Strings are stored internally as UTF-16(without BOM/ - * CPU byte order) - * - * The use of implicit sharing means that copying a string is cheap, the only - * \e cost comes into play when the copy is modified. Prior to that the string - * just has a pointer to the data of the \e parent String. This also makes - * this class suitable as a function return type. - * - * In addition to adding implicit sharing, this class keeps track of four - * possible encodings, which are the four supported by the ID3v2 standard. - */ - - class TAGLIB_EXPORT String - { - public: - -#ifndef DO_NOT_DOCUMENT - typedef TagLib::wstring::iterator Iterator; - typedef TagLib::wstring::const_iterator ConstIterator; -#endif - - /** - * The four types of string encodings supported by the ID3v2 specification. - * ID3v1 is assumed to be Latin1 and Ogg Vorbis comments use UTF8. - */ - enum Type { - /*! - * IS08859-1, or Latin1 encoding. 8 bit characters. - */ - Latin1 = 0, - /*! - * UTF16 with a byte order mark. 16 bit characters. - */ - UTF16 = 1, - /*! - * UTF16 big endian. 16 bit characters. This is the encoding used - * internally by TagLib. - */ - UTF16BE = 2, - /*! - * UTF8 encoding. Characters are usually 8 bits but can be up to 32. - */ - UTF8 = 3, - /*! - * UTF16 little endian. 16 bit characters. - */ - UTF16LE = 4 - }; - - /*! - * Constructs an empty String. - */ - String(); - - /*! - * Make a shallow, implicitly shared, copy of \a s. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - String(const String &s); - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const std::string &s, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a s. - * - * /note If \a t is UTF16LE, the byte order of \a s will be swapped regardless - * of the CPU byte order. If UTF16BE, it will not be swapped. This behavior - * will be changed in TagLib2.0. - */ - String(const wstring &s, Type t = UTF16BE); - - /*! - * Makes a deep copy of the data in \a s. - * - * /note If \a t is UTF16LE, the byte order of \a s will be swapped regardless - * of the CPU byte order. If UTF16BE, it will not be swapped. This behavior - * will be changed in TagLib2.0. - */ - String(const wchar_t *s, Type t = UTF16BE); - - /*! - * Makes a deep copy of the data in \a c. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(char c, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a c. - */ - String(wchar_t c, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const char *s, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a v. - */ - String(const ByteVector &v, Type t = Latin1); - - /*! - * Destroys this String instance. - */ - virtual ~String(); - - /*! - * Returns a deep copy of this String as an std::string. The returned string - * is encoded in UTF8 if \a unicode is true, otherwise Latin1. - * - * \see toCString() - */ - std::string to8Bit(bool unicode = false) const; - - /*! - * Returns a deep copy of this String as a wstring. The returned string is - * encoded in UTF-16 (without BOM/CPU byte order), not UTF-32 even if wchar_t - * is 32-bit wide. - * - * \see toCWString() - */ - wstring toWString() const; - - /*! - * Creates and returns a standard C-style (null-terminated) version of this - * String. The returned string is encoded in UTF8 if \a unicode is true, - * otherwise Latin1. - * - * The returned string is still owned by this String and should not be deleted - * by the user. - * - * The returned pointer remains valid until this String instance is destroyed - * or toCString() is called again. - * - * \warning This however has the side effect that the returned string will remain - * in memory in addition to other memory that is consumed by this - * String instance. So, this method should not be used on large strings or - * where memory is critical. Consider using to8Bit() instead to avoid it. - * - * \see to8Bit() - */ - const char *toCString(bool unicode = false) const; - - /*! - * Returns a standard C-style (null-terminated) wide character version of - * this String. The returned string is encoded in UTF-16 (without BOM/CPU byte - * order), not UTF-32 even if wchar_t is 32-bit wide. - * - * The returned string is still owned by this String and should not be deleted - * by the user. - * - * The returned pointer remains valid until this String instance is destroyed - * or any other method of this String is called. - * - * \note This returns a pointer to the String's internal data without any - * conversions. - * - * \see toWString() - */ - const wchar_t *toCWString() const; - - /*! - * Returns an iterator pointing to the beginning of the string. - */ - Iterator begin(); - - /*! - * Returns a const iterator pointing to the beginning of the string. - */ - ConstIterator begin() const; - - /*! - * Returns an iterator pointing to the end of the string (the position - * after the last character). - */ - Iterator end(); - - /*! - * Returns a const iterator pointing to the end of the string (the position - * after the last character). - */ - ConstIterator end() const; - - /*! - * Finds the first occurrence of pattern \a s in this string starting from - * \a offset. If the pattern is not found, -1 is returned. - */ - int find(const String &s, int offset = 0) const; - - /*! - * Finds the last occurrence of pattern \a s in this string, searched backwards, - * either from the end of the string or starting from \a offset. If the pattern - * is not found, -1 is returned. - */ - int rfind(const String &s, int offset = -1) const; - - /*! - * Splits the string on each occurrence of \a separator. - */ - StringList split(const String &separator = " ") const; - - /*! - * Returns true if the strings starts with the substring \a s. - */ - bool startsWith(const String &s) const; - - /*! - * Extract a substring from this string starting at \a position and - * continuing for \a n characters. - */ - String substr(unsigned int position, unsigned int n = 0xffffffff) const; - - /*! - * Append \a s to the current string and return a reference to the current - * string. - */ - String &append(const String &s); - - /*! - * Clears the string. - */ - String &clear(); - - /*! - * Returns an upper case version of the string. - * - * \warning This only works for the characters in US-ASCII, i.e. A-Z. - */ - String upper() const; - - /*! - * Returns the size of the string. - */ - unsigned int size() const; - - /*! - * Returns the length of the string. Equivalent to size(). - */ - unsigned int length() const; - - /*! - * Returns true if the string is empty. - * - * \see isNull() - */ - bool isEmpty() const; - - /*! - * Returns true if this string is null -- i.e. it is a copy of the - * String::null string. - * - * \note A string can be empty and not null. So do not use this method to - * check if the string is empty. - * - * \see isEmpty() - * - * \deprecated Use isEmpty(), do not differentiate between null and empty. - */ - // BIC: remove - TAGLIB_DEPRECATED bool isNull() const; - - /*! - * Returns a ByteVector containing the string's data. If \a t is Latin1 or - * UTF8, this will return a vector of 8 bit characters, otherwise it will use - * 16 bit characters. - * - * \note If \a t is UTF16, the returned data is encoded in little-endian - * format and has a BOM. - * - * \note The returned data is not null terminated. - */ - ByteVector data(Type t) const; - - /*! - * Convert the string to an integer. - * - * Returns the integer if the conversion was successful or 0 if the - * string does not represent a number. - */ - // BIC: merge with the method below - int toInt() const; - - /*! - * Convert the string to an integer. - * - * If the conversion was successful, it sets the value of \a *ok to - * true and returns the integer. Otherwise it sets \a *ok to false - * and the result is undefined. - */ - int toInt(bool *ok) const; - - /*! - * Returns a string with the leading and trailing whitespace stripped. - */ - String stripWhiteSpace() const; - - /*! - * Returns true if the file only uses characters required by Latin1. - */ - bool isLatin1() const; - - /*! - * Returns true if the file only uses characters required by (7-bit) ASCII. - */ - bool isAscii() const; - - /*! - * Converts the base-10 integer \a n to a string. - */ - static String number(int n); - - /*! - * Returns a reference to the character at position \a i. - */ - wchar_t &operator[](int i); - - /*! - * Returns a const reference to the character at position \a i. - */ - const wchar_t &operator[](int i) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns true if the strings match. - */ - bool operator==(const String &s) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns false if the strings match. - */ - bool operator!=(const String &s) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns true if the strings match. - */ - bool operator==(const char *s) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns false if the strings match. - */ - bool operator!=(const char *s) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns true if the strings match. - */ - bool operator==(const wchar_t *s) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns false if the strings match. - */ - bool operator!=(const wchar_t *s) const; - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const String &s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const wchar_t* s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const char* s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(wchar_t c); - - /*! - * Appends \a c to the end of the String. - */ - String &operator+=(char c); - - /*! - * Performs a shallow, implicitly shared, copy of \a s, overwriting the - * String's current data. - */ - String &operator=(const String &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const std::string &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const wstring &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const wchar_t *s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(char c); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(wchar_t c); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const char *s); - - /*! - * Performs a deep copy of the data in \a v. - */ - String &operator=(const ByteVector &v); - - /*! - * Exchanges the content of the String by the content of \a s. - */ - void swap(String &s); - - /*! - * To be able to use this class in a Map, this operator needed to be - * implemented. Returns true if \a s is less than this string in a byte-wise - * comparison. - */ - bool operator<(const String &s) const; - - /*! - * A null string provided for convenience. - * - * \warning Do not modify this variable. It will mess up the internal state - * of TagLib. - * - * \deprecated Use String(). - */ - // BIC: remove - TAGLIB_DEPRECATED static String null; - - protected: - /*! - * If this String is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: - /*! - * \deprecated This variable is no longer used, but NEVER remove this. It - * may lead to a linkage error. - */ - // BIC: remove - TAGLIB_DEPRECATED static const Type WCharByteOrder; - - class StringPrivate; - StringPrivate *d; - }; -} // namespace TagLib - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2); - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT TagLib::String operator+(const char *s1, const TagLib::String &s2); - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT TagLib::String operator+(const TagLib::String &s1, const char *s2); - - -/*! - * \relates TagLib::String - * - * Send the string to an output stream. - */ -TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::String &str); - -#endif diff --git a/taglib/include/taglib/tstringlist.h b/taglib/include/taglib/tstringlist.h deleted file mode 100644 index e18a54b..0000000 --- a/taglib/include/taglib/tstringlist.h +++ /dev/null @@ -1,115 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_STRINGLIST_H -#define TAGLIB_STRINGLIST_H - -#include "tstring.h" -#include "tlist.h" -#include "tbytevectorlist.h" -#include "taglib_export.h" - -#include - -namespace TagLib { - - //! A list of strings - - /*! - * This is a specialization of the List class with some members convention for - * string operations. - */ - - class TAGLIB_EXPORT StringList : public List - { - public: - - /*! - * Constructs an empty StringList. - */ - StringList(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - StringList(const StringList &l); - - /*! - * Constructs a StringList with \a s as a member. - */ - StringList(const String &s); - - /*! - * Makes a deep copy of the data in \a vl. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - StringList(const ByteVectorList &vl, String::Type t = String::Latin1); - - /*! - * Destroys this StringList instance. - */ - virtual ~StringList(); - - /*! - * Concatenate the list of strings into one string separated by \a separator. - */ - String toString(const String &separator = " ") const; - - /*! - * Appends \a s to the end of the list and returns a reference to the - * list. - */ - StringList &append(const String &s); - - /*! - * Appends all of the values in \a l to the end of the list and returns a - * reference to the list. - */ - StringList &append(const StringList &l); - - /*! - * Splits the String \a s into several strings at \a pattern. This will not include - * the pattern in the returned strings. - */ - static StringList split(const String &s, const String &pattern); - - private: - class StringListPrivate; - StringListPrivate *d; - }; - -} // namespace TagLib - -/*! - * \related TagLib::StringList - * Send the StringList to an output stream. - */ -std::ostream TAGLIB_EXPORT &operator<<(std::ostream &s, const TagLib::StringList &l); - -#endif diff --git a/taglib/include/taglib/uniquefileidentifierframe.h b/taglib/include/taglib/uniquefileidentifierframe.h deleted file mode 100644 index cdbf1eb..0000000 --- a/taglib/include/taglib/uniquefileidentifierframe.h +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNIQUEFILEIDENTIFIERFRAME -#define TAGLIB_UNIQUEFILEIDENTIFIERFRAME - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - /*! - * This is an implementation of ID3v2 unique file identifier frames. This - * frame is used to identify the file in an arbitrary database identified - * by the owner field. - */ - - //! An implementation of ID3v2 unique identifier frames - - class TAGLIB_EXPORT UniqueFileIdentifierFrame : public ID3v2::Frame - { - friend class FrameFactory; - - public: - /*! - * Creates a unique file identifier frame based on \a data. - */ - UniqueFileIdentifierFrame(const ByteVector &data); - - /*! - * Creates a unique file identifier frame with the owner \a owner and - * the identification \a id. - */ - UniqueFileIdentifierFrame(const String &owner, const ByteVector &id); - - /*! - * Destroys the frame. - */ - ~UniqueFileIdentifierFrame(); - - /*! - * Returns the owner for the frame; essentially this is the key for - * determining which identification scheme this key belongs to. This - * will usually either be an email address or URL for the person or tool - * used to create the unique identifier. - * - * \see setOwner() - */ - String owner() const; - - /*! - * Returns the unique identifier. Though sometimes this is a text string - * it also may be binary data and as much should be assumed when handling - * it. - */ - ByteVector identifier() const; - - /*! - * Sets the owner of the identification scheme to \a s. - * - * \see owner() - */ - void setOwner(const String &s); - - /*! - * Sets the unique file identifier to \a v. - * - * \see identifier() - */ - void setIdentifier(const ByteVector &v); - - virtual String toString() const; - - PropertyMap asProperties() const; - - /*! - * UFID frames each have a unique owner. This searches for a UFID - * frame with the owner \a o and returns a pointer to it. - * - * \see owner() - */ - static UniqueFileIdentifierFrame *findByOwner(const Tag *tag, const String &o); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - UniqueFileIdentifierFrame(const UniqueFileIdentifierFrame &); - UniqueFileIdentifierFrame &operator=(const UniqueFileIdentifierFrame &); - - UniqueFileIdentifierFrame(const ByteVector &data, Header *h); - - class UniqueFileIdentifierFramePrivate; - UniqueFileIdentifierFramePrivate *d; - }; - } // namespace ID3v2 -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/unknownframe.h b/taglib/include/taglib/unknownframe.h deleted file mode 100644 index 2223702..0000000 --- a/taglib/include/taglib/unknownframe.h +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNKNOWNFRAME_H -#define TAGLIB_UNKNOWNFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! A frame type \e unknown to TagLib. - - /*! - * This class represents a frame type not known (or more often simply - * unimplemented) in TagLib. This is here provide a basic API for - * manipulating the binary data of unknown frames and to provide a means - * of rendering such \e unknown frames. - * - * Please note that a cleaner way of handling frame types that TagLib - * does not understand is to subclass ID3v2::Frame and ID3v2::FrameFactory - * to have your frame type supported through the standard ID3v2 mechanism. - */ - - class TAGLIB_EXPORT UnknownFrame : public Frame - { - friend class FrameFactory; - - public: - UnknownFrame(const ByteVector &data); - virtual ~UnknownFrame(); - - virtual String toString() const; - - /*! - * Returns the field data (everything but the header) for this frame. - */ - ByteVector data() const; - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - UnknownFrame(const ByteVector &data, Header *h); - UnknownFrame(const UnknownFrame &); - UnknownFrame &operator=(const UnknownFrame &); - - class UnknownFramePrivate; - UnknownFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/unsynchronizedlyricsframe.h b/taglib/include/taglib/unsynchronizedlyricsframe.h deleted file mode 100644 index 8ee378b..0000000 --- a/taglib/include/taglib/unsynchronizedlyricsframe.h +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H -#define TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 unsynchronized lyrics frame - /*! - * An implementation of ID3v2 unsynchronized lyrics. - */ - class TAGLIB_EXPORT UnsynchronizedLyricsFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty unsynchronized lyrics frame that will use the text encoding - * \a encoding. - */ - explicit UnsynchronizedLyricsFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a unsynchronized lyrics frame based on the data in \a data. - */ - explicit UnsynchronizedLyricsFrame(const ByteVector &data); - - /*! - * Destroys this UnsynchronizedLyricsFrame instance. - */ - virtual ~UnsynchronizedLyricsFrame(); - - /*! - * Returns the text of this unsynchronized lyrics frame. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the language encoding as a 3 byte encoding as specified by - * ISO-639-2. - * - * \note Most taggers simply ignore this value. - * - * \see setLanguage() - */ - ByteVector language() const; - - /*! - * Returns the description of this unsynchronized lyrics frame. - * - * \note Most taggers simply ignore this value. - * - * \see setDescription() - */ - String description() const; - - /*! - * Returns the text of this unsynchronized lyrics frame. - * - * \see setText() - */ - String text() const; - - /*! - * Set the language using the 3 byte language code from - * ISO-639-2 to - * \a languageCode. - * - * \see language() - */ - void setLanguage(const ByteVector &languageCode); - - /*! - * Sets the description of the unsynchronized lyrics frame to \a s. - * - * \see description() - */ - void setDescription(const String &s); - - /*! - * Sets the text portion of the unsynchronized lyrics frame to \a s. - * - * \see text() - */ - virtual void setText(const String &s); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - - /*! Parses this frame as PropertyMap with a single key. - * - if description() is empty or "LYRICS", the key will be "LYRICS" - * - if description() is not a valid PropertyMap key, the frame will be - * marked unsupported by an entry "USLT/" in the unsupportedData() - * attribute of the returned map. - * - otherwise, the key will be "LYRICS:" - * - The single value will be the frame's text(). - * Note that currently the language() field is not supported by the PropertyMap - * interface. - */ - PropertyMap asProperties() const; - - /*! - * LyricsFrames each have a unique description. This searches for a lyrics - * frame with the description \a d and returns a pointer to it. If no - * frame is found that matches the given description null is returned. - * - * \see description() - */ - static UnsynchronizedLyricsFrame *findByDescription(const Tag *tag, const String &d); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - UnsynchronizedLyricsFrame(const ByteVector &data, Header *h); - UnsynchronizedLyricsFrame(const UnsynchronizedLyricsFrame &); - UnsynchronizedLyricsFrame &operator=(const UnsynchronizedLyricsFrame &); - - class UnsynchronizedLyricsFramePrivate; - UnsynchronizedLyricsFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/urllinkframe.h b/taglib/include/taglib/urllinkframe.h deleted file mode 100644 index c9f75ab..0000000 --- a/taglib/include/taglib/urllinkframe.h +++ /dev/null @@ -1,190 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_URLLINKFRAME_H -#define TAGLIB_URLLINKFRAME_H - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 URL frame - /*! - * An implementation of ID3v2 URL link frames. - */ - class TAGLIB_EXPORT UrlLinkFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit UrlLinkFrame(const ByteVector &data); - - /*! - * Destroys this UrlLinkFrame instance. - */ - virtual ~UrlLinkFrame(); - - /*! - * Returns the URL. - */ - virtual String url() const; - - /*! - * Sets the URL to \a s. - */ - virtual void setUrl(const String &s); - - // Reimplementations. - - virtual void setText(const String &s); - virtual String toString() const; - PropertyMap asProperties() const; - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - UrlLinkFrame(const ByteVector &data, Header *h); - - private: - UrlLinkFrame(const UrlLinkFrame &); - UrlLinkFrame &operator=(const UrlLinkFrame &); - - class UrlLinkFramePrivate; - UrlLinkFramePrivate *d; - }; - - //! ID3v2 User defined URL frame - - /*! - * This is a specialization of URL link frames that allows for - * user defined entries. Each entry has a description in addition to the - * normal list of fields that a URL link frame has. - * - * This description identifies the frame and must be unique. - */ - class TAGLIB_EXPORT UserUrlLinkFrame : public UrlLinkFrame - { - friend class FrameFactory; - - public: - /*! - * Constructs an empty user defined URL link frame. For this to be - * a useful frame both a description and text must be set. - */ - explicit UserUrlLinkFrame(String::Type encoding = String::Latin1); - - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit UserUrlLinkFrame(const ByteVector &data); - - /*! - * Destroys this UserUrlLinkFrame instance. - */ - virtual ~UserUrlLinkFrame(); - - // Reimplementations. - - virtual String toString() const; - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns the description for this frame. - */ - String description() const; - - /*! - * Sets the description of the frame to \a s. \a s must be unique. - */ - void setDescription(const String &s); - - /*! - * Parses the UserUrlLinkFrame as PropertyMap. The description() is taken as key, - * and the URL as single value. - * - if description() is empty, the key will be "URL". - * - otherwise, if description() is not a valid key (e.g. containing non-ASCII - * characters), the returned map will contain an entry "WXXX/" - * in its unsupportedData() list. - */ - PropertyMap asProperties() const; - - /*! - * Searches for the user defined url frame with the description \a description - * in \a tag. This returns null if no matching frames were found. - */ - static UserUrlLinkFrame *find(Tag *tag, const String &description); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - UserUrlLinkFrame(const ByteVector &data, Header *h); - - private: - UserUrlLinkFrame(const UserUrlLinkFrame &); - UserUrlLinkFrame &operator=(const UserUrlLinkFrame &); - - class UserUrlLinkFramePrivate; - UserUrlLinkFramePrivate *d; - }; - - } // namespace ID3v2 -} // namespace TagLib -#endif diff --git a/taglib/include/taglib/vorbisfile.h b/taglib/include/taglib/vorbisfile.h deleted file mode 100644 index a166db4..0000000 --- a/taglib/include/taglib/vorbisfile.h +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISFILE_H -#define TAGLIB_VORBISFILE_H - -#include "taglib_export.h" -#include "oggfile.h" -#include "xiphcomment.h" - -#include "vorbisproperties.h" - -namespace TagLib { - -/* - * This is just to make this appear to be in the Ogg namespace in the - * documentation. The typedef below will make this work with the current code. - * In the next BIC version of TagLib this will be really moved into the Ogg - * namespace. - */ - -#ifdef DOXYGEN - namespace Ogg { -#endif - - //! A namespace containing classes for Vorbis metadata - - namespace Vorbis { - - - //! An implementation of Ogg::File with Vorbis specific methods - - /*! - * This is the central class in the Ogg Vorbis metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Vorbis specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs a Vorbis file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a Vorbis file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the Vorbis::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Check if the given \a stream can be opened as an Ogg Vorbis file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace Vorbis - -/* - * To keep compatibility with the current version put Vorbis in the Ogg namespace - * only in the docs and provide a typedef to make it work. In the next BIC - * version this will be removed and it will only exist in the Ogg namespace. - */ - -#ifdef DOXYGEN - } -#else - namespace Ogg { namespace Vorbis { typedef TagLib::Vorbis::File File; } } -#endif - -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/vorbisproperties.h b/taglib/include/taglib/vorbisproperties.h deleted file mode 100644 index 4ca2bfe..0000000 --- a/taglib/include/taglib/vorbisproperties.h +++ /dev/null @@ -1,160 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISPROPERTIES_H -#define TAGLIB_VORBISPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - -/* - * This is just to make this appear to be in the Ogg namespace in the - * documentation. The typedef below will make this work with the current code. - * In the next BIC version of TagLib this will be really moved into the Ogg - * namespace. - */ - -#ifdef DOXYGEN - namespace Ogg { -#endif - - namespace Vorbis { - - class File; - - //! An implementation of audio property reading for Ogg Vorbis - - /*! - * This reads the data from an Ogg Vorbis stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Vorbis::Properties with the data read from the - * Vorbis::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this VorbisProperties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the Vorbis version, currently "0" (as specified by the spec). - */ - int vorbisVersion() const; - - /*! - * Returns the maximum bitrate as read from the Vorbis identification - * header. - */ - int bitrateMaximum() const; - - /*! - * Returns the nominal bitrate as read from the Vorbis identification - * header. - */ - int bitrateNominal() const; - - /*! - * Returns the minimum bitrate as read from the Vorbis identification - * header. - */ - int bitrateMinimum() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace Vorbis - -/* - * To keep compatibility with the current version put Vorbis in the Ogg namespace - * only in the docs and provide a typedef to make it work. In the next BIC - * version this will be removed and it will only exist in the Ogg namespace. - */ - -#ifdef DOXYGEN - } -#else - namespace Ogg { namespace Vorbis { typedef TagLib::AudioProperties AudioProperties; } } -#endif - -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/wavfile.h b/taglib/include/taglib/wavfile.h deleted file mode 100644 index bcd2841..0000000 --- a/taglib/include/taglib/wavfile.h +++ /dev/null @@ -1,215 +0,0 @@ -/*************************************************************************** - copyright : (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_WAVFILE_H -#define TAGLIB_WAVFILE_H - -#include "rifffile.h" -#include "id3v2tag.h" -#include "infotag.h" -#include "wavproperties.h" - -namespace TagLib { - - namespace RIFF { - - //! An implementation of WAV metadata - - /*! - * This is implementation of WAV metadata. - * - * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF - * chunk as well as properties from the file. - */ - - namespace WAV { - - //! An implementation of TagLib::File with WAV specific methods - - /*! - * This implements and provides an interface for WAV files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to WAV files. - */ - - class TAGLIB_EXPORT File : public TagLib::RIFF::File - { - public: - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v2 tags. - ID3v2 = 0x0001, - //! Matches INFO tags. - Info = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs a WAV file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a WAV file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the ID3v2 Tag for this file. - * - * \note This method does not return all the tags for this file for - * backward compatibility. Will be fixed in TagLib 2.0. - */ - ID3v2::Tag *tag() const; - - /*! - * Returns the ID3v2 Tag for this file. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the - * file on disk actually has an ID3v2 tag. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag() const; - - /*! - * Returns the RIFF INFO Tag for this file. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has a RIFF INFO tag. Use hasInfoTag() to check if the - * file on disk actually has a RIFF INFO tag. - * - * \see hasInfoTag() - */ - Info::Tag *InfoTag() const; - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * \note This will update the file immediately. - */ - void strip(TagTypes tags = AllTags); - - /*! - * Implements the unified property interface -- export function. - * This method forwards to ID3v2::Tag::properties(). - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * This method forwards to ID3v2::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the WAV::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * \deprecated Use save(TagTypes, StripTags, ID3v2::Version). - */ - TAGLIB_DEPRECATED bool save(TagTypes tags, bool stripOthers, int id3v2Version = 4); - - /*! - * Save the file. If \a strip is specified, it is possible to choose if - * tags not specified in \a tags should be stripped from the file or - * retained. With \a version, it is possible to specify whether ID3v2.4 - * or ID3v2.3 should be used. - */ - bool save(TagTypes tags, StripTags strip = StripOthers, - ID3v2::Version version = ID3v2::v4); - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - /*! - * Returns whether or not the file on disk actually has a RIFF INFO tag. - * - * \see InfoTag() - */ - bool hasInfoTag() const; - - /*! - * Returns whether or not the given \a stream can be opened as a WAV - * file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - void removeTagChunks(TagTypes tags); - - friend class Properties; - - class FilePrivate; - FilePrivate *d; - }; - } // namespace WAV - } // namespace RIFF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/wavpackfile.h b/taglib/include/taglib/wavpackfile.h deleted file mode 100644 index ffece73..0000000 --- a/taglib/include/taglib/wavpackfile.h +++ /dev/null @@ -1,223 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_WVFILE_H -#define TAGLIB_WVFILE_H - -#include "tfile.h" -#include "taglib_export.h" -#include "wavpackproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of WavPack metadata - - /*! - * This is implementation of WavPack metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. - */ - - namespace WavPack { - - //! An implementation of TagLib::File with WavPack specific methods - - /*! - * This implements and provides an interface for WavPack files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to WavPack files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches APE tags. - APE = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs a WavPack file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an WavPack file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both an APE and an ID3v1 tag, only APE - * will be converted to the PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * Creates an APE tag if it does not exists and calls setProperties() on - * that. Any existing ID3v1 tag will be updated as well. - */ - PropertyMap setProperties(const PropertyMap&); - - /*! - * Returns the MPC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag is still owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - /*! - * Check if the given \a stream can be opened as a WavPack file. - * - * \note This method is designed to do a quick check. The result may - * not necessarily be correct. - */ - static bool isSupported(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace WavPack -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/wavpackproperties.h b/taglib/include/taglib/wavpackproperties.h deleted file mode 100644 index e1a481d..0000000 --- a/taglib/include/taglib/wavpackproperties.h +++ /dev/null @@ -1,149 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_WVPROPERTIES_H -#define TAGLIB_WVPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace WavPack { - - class File; - - static const unsigned int HeaderSize = 32; - - //! An implementation of audio property reading for WavPack - - /*! - * This reads the data from an WavPack stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of WavPack::Properties with the data read from the - * ByteVector \a data. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - TAGLIB_DEPRECATED Properties(const ByteVector &data, long streamLength, - ReadStyle style = Average); - - /*! - * Create an instance of WavPack::Properties. - */ - Properties(File *file, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this WavPack::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. 0 means unknown or custom. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample. - */ - int bitsPerSample() const; - - /*! - * Returns whether or not the file is lossless encoded. - */ - bool isLossless() const; - - /*! - * Returns the total number of audio samples in file. - */ - unsigned int sampleFrames() const; - - /*! - * Returns WavPack version. - */ - int version() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file, long streamLength); - unsigned int seekFinalIndex(File *file, long streamLength); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace WavPack -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/wavproperties.h b/taglib/include/taglib/wavproperties.h deleted file mode 100644 index 2b3c0be..0000000 --- a/taglib/include/taglib/wavproperties.h +++ /dev/null @@ -1,163 +0,0 @@ -/*************************************************************************** - copyright : (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_WAVPROPERTIES_H -#define TAGLIB_WAVPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - - class ByteVector; - - namespace RIFF { - - namespace WAV { - - class File; - - //! An implementation of audio property reading for WAV - - /*! - * This reads the data from an WAV stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of WAV::Properties with the data read from the - * ByteVector \a data. - * - * \deprecated Use Properties(File *, ReadStyle). - */ - TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style); - - /*! - * Create an instance of WAV::Properties with the data read from the - * ByteVector \a data and the length calculated using \a streamLength. - * - * \deprecated Use Properties(File *, ReadStyle). - */ - TAGLIB_DEPRECATED Properties(const ByteVector &data, unsigned int streamLength, ReadStyle style); - - /*! - * Create an instance of WAV::Properties with the data read from the - * WAV::File \a file. - */ - Properties(File *file, ReadStyle style); - - /*! - * Destroys this WAV::Properties instance. - */ - virtual ~Properties(); - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \note This method is just an alias of lengthInSeconds(). - * - * \deprecated Use lengthInSeconds(). - */ - TAGLIB_DEPRECATED virtual int length() const; - - /*! - * Returns the length of the file in seconds. The length is rounded down to - * the nearest whole second. - * - * \see lengthInMilliseconds() - */ - // BIC: make virtual - int lengthInSeconds() const; - - /*! - * Returns the length of the file in milliseconds. - * - * \see lengthInSeconds() - */ - // BIC: make virtual - int lengthInMilliseconds() const; - - /*! - * Returns the average bit rate of the file in kb/s. - */ - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const; - - /*! - * Returns the number of bits per audio sample. - */ - int bitsPerSample() const; - - /*! - * Returns the number of bits per audio sample. - * - * \note This method is just an alias of bitsPerSample(). - * - * \deprecated Use bitsPerSample(). - */ - TAGLIB_DEPRECATED int sampleWidth() const; - - /*! - * Returns the number of sample frames. - */ - unsigned int sampleFrames() const; - - /*! - * Returns the format ID of the file. - * 0 for unknown, 1 for PCM, 2 for ADPCM, 3 for 32/64-bit IEEE754, and - * so forth. - * - * \note For further information, refer to the WAVE Form Registration - * Numbers in RFC 2361. - */ - int format() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace WAV - } // namespace RIFF -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/xingheader.h b/taglib/include/taglib/xingheader.h deleted file mode 100644 index 4854168..0000000 --- a/taglib/include/taglib/xingheader.h +++ /dev/null @@ -1,129 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Ismael Orenstein - email : orenstein@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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_XINGHEADER_H -#define TAGLIB_XINGHEADER_H - -#include "mpegheader.h" -#include "taglib_export.h" - -namespace TagLib { - - class ByteVector; - - namespace MPEG { - - class File; - - //! An implementation of the Xing/VBRI headers - - /*! - * This is a minimalistic implementation of the Xing/VBRI VBR headers. - * Xing/VBRI headers are often added to VBR (variable bit rate) MP3 streams - * to make it easy to compute the length and quality of a VBR stream. Our - * implementation is only concerned with the total size of the stream (so - * that we can calculate the total playing time and the average bitrate). - * It uses - * this text and the XMMS sources as references. - */ - - class TAGLIB_EXPORT XingHeader - { - public: - /*! - * The type of the VBR header. - */ - enum HeaderType - { - /*! - * Invalid header or no VBR header found. - */ - Invalid = 0, - - /*! - * Xing header. - */ - Xing = 1, - - /*! - * VBRI header. - */ - VBRI = 2, - }; - - /*! - * Parses an Xing/VBRI header based on \a data which contains the entire - * first MPEG frame. - */ - XingHeader(const ByteVector &data); - - /*! - * Destroy this XingHeader instance. - */ - virtual ~XingHeader(); - - /*! - * Returns true if the data was parsed properly and if there is a valid - * Xing/VBRI header present. - */ - bool isValid() const; - - /*! - * Returns the total number of frames. - */ - unsigned int totalFrames() const; - - /*! - * Returns the total size of stream in bytes. - */ - unsigned int totalSize() const; - - /*! - * Returns the type of the VBR header. - */ - HeaderType type() const; - - /*! - * Returns the offset for the start of this Xing header, given the - * version and channels of the frame - * - * \deprecated Always returns 0. - */ - TAGLIB_DEPRECATED static int xingHeaderOffset(TagLib::MPEG::Header::Version v, - TagLib::MPEG::Header::ChannelMode c); - - private: - XingHeader(const XingHeader &); - XingHeader &operator=(const XingHeader &); - - void parse(const ByteVector &data); - - class XingHeaderPrivate; - XingHeaderPrivate *d; - }; - } // namespace MPEG -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/xiphcomment.h b/taglib/include/taglib/xiphcomment.h deleted file mode 100644 index cb4742b..0000000 --- a/taglib/include/taglib/xiphcomment.h +++ /dev/null @@ -1,280 +0,0 @@ -/*************************************************************************** - 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISCOMMENT_H -#define TAGLIB_VORBISCOMMENT_H - -#include "tag.h" -#include "tlist.h" -#include "tmap.h" -#include "tstring.h" -#include "tstringlist.h" -#include "tbytevector.h" -#include "flacpicture.h" -#include "taglib_export.h" - -#ifdef _MSC_VER -// Explained at end of tpropertymap.cpp -extern template class TAGLIB_EXPORT TagLib::Map; -#endif - -namespace TagLib { - - namespace Ogg { - - /*! - * A mapping between a list of field names, or keys, and a list of values - * associated with that field. - * - * \see XiphComment::fieldListMap() - */ - typedef Map FieldListMap; - - //! Ogg Vorbis comment implementation - - /*! - * This class is an implementation of the Ogg Vorbis comment specification, - * to be found in section 5 of the Ogg Vorbis specification. Because this - * format is also used in other (currently unsupported) Xiph.org formats, it - * has been made part of a generic implementation rather than being limited - * to strictly Vorbis. - * - * Vorbis comments are a simple vector of keys and values, called fields. - * Multiple values for a given key are supported. - * - * \see fieldListMap() - */ - - class TAGLIB_EXPORT XiphComment : public TagLib::Tag - { - public: - /*! - * Constructs an empty Vorbis comment. - */ - XiphComment(); - - /*! - * Constructs a Vorbis comment from \a data. - */ - XiphComment(const ByteVector &data); - - /*! - * Destroys this instance of the XiphComment. - */ - virtual ~XiphComment(); - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual unsigned int year() const; - virtual unsigned int track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(unsigned int i); - virtual void setTrack(unsigned int i); - - virtual bool isEmpty() const; - - /*! - * Returns the number of fields present in the comment. - */ - unsigned int fieldCount() const; - - /*! - * Returns a reference to the map of field lists. Because Xiph comments - * support multiple fields with the same key, a pure Map would not work. - * As such this is a Map of string lists, keyed on the comment field name. - * - * The standard set of Xiph/Vorbis fields (which may or may not be - * contained in any specific comment) is: - * - *
    - *
  • TITLE
  • - *
  • VERSION
  • - *
  • ALBUM
  • - *
  • ARTIST
  • - *
  • PERFORMER
  • - *
  • COPYRIGHT
  • - *
  • ORGANIZATION
  • - *
  • DESCRIPTION
  • - *
  • GENRE
  • - *
  • DATE
  • - *
  • LOCATION
  • - *
  • CONTACT
  • - *
  • ISRC
  • - *
- * - * For a more detailed description of these fields, please see the Ogg - * Vorbis specification, section 5.2.2.1. - * - * \note The Ogg Vorbis comment specification does allow these key values - * to be either upper or lower case. However, it is conventional for them - * to be upper case. As such, TagLib, when parsing a Xiph/Vorbis comment, - * converts all fields to uppercase. When you are using this data - * structure, you will need to specify the field name in upper case. - * - * \warning You should not modify this data structure directly, instead - * use addField() and removeField(). - */ - const FieldListMap &fieldListMap() const; - - /*! - * Implements the unified property interface -- export function. - * The result is a one-to-one match of the Xiph comment, since it is - * completely compatible with the property interface (in fact, a Xiph - * comment is nothing more than a map from tag names to list of values, - * as is the dict interface). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * The tags from the given map will be stored one-to-one in the file, - * except for invalid keys (less than one character, non-ASCII, or - * containing '=' or '~') in which case the according values will - * be contained in the returned PropertyMap. - */ - PropertyMap setProperties(const PropertyMap&); - - /*! - * Check if the given String is a valid Xiph comment key. - */ - static bool checkKey(const String&); - - /*! - * Returns the vendor ID of the Ogg Vorbis encoder. libvorbis 1.0 as the - * most common case always returns "Xiph.Org libVorbis I 20020717". - */ - String vendorID() const; - - /*! - * Add the field specified by \a key with the data \a value. If \a replace - * is true, then all of the other fields with the same key will be removed - * first. - * - * If the field value is empty, the field will be removed. - */ - void addField(const String &key, const String &value, bool replace = true); - - /*! - * Remove the field specified by \a key with the data \a value. If - * \a value is null, all of the fields with the given key will be removed. - * - * \deprecated Using this method may lead to a linkage error. - */ - // BIC: remove and merge with below - TAGLIB_DEPRECATED void removeField(const String &key, const String &value = String()); - - /*! - * Remove all the fields specified by \a key. - * - * \see removeAllFields() - */ - void removeFields(const String &key); - - /*! - * Remove all the fields specified by \a key with the data \a value. - * - * \see removeAllFields() - */ - void removeFields(const String &key, const String &value); - - /*! - * Remove all the fields in the comment. - * - * \see removeFields() - */ - void removeAllFields(); - - /*! - * Returns true if the field is contained within the comment. - * - * \note This is safer than checking for membership in the FieldListMap. - */ - bool contains(const String &key) const; - - /*! - * Renders the comment to a ByteVector suitable for inserting into a file. - */ - ByteVector render() const; // BIC: remove and merge with below - - /*! - * Renders the comment to a ByteVector suitable for inserting into a file. - * - * If \a addFramingBit is true the standard Vorbis comment framing bit will - * be appended. However some formats (notably FLAC) do not work with this - * in place. - */ - ByteVector render(bool addFramingBit) const; - - - /*! - * Returns a list of pictures attached to the xiph comment. - */ - List pictureList(); - - /*! - * Removes an picture. If \a del is true the picture's memory - * will be freed; if it is false, it must be deleted by the user. - */ - void removePicture(FLAC::Picture *picture, bool del = true); - - /*! - * Remove all pictures. - */ - void removeAllPictures(); - - /*! - * Add a new picture to the comment block. The comment block takes ownership of the - * picture and will handle freeing its memory. - * - * \note The file will be saved only after calling save(). - */ - void addPicture(FLAC::Picture *picture); - - protected: - /*! - * Reads the tag from the file specified in the constructor and fills the - * FieldListMap. - */ - void parse(const ByteVector &data); - - private: - XiphComment(const XiphComment &); - XiphComment &operator=(const XiphComment &); - - class XiphCommentPrivate; - XiphCommentPrivate *d; - }; - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/xmfile.h b/taglib/include/taglib/xmfile.h deleted file mode 100644 index e72c92c..0000000 --- a/taglib/include/taglib/xmfile.h +++ /dev/null @@ -1,112 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_XMFILE_H -#define TAGLIB_XMFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "xmproperties.h" - -namespace TagLib { - - namespace XM { - - class TAGLIB_EXPORT File : public Mod::FileBase { - public: - /*! - * Constructs an Extended Module file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs an Extended Module file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * Forwards to Mod::Tag::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Forwards to Mod::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the XM::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - XM::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving Extended Module tags is not supported. - */ - bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace XM -} // namespace TagLib - -#endif diff --git a/taglib/include/taglib/xmproperties.h b/taglib/include/taglib/xmproperties.h deleted file mode 100644 index 8d953f2..0000000 --- a/taglib/include/taglib/xmproperties.h +++ /dev/null @@ -1,85 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * 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., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 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/ * - ***************************************************************************/ - -#ifndef TAGLIB_XMPROPERTIES_H -#define TAGLIB_XMPROPERTIES_H - -#include "taglib.h" -#include "tstring.h" -#include "audioproperties.h" - -namespace TagLib { - namespace XM { - class TAGLIB_EXPORT Properties : public AudioProperties { - friend class File; - public: - /*! Flag bits. */ - enum { - LinearFreqTable = 1 // otherwise its the amiga freq. table - }; - - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int lengthInSeconds() const; - int lengthInMilliseconds() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - unsigned short lengthInPatterns() const; - unsigned short version() const; - unsigned short restartPosition() const; - unsigned short patternCount() const; - unsigned short instrumentCount() const; - unsigned int sampleCount() const; - unsigned short flags() const; - unsigned short tempo() const; - unsigned short bpmSpeed() const; - - void setChannels(int channels); - - void setLengthInPatterns(unsigned short lengthInPatterns); - void setVersion(unsigned short version); - void setRestartPosition(unsigned short restartPosition); - void setPatternCount(unsigned short patternCount); - void setInstrumentCount(unsigned short instrumentCount); - void setSampleCount(unsigned int sampleCount); - void setFlags(unsigned short flags); - void setTempo(unsigned short tempo); - void setBpmSpeed(unsigned short bpmSpeed); - - private: - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } // namespace XM -} // namespace TagLib - -#endif diff --git a/taglib/lib/libtag.a b/taglib/lib/libtag.a deleted file mode 100644 index bf97ccd5946e836df57eb3074a76bcfed69b0f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207786 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�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�nrJF?_6A?O}PxhB@lWw>bpiP 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˷I^`XfHKlKa2XCE4z5&6{m$-pDN)vFT0_=kH0ncGf9ZS~;3{ zrrdLVLTfnm1WF@a&JMkmZ3Hng9eNDFE$UGBGW(EfY^zX&x%Xw?{Ye7%_p+f~2VS~2 zYFCYCxV}MO-=kf_$EOSOKM2=*KbP^`Yv^Z+Qq_PNv#>RGva_bNAz8J~ED;XNKa6=b z81!9Q9s@Z#iu(9tyNhL>Y0`CU7+JVOS@DUQ}OHZ5^D%dL{71k`=h*zse!28 zn8~8|oXBo2!xP6x&z%m-neVW-FJp|9Ial3tdt$b6Lq;jvpNwQGjOVVs73o#07WBA7 zlNyeE{ZYd9-@$&hk{Q4O$5E$Vv70#0>e)jNFUR{_%;xcI1#RL((#-D_jc~b}#ZVR&67~wt7GP>reHoe!Hv)4_q5Yv% zupYP=ZU!gXpVI}mekjt9`0Z^@_pYGT87byjMtV_x%FaHdWH039i_yr}w=kWS+<1f6 zCQeCLu0PXhe2iorVmG#Y1BHRKJcG2(w20juhe?Rx43w#{;X|Wch|1+wxAR$|vI717 zAnk4i`VnjdGtnSu8eqa-og02{co5#Z3jTerjDu|&5Kjg8T=~|HPSSyfmqJ{|-tIdd z8Ize0#(@uW#^&!ukAKYgBeI1kg9`Mr`5u3j28Pe?KXMQLrOKb>fcU*Ojh-~Hta(tg zj0eA~d>H3QoTWI&;pAfv-@~WioP#roa~{rBIGNmboNIA*;Cv2eH%>n89Ekq+GF(1F zoPaZolQ(qUR5?b_<^8EfyJ@%!aZYWRbUOY{Ku~q?P10bx#{N%zLa&uED4+jW2r@ig ze~wxEa&T~y-{7+NpfAD{XLL4=P z?_WT|Hv}as`s-X^Lio-E625O)+MO0XWPNep(tO*2L>_GcMcyzVkyi^O@;+~AKeXsx z>-&3){tP7Y-U1SN{{qtK<6S`IXbuqXJz-}d5br2q=Mqc%4A7a1#x?zCDfA^Eu{ZpN zMZW`@t$hCiBq`l5Y)~bTSYVxDY3Bf)qe3(RiACWOAd!59<@+@d`vxBYjJy{t;+`ZD z+u=ZBlUELOz6vo3Xs$whsuHvaNaCQyRHO1;3nXRGV`+c3v@m+Iq@LQ*^Hc~LB+pl9 zInV-ys6#A#Uj~x0r^Vhv<$D`YlR|d`EmG(KAW6$pKo=<5t3ZntD#QRKQbqtZE7~X^ zsliI13l;5BAc;2vBq6>7bdmCX07z2GwV8$Q9m^NRAl#z(MgocC6M&>l#{w-;z8?cx zs?g~`%M`lU@~yJyD?pNhZv#oI`zeq}J`_V{s|tHG(8UUk1LAW|*r~Iq0cfJ4od+cH zE&!4``aIBb<@+6=6$FGy4M4DT}sP)MwFFi~fK*lCV!(^nyicl(_hQ(W1WtN$Kvgw81Dp;adhIwQ#AW zU1`xZ79~-B5+a5Ynu4>?Nm#_*DYWY>y2GNEEgFe36+Yfs1>IuNW{b93G#q6wd=TQC zgi|bt1ff{evwWeNQ50ISbu|r7K|?G4^}WT?Znfw(>wCMU-C@x^*0(mn(vv@%O8w=`OFNm!0h!dDL@_mr6yv1Y_~k)a6)6+1l?fKZ5FXK#CL~9C6Fw%N{ePx1x0;m!0{}l_xMw{P-7A*!6>&6yK zYqf}FFTQLIl{gF47ZX9NtZ#?)We*VF>#Q$;dPftR#!0wB72x1~S!lHiu^rS{+GI=P zNGP_Cf?~K9RAy1RMM2v~kB$wv%<-TGAqN&7k|5({-B*E_D#fFyQEJ`u*HPfj~1e!Ip^pzwX)4RsLSQ2adHaft8KZhDr1!Y>1E zD6SLc=eZdazJa@;?g5405Zq8tgTgOV zMCIti@T}52LqQ+N&hlHD=K#f1!hbDAkXL&QiG&<}t6XDw2tGLb$Px!q z`Bs3!^=;%ZpLc2Pn@5C_4ibzCFuf z@|6fs&J9p54Nz_jQ0@*;UJFoyc9zGmdevdl6ST8j65#0!P`($S+#8_09H11kDfwbQ zDnO|ZP*w&g-wIIH1t@!ByH-8ccE|J8+Vyp9F9Tt7%`Oc?9*axk zwI^ds%UAAh+~v1_G#q0lEN@z}?2@K4m#%1QZC$oJ)wHm|?)3%R2c@?^BelGF=>_%8 zD^gxHf1A(Bx|*?<#AnXCpw_E1p3ggAPGyoYzPh1yKmpcsz~JLxW7ynU+w8R(Frtm$ zfPu$L3FHrLJ#BEK|8MgbkHgT^7J<)3!17dqMQ71#x?uhH)&kXJYIpoLrN)@X1j=Ks zmg6;WP_dWHSH9X3bHJecYTc;UZzzSCSH4aIW1!r8?Q0AJC-vVjoirth#JqRo#P=*@ zcUk)PlVhx~atl7MA+pJX+0iKwD97f~^5-+RG@kLjvjoqLYcGOH$+-iywIS3KkFJj$ z-~&E3jP1{Pw`BDCzCUJ_rg+|yMWrvW&73EZbN|zpk(IawoVgTxVGX!GfaQ2E_boGW zTOsNW>%D1=Q^WXJBm*XE-htW;vZ5(f+srOSE|mL#CX5*F^9UMuW~#YmMZBEjsoqu0 z-#;&$-_XKg)+E+zWY=_YZNupcJcF>;6Dii7`GV#*Y1IA2E5>wNBSba!N+$P=r7f5F z3PpKUtY~Vws21jY<#Q|TR%YG|xMhla>C%Nw%Y!oF<(DpRPBl$zS+?LJ^UN{vvQ*Qo zrUj{G%e~JWlA6@=wxtWWv!}15#_AFuFq-krOII{4PvwbW$r5jhy~PnU@Ki~N$K|0x zlI#yI#gb}j(K}k|LRRE_=9khWsundbUC8Dq_YcMG&ABSZG2^Ap43MfSR+CPWrN%Rc9$Dk}r23MSdTw!CU+14gU3r_8i*Qw8BF|8Q`lo_}_>EcdjVX_N`4YIe4Sa{At?=OI zM&TPsZcpY0h<-z0TQ>Fj?PuD$`Y$eyCoI1z@RImwv1!-BG$0 zbTI|Po_yHgBmRcUSp3=kxN9@wTIyhTyLB%OhPHA0hERG(`<5$*^eBFqJ6%>M+Y_n1 z{fuU?xY*0^9;2abHW8uiM-mnh*z~FTyz2A0FQVPQYE-`n>Ad`3)#)9&q(xNK# zYk%>|Ax}caweKKg=cIpBr>`h2sp^YfJq?TOZ9Y~8l#*$0$Ua&$Os zY|f4lZ;PJ)J6!)^TeSFqgz`K8K3qfC>~)Kxf9_rsePW_ENnFZ!pwX=hcSE#&J1FVb zvJa~SnD(mutE<*W+xJ6GYtpY|{{#+g!w7>`4h5!aSt(z`b^ER%(a(m#=C&Vf6&YRq z7Hklutc-n~suY&f8lfXW>4_unqR_lvF;%U3y-L-xlCGB$Ri>`9tCaC0#*fZJI7j12 z@9Ohxn%KBrQ2eG?3}5z9?)wK@7tZF=Jzl$q!}Z#f+5O|nmGL5Nc+wBoqfYySxat^ysg<(-UKNvA}YC5Tf)hj{TZGw>bLi9hpfZ)0daQ zH0k4LyO9R?u3;~TKY})o=70VHNszWh=djsFW-B~9l2GpGZj5muCpziA^rVrQNu>~S zsuA*DWRzwm#n2O1H=-t1?~1OD!Oct>-Wl#*w`K6^H!fSc?v3GBy|N3pwo!es-0O$I zB~7DUlPcB=2+2EZZgm`%Y5Kl(efzI_?XZvRLc30;rw&b@S%licj-%1feh2<2Nl$fU z<`$!#Y>X!+AOi7laM+5rnwc>arj?(61rWJIm;THB$n7DjEHGAdvw&nQIR1AiIQ086 z6yR*&(d*Ka!kJ01>W!}cz63|m;~(Nk!n-rLJ)A|^tHERXIa0`uX%PvDWc0N9tXd8HAv&U^Se+Sz@Y*{Et zlsovHqrnPGOGVR*F5tc*cHLNoVK}^1+LP%?#n_24dSGH?U!`Z`LD=5+W+%Jx+5X*t z4L(hj8wQM$Vwpv~C+9Yk1id5dPLl)^HIsv(f>Tds5eM8sk5@Z7ZbK{S8@Yo;V2obc z*K>UU**sC6FX}rNmL{t2UoJlk}-BI~%dryk}_fc|eV-&6{QX>^v| zjn@mbdl6hQujxY9K-cq}+V(Gx-CwvgGQrR54X3f%1Munr_W*1-6%X2HayPyuM__xt z3@qjbaj!h!n?h)x4=MNrEb{(1$hlc<;rEO1W4yS25Se~7=t$t-Dg4MF$Wr^~O%LpY zH|!YrofyIT)RjL00$*_d!XmX-UVNU&xIQ3b%%KQ*d{s8&EII6|0_U1g1n_@C5#aTq z$j*@SNGS4Fh}#wdzo_VpN$g_i#&DM5>p z*^P4(PKMiz^GTd+6kBli;iRmsICtRWI|?hN2xkJY7;Xv98sHe*GMtQ$dP|i!>wyz+ zZ%4u!fV<(2Dv~(M;eHKgALwi0{t$OP>MFABf&^EdH)u;H$lPLcIr{%>Zi~hzXn&@p zB-3vy(WdR1?qPzNh;)nH8@n*vwB9a;VG&-)_>#9C{c$ErJB7*bg_wS?K&CwVs<9o& zzH0EB3BMFFZuV;9@Q#CfyX}t#Dz;hxd2F%7A91WloHG%p*KX`ZSI)5r&O^UyD-AQ& z?MR$-YjLt(CgVH{=SrNjadzNbgL6jGnLfptQLF5q@WtwM(7Z>@t*h?73yb*KR_)@3(Cg%bssxVP#*!T!fvprF|1fXx{^3orN9h;PQPw z?C=dIsnAz|>J<7Z&}j;-x4sVou^z+DQ`UEjMbQEy`Em&{T!^d?Aw0v*>z@ z)&osbe2)W3s!qmZjG&KMbh<@NK$1S{2}*3#4;1tZ%Xc@Bq~Hl4Nx?RtGgNE`U{n!Q zX3->zW&lYX3xFgo7XgVp>I|~h!%oKXeaWI{fh5FBK%&F^CeU;hVyETfUJa7wQ9zQu z1|YE(TVN5*#6{lqmPSoNNxjk_RFa>tv^RmIOb4ScOW4CLV*eJ}NfuF~P-y2{bfHDG zyb|AaK$5;)7JU>?s^UAvqRTA$Hjt!c9negb()+D1*X5V6Pg}Ip@`W(ai7(gY7j&RS zH9%r9M@uQ`0keT-sW^UZeebot4_Mz_KuN_nXo!(K3`pv?3`lB!I*{-+0dceoJC|GE zc8e~9&t&EM3;fqAM0=sJ3av$*3%bRk+bsGB(jvZJwx|=5HO-=LTJ$}ON+EwD&O&9$ zCTO#zy=~EO^i}Z%$r*)HG}r|pTIXa%8)|)vEgEipODv7|0tp+lzD$eI$}AdfeK`t> zFYh6ODy=V{5rmeosK)vxEsgy}_}Kp>&1_Rb<47oIj`eM{w1pNew!STv)@o78`mVIJ zD=b=NeLF1eT8pl;zFn4fgGFns?~RtW)}ouO?=6;gt3|h2-`g$i4vX%wzTK9#-l9#` z_d!eBY|&%ZHw+|gcPP*loMGos{7YY;g^ZwMt?x;eR%ubf`jT6E1;;*-N83=5a)Cw5 zEV>j(LR<+XA&P;d?bcY-V$pRLv0U6X&fX(!Tu>3N$0-`~CNxSGG~D`@SlUR7V%E3R z(#k9vZGFovt->Ofi^L0{_j6)eK8_Qe5(jf7HVp}dm?}Q}2(8-E*s{f@K~N0Wf|wRT zOo1TAD=4pZgR2$CDpbc#?JCW4Nt&j(4lRFpxZ3GcL5cY&wA^7jTpq6ck?>LYWYOTG zyaWo5VK@sz3H%SnDF<%a>L@D64RstStKjFxH5n8hu15WZpmc-c@_Y-F%{~hDJ9oDD zD1QZItB-ONlYvyaa;AX7w;7kR43wCU!o61cX5;ew7Lk};lK}gZ%fp>7{XDmT!gnb*)LWp;_J#Vypj@77LE*6< z&ce_U3Y$O41J;(&Jb32-Pci;csQNHGk7*wE%EA!8ce;n+*{OLBfY;vb(Zu({MXn&A z56%XG_8TZL&#|{Q2p`f-oY^Z3b>Khhks|O!%|l1_dh*9bu2VG+#}(|+gnz#r(cmJd zZeyXva*^{tRm)-Mfou?FYaaGfsm)6?g)KoSU)B`XyHIY|6xOm(9?=xmsZh3R3j2ak z1~WtY5Xy-@N`AY5S(eAhxgn)eXB@HI5eyJ+{xteV#{zir80$Wwf-yaB2nh7R)<&X`q6jVY@% zMs1+@n7LEx&zM+UKX>l5x$*i5D;A~Z&2MS)D&OU{^}Mq3>0olqtt_voJWTJK-nzGEu&d3qNz0P~@0LILy=~}V zn!SPZ`2MGq-1V>&NWSP{4x~n|bU1VMdd+RatEg=DnlaIM_GU3RtbD=tycv#1bv2&= zS0_E6Z)IxPnKKr{tgQAzWgC`{XF_V3mqlklWqd&8@;teGFZ%EKl4Cc|@fx!QY7Jup zZzDMaNj`b4Eg0UY-#f3hDK+nclNPkf#w9VUC0Y@Si8iSG$IHvdj~^e4jT=*0Q5oYw zEzvUd82i-q_%eVuE`FQJ)e`LjUK6oguw~5zFO_eF4d6?x5~_-qLhvoteE&i?Nne#OUM@da$kc{@q+JI z&1d5sH=c^k_UHyW1$;G{kFSv`zvJURd1au#3%*-&;~hW2r`^kVOXoPw&vWCQFvi#N zyTMluzRjAC;Z(d6Civ1f8uYE;OMVdmhs|%Lzup*rO(3|Bw#AuUOpK0~cX4hw$i>Y&( z(7Vyd8qicj>^vl4zoLe?sZ^-_0Fe(*LNd`eU@?2FBYt12QG<^nHxI z9KHUo= zh`OrBqaF7%bmuv-dhWRLjB43bV!sfbBAGd_Bw6*3RJp5BhUTA)VG{?%SDo%9>%(Mi zzp@0K=%r{!HOBO*t6xsdM&GKAez|vQ)hp2()%e+v0x?Ptf`TUYM!_gj zZ-Qek#~5i7xvsOd!iXRe>~Q+m&K*!l}Liq@y&OWRZuF)UT?`EF?0pa_f)QM?3p#Mjd-=9oxQX+Dzt^_rX zok6hg-c!ld-EGhIUxjTuvJbF?&|A9U%8q#}ag(|YSBsL-rJI1I|2&lJJm6NvTT?na ziJi?FaiMt7FWy=dZCMvRu%|g_qLgAYJuT z+jGgzIoul!9Vb;93pCttb00<@RQW!K*9BTByaa`jCeDOsIN|1J9=MN~6|Co(BxtEt z&sbQW%Z>x9sb5vnnb|ray3##mEzLp-4B-z*rf)1=h4Rck%Z{yfbu+^;%-Pu9VrUL@ z$7}a$?KUd6H+!?bK0~`~OXR;;yT63nWuNY17*y1a12->SZFs6uHxF!8smp*5G$>Hz zpDDyXfF;TFr;CysYm1RmnEp6`^4y7GWGEha`fgNXVl8eMm*d8;D|Jya-LIm-z@wwV z{i*XTM2}3FXwE`3`W}@Tj4i7~X6B3%v!7MEur58Pw75RK06kYl^-Nz}MKuXgUCF50 z)+Djjn7xmwBHN_0zApQycDE{bWA+t&eIz=h|M|b#dw)ku!p@_eS8znv_YB*%GZ*2R z_dGoFHWg1zzk)8>c1ZS0h&Amyb1wUBDxU0Ifza=myy9u|Wo0X(<)PE?{#2KK4jqJ2 z9-dnDI^Ij_tCqytJ_4_!lbNX{ecz)+g)Zy*bQA8yO?bwy)zA1Ms|%UeW?eLb#PEgj zsy?%VBTL&s{T1q(rFVQXy{RtUTh}?u=8KQf(@N^F{U-+dXEE5Pil(Oj*8lX>^qUw~ z+J^U!H~G@xaRcC(VD9t0QA|TkFnpVYM}GRBPNttvR<*@aXVz6=aGLJv|H!SW{`Awz zLbF%54~|fBOGcwG{a26Y?Muo-^;O&3y0e2IYiiZoZQsv6%Z_iJKkh&kIN5vI5pj#E zcfW=h%C_OcM(dpgh1VH|qTTM!P@J z`Rr2pl;@WuYD=ZBeMjh$sCk|^br+h_CByK5p^S^AKdD#Y>O1&(LcKJa=Z&}ewryvd zd+XYo(vy{}=&yiuP!7WnA;LvnzVW4%wpD2DkJqJtZz@JTo7r}snN$`>IiyM((OP5u zC$W7ZfQi*L$FiiS+c%1ZG2*PpjnLlM(7Ex|L*7pBOlE3}F(`G~y)A1ow!XkG5Gw7u z|8)*8v~eMT-XYEthL2*6C@(xm>sFXK69Z-n4_$b;Zokho%_~Y9)JunbXs^Rlm1}ry zM^`r&DjB9s>eayB>UlxQ_N!{_$%auA+2Q!(K6poH_eAAx$eyCFskBFb8WgCIyZ>Wt zZGn83%l$;;d%nBs^-X98wedIN+hGo$Ov9jB?xpQJ_KSY@i%eptSjF?1tDO5gqO@vC zD~Vc(68*zvT*8ys=xW%(ccumn3BAdI*j7$;6)dT1RDNZkZ|~c`YHRfBI7l^}i;85I zPuhy^tW9sx^#_B@YiWEt>aXevd1rcC=cFBoaJ2FVtG2qO>^^lj6xpNtD4MHGxA*UN z)j$4;{6(*si?Oyob46)+4IU9kBNA125`fQPfB!4Yyz$B@ln#6WI#GpKSXybSFqy$a zdo_0=eW&_PczWJlp0Paod65rgd>Bn|6#={_Nn7Z=xpWm$lg!MdhZt3xDDjq}zd)@l zX0bNZ!}dPO`|ri(zJ)FYagzHy-=TO1a(kWmPNly?;qek9g!&FupZ*7*nv=X;po(Td zs3Zlq>WhEphOUrH4Xb*f-!m0ym2SmIX=_J)7(GZLQeI}&0uPf^N z;$KioD2Cbgc8H5|DGYPp05cksesnTPQDtYvRw|VJhI$cnl2@(Yg!tXAq#rKlt1i-$ zZP4z8+Pzu3w7X%yxJ|pC)$Tdky&f*#m)sqC@f{TRz>Ioc8=}&HXCHou#5T-ofAUpG z2dZpXcl;L@my2iC% zbAa!}7?1brQ!#p8`h@i5MSWxO2*oE#{aFZ)(;KsIs>EYgSnd89ZtnN7vwU~B#p>%A z#>Gd?exrGAv3SB-zu4Cz-SL)djKKOB5uq3`QpkH8-K)_((!GX~=-8gRLwynO-j?}w z%I($Wi5;zwU#a;LJvIHd{$2#O_xzojA7$+L@KRmX^Z3B$`9_U)k5?YNA=_pv_ixoG z^!S7~P4zHftCObIITOIuO463m-h439^FHpmu(0=CiSP;WsAeo zb&Ir%S#;HvW7<7lyWGdm|9pZJsp<8#9rs7oss$!}819Cn+5+zzNxZ1*YCxwj z?|0@g-VW24>0lK+ud3j0{Lc07l|SB|%=p~T@<$rnIRcdbN|Tm)ETmA^sbApLhjMu& zLWuSr}Mf%yIf}yB7Si*~kY1-9jlhfiV+rC99AQ z^dEkuP{H*up_+`Ir<1yp=3!e)U$G~hY}u4!<+8ophxF2YM7z)IZTdMI6-@uyH}^gL zGOv|C{SE2{D}H&?k6n;e`ms5(a>J28`J3kz+@4SexKH)H^9EBXrGZh7JEfZ^mKv5b zHprGDl;SkgiE5vFcEY}$YC#PdyIGtPn*E&1H{{g6?{3*xpIMI8ov_{p2VSnQVTN0& zO!jy)^r+W4HR-xo#?q7V%wC^bYpgJ&f8jrt*W)WSMt; zPQ6u{dDmMMqZ+DA&B$HAWW}`L^ahk}nJH;QO=2k(*_z(YMXB#L>gF#`+ENzJc*`Qa zmCx_G(o6}N2>ZW_aa0wTJ3kv;JsS^X2$XG54`#jDGSm(0=nUodX6I^`TUwGnMPIkU zt-}f?tM&Co+MS?X8f>%AP##u)+o$^Fh-*^+-}?2G#rsgdYgN7UWH;*ic~ZO2Yx-~X z^&4Q#9q+&O`@!_z5>+ofS(+`fez?^p-C3GGL0>n) zW&O74>vOexoOZ9)F6HfO{ql+9zxDgU)Nhxnm!9meb^UDA?n9dXGkyIWT-NU!`ub7r z-lW}kv`cyWTEBea`)~bzF!ftBm}T3OJz2TE*-vP9vZf!Wug`?b`fbwJr)&2x?Jn0Y z<*|PK-yw;;xSp?7{WWHO)x5r` zukl(<)xJlV7nmMbw0tcxdZ?V*$JaLrhp7s@ugQxew57gh-be8H>1)Z(aZFOQ_ANZnsI21KpSceiMZatWWNE9afzoNfKlPF0>vz|>|h5mz> z4(KQFGw;mjIIJC^!g|=K&Hz;fC{*Zz#>lru)r3@FGP6=kMcxy7Rv4Z!?&bdga6ac>CM?d?06;23hx;%Q#mq4=L>)ld&tM8E~kz&;Q29?}I#~Z1O z+~QsgMH+q+hC17;yyd3fw%;+PB1)~Snwg5)In(No&%n27e(g7(bD=4t{bk;6d|mo= z3=X0{o{<8m@0^0Kyjq?qBus5^eun*_KK)8v)tk|dc}PXF^GusvD!g*t8z#9v(^^)S zSz1!piCJ2dT3HYQX6GasWA^a4>RsZ;B#UT8Zu z%g@$mq#bbB#h2h|skD^-N7h#@EG>(6Y$Cn$OnhgrFD+InL^FRvd;XZ7zQ_@qYPK8N zCL)Jy+?PIsZ|LXa#*OjJ_5*LrK5`_6{8=dv&3Zg29(#<03xJ)!7Hn_l(xxF`Eq5i`=0{fBnVb!3Rp576#m z+U?hTFKG8@O+P`qG0OSoTa)yoBuY5>jQS0D_ zLEYia1zQ-;u5TP2IyAn-aef?%?23f$2t}?LRCskkA0`Hot51`~Q7Z($SWq5nRF^D+ zBPP~4&KJR4;Cu}MLr!-n^7jxI^(BAt5T|(lfGYzpzMfpSgd$IdonH}Rb=|KV7fBfG-RtAt++ zNB$IczQa$_YQ^9&IjjACBOdz5A@D4VYzu|PMP3UP&OPRH1)(p5BJYGkH-;it7Zm<3 z6amF%-x?{;m)?!He&4SR}c?xw;^NmflssmcFKdEq$$O-M17(9xGtgK8V}ih=ccY4i1fQ z^0gGSv4ux(MG4$c5V>KH^R0rzVdGg4c{}1fSrF+MICq63 z*9~$W!BWx@=e2O;-H7w|aO95>=c)+l>Bzz0xhcW`Ka5b&FCr`p_VM|FK0e~G(_r%& zfs$M64M@c23L-ZbIM=fQ4qPWA)GE`FABLQo2u91ZBmWa})`WP?Fzgfe<;$rWQznf> ze9e(x7dk7D(J!MpexcC$0psf_hyXrR5W(ta&lj*N-YAItpwQV-5cyf5v#OAEb_#UZ z-L%sYABOSZ>?=?w&xX(vzFojd`e8wmNs|?`rx%tNG=^Gvjj|tl6rvs*sdGMtR;^al z{@?ar?n~b>F{JN=$k#&7*y9}M0v7V+k#C2bc2(XP_C=lU_Yy9Dn;3c^bU>y@nw@i4 zChS8$&)bJiKL%;5h;$Y@bK67TE96N3d(>Je@{>a6Z=uNJg-&}xWObpFDTr(+bbhLE zcR}Pgs+NCQ=sZyn`KGFC^s@iP^M8A}?d81=D;b-6-8bBO-9OxWUBdVL|2#AE z%;n6PGjnF9+kVzvtDkibrUyRuTb=ZPdow+-Bw%$Dyxt$cy2!u&PM>uYpW9N_Q$ZSP zEzibE)3Zk3pJv_Ws{ve*7I-v`Dr(?8)am#53gN-5z*~K-ivzFswSF)V=%>B`FZQ(_ z@&%shYpwAGfS>do1Rg8xf7;i2$Cm?qS6c4-eNh39{HCvUbNczf*ZRvh^tHPD0c^bf zu|EL(o4_#-^tC<<5dLMam=8bh?H%~_e%9l?1K2TrbML?n`&qB`4qUUJ^-slr(7PXW z-pB}CwV$;s<48FBRUb0#cYR>wwmxTpprfDqZ&^WH$K%APw_0%%%M++|9;$Gy!2XGkIGtp7C4Y&-~O0+-+L$?ao-3YQ2m=>ToFcb5| zfrGeyfyMm>!w*{2lXg9u23&^gFGb zo*!8fRdjagW|nBIUc#G1Ra|q4WhheO8AL&1>IoUtlR!ZYYa%Tbkog{R8t* z)TcDOX_T6%N&hgTHxPs_&BnxZP23o2g68HdTA!XV_y8JZc%wh~7^1T3*OJSvP(Ka7 zp@~~pxgyW-x<#6kS#up}ZUcQbYX*r1wTAxffDctfWYw>SN&_G~%hf6>5KJaL_$pRG zcS_(VtP<8L%9qV#I^30M5}T9Nuf^{w{9b2o&|%VqrcpW%NA{R}v2%mp_&eIwGPYhxA)@i?FMyIWzr+C_g`F_-xZ_jn&u=}EUAjD};7pgTq4&^DuKFuE zNX*C>O5Ly-=CffFWA#Gc{hYcO4&P;UcWQ=B?Z!MtjD38dJPW}e`&}`%zn|+g)Z_w8 z^q$dHMaE8glU#hYlaV9GMQOdd7+LopjaMcya4j{@$d@5BwP^RM{~xY96HSVlv@|LC z|7<$b{rvx*FZ5=hZ&p3?Syv9IpUe$r3PR$YX^MnhGe-1SmsGa=gfbPfDKo}lH|BV_ z?_OHpf|>3=3+fbfx1j3 zgXm>(3tExu@p4!J9K}my4PGYm@N#MIik3&OG?zu#3i74#Rn(iVNPtKS3O} zBMw^-hxLd<1;UIX%o>E5hcMri_#fL3?oPmY3eHlT7vOBbc{xrr?D1l&`v~bpJDJTU zEipdQe_-Hy*66?)>BVq&LEqUHZQ|szpW+Xjwvb=2DRF1HwPKgQzlzHq!bJYjdob@* zmn1!nZO|)Fda%pvc6XZ{7VlDrblr~Lh%H#1Y&|*vDv*v*a5bmLDc z2GJgMp9JA%2;AVMd_7*+EARpz#XC$5Isx*~Dd0QOxXB2?4Sm|puy=Xku!+hm(%I|;=ty5q z!~Y3#q-_n#dLHadNY|rPyvfEr=}?`KGLQ7Ghg4pW-dm8~>wznfo>8QC4bnRgW!y)r z-0>IzjeU*8N&BD-qTa9n)$aZ$*FSWx;M@)yQ`YyAZ+`p!3c}4^-RFLKywE{iadgo2 zVtsAK^>LijaCYK+ALj~v9fErDY2YBP8*%OgrqyG@Y3R?;S6Ui_)>~6cWB@-3+<_~t z?64h}u7AgwiE|syGtp-`6jz#4P4j-KFO;sY;Usr7jdnNA)xgwQTa1(3(R9GsI0r&T zQ}!0&ECr_Nb#a{az%&)^W}GX4Y1-O7I57}v(G;^aIG+Zl>09Wdx84P&sZcbWOp`&W zZ~Qo%^vI)WD!;%v4Vb1h48T3w0ZgC2{|M(MVERsGhyFuOS_Ie9`kJrBm@4>QvlMcPe7eoTd5_3!uD%97N)mVO1l&geKOq zKp#K^s}H%C*o-ACt%)yvPTfI|)i0H za9WTC-K!Mo`BNkDMVOSoJ6ejlx@wK0a$49)^>NT=YCW&xbsQ~IWYoL=D&N(Zc$n{I zsBeIyX0o;$>qBA9pj6!@uAD|*d*jC~|Sr{k@5Crtw_wcRc+^2bTM+ae;Q9HSq|byG^|B)$ulY ztvk^FZDpOtEdD2!b=lpwqIz~Q(gaU<*CBEYsEpD&PK88$r;M<;pH$scG7&psl$WbG5pF=@H4L@T05_}n1W7v?8*P6jvOS7pV2{MXLQgQ6dg@Lbx~taglOD}4jOZ! zgPvt{(3qaOqFGD_jf>GiV`6mBco-ct7Dfk+gV8}_V9Ac}dNpe_ zi}C*vg_hv|Zxrgl|N9jB9sWP6(Ea#-heB)dpQWcE-fI*`Pj2?P42U%RRx8jth3I=Y zMzq&4qfddT4)x;`FK#9HtzJk!YB%_;1Av}Th*plPHcc`H0g7B@9w&fZi_W1@N_W2edwgum7Xj|}AhPH)v9Ap<8f!IZ} z--Jf3h)v3Zp9x2kyE*-+tw8DOw`k|$^$O8@(US^|2U@4lTtSZlv4779_kkeVk@(Nb z#UViKwocHsf}RCpU;ZK7v1ntki*tcE{b=eBqeem30zIX|co2wMa(?S2puZ?Y(=wh> z=pCR=g+2vhUub{fzbbAB5KH^?F{wu1Z!$+;Y(A*;Mu~K+NQ*>TDbhJ2Z4&8^Mfx+5 z-X_vVMf!wD|02>Zk$xo7FGSiOuS}fNhXb+A#{jX--xp~_q-7#)7U>d^c8K&4v~sv? z91p~0BOi#%#-$?d5b4b#Jq0ggoc2XPIV$}Y197g#1-%5sHXnpnIF^GQa|ck);kr5 z{VNAz|1JVz|C&Yb5}?Oa7=Hv}pC1EapEro!c0q^Y0r8x2ah#wjK+h{~7SI-jZU%Zm zp*w*%B{u=RsJQ2WUQ+09KTFd48$#kcY)ZK z6VX~@X)X{;OMzG#7iot`?-psdNOy`fbFgtc5r};*17e@+Mfz)z{z0VcMfw)dhbkUB zMQ@kr^*`K%F<8(nAP((fAP#M*NPi8){;dMKRQbFbi1oGraeQADbOKt%A1S@5Kp!hK z7l_mJJ|NEhKLN3SPXMuhJApU{vxgW|B&Y$1OUVKt4)-#k$5j|t0X?D6bwHmebdyLQ z2l|)do&@4>p9SJ@{|@x2lD-Ypsn7>NpDA>0(Aa!45WD>q5WC$B#5V5~lyjuvCIhj} zX9IOw)E>GJ=y8Q+0kO?dAhvn2NPhvuHvblg!~Fvghx<4X+q@Boef}#D+uU-LvH4OU zcDoFS-L3*+n>P#cA8okdKx}h95c_-@5Zin@5Zhb<#5PYC>E%Fda}0>X{V@=S`wJkp z`8Po9^F2Upb9s)j`2rwzTMNW)JAl@yR9huzyPyM(F*Y9p#6BMZ#5Nxb^n`Mo2gEjy z6=@|9+gu04;a&{H;a(2JHvbTaef|*;+dS%6WAmv%?6w$)-8KQS%^iZ)3wj@Dy|U_4 zAolqiAhx;JamMEUKy341AeMd~h;1$b;&9Ib;&3a0*yh~kX!+x*j^2K@$zrGEf= zP}#Chq)&@h;)%iuN3LkBE3VTe-PvsQ)m0eXGzApf43V4yaS15kTA$JO_xMU^9XEDbxtW&$ml}*uNhG{Z+YL3G|gh z_XB;c&|08x6#5I$ZiQX|;#@fPB;(5zAey4&w-y3%DY+6TO>rxLI+fdBi1bb%4&zbb z{tT3^Ts#NFE?yC|L-ald@+-YBMSAFPbX+TLED*ab0^-z|4fKq%pb_Xjg%$(7uTUI_ zExied)AaX1eU$VCLES(z6z3mdawZ3exniK_l=N&t%|P7FSqij8Nmm2$UAt9KMy`o@ zHW1rP8+Nf?i=f*Ctp-}7{96aaC1*1b-|_DQ@tyoBP^Z$fLWau(;=8*UsFzB$7!c>` z1A-m{vXu1Hkw!}C9#{Tl3hFOtewvY9DrlLYc0tz*x>-=bZ`|%L=wLyI3pz&7NrJ}r zHg0L55Vmh(hC$_m&KLAZUn5;7=qW+Z3;LU&e+cRp^s%5X1--wY@%d9h-w5iJX`}}T zdVhbzeJbeo1I+tnzbqpiB}4mAGt7L+NdpP)ko9VRF!XsDo*1dS9l@L&^0P|#38xq=D=g#|?fl?j?A zsO=Er^KwC_4lrD?ph<#0#+w6|wJ!yw<2``6{RAB(=rBR;XzA}%`F1@JySQ1<*McrU z3!bHa5_C9P+{|4n=%m99H(JoCg5DGKFF{`mx)kkV_HR(opd$qxFDN8vjG#h6C4$Zp zbgrOkL3M&YKhlKeJIbIwg8B&>BGI1syNwA++H*P1gu|QqZ%4UKaF*pe{il3i@1-?^xq=A3;Aw>x)CXRnTt* z{Xx(}g4PInQqZ%4UKaF*pe{jYo?t>dM^L4p*@7AcEfjRQpdSkQk)Uf%G(O)T=oUf0 z7W8{TyU-emTh#Kf&=z2nA?S>ehMOYjJV7%AT_mVk&?SPd6m+$qp9uPypxXr9Dd=87 z4+}yevF^c{ZdC}nUC<|jhT^%(dNqRR3k2qJ(+r9Vx{ZKR6@Z5Kpq1+k@@1qIPCW3EaN z63uGCnNB4^BRH@YDGrZX&EesvQGb!5^41)xQ;mWm%@J;>AQU?7bFOfCf(k@BR=BXB zB9TUfD-~2GQYsr9qiKSsi?m9(8bNbJS}$Capr}Y&g;VMDs4$Esg3jmm`Sk1C|aGE>}>V zNDG7;D<~||BH%vtdHA;s+v#N5F^4=b)e{&SrO zV4?cdH6f!6{Jvaqcm(MFoW6q4u+$tH6dK`SrF#fY6Rud$R6)~4Z;o({f+);Oar&*R z@PDB~|0UdQf_^JfiVeGXLJ-~E?Dh>o9|{7nmf+-?pAp4(nd0zINqs6!{)AtC`X*PW z-vFS;6gLF_IVFbzbt*0w|M@Mt0Enew;UdD73wOStnIfGF)QQt?Ef91W5c^E&!aiRk z+zrCrDjcN{yZD1hsWf!r^sBdiMwC`ua;W}$P)T3Le=a$ceq7eNfH>TbfI4ydRlgE* z)EmNFUm)fV6pm(_GIxS-BZV6;+(hB1E@A(u24T0g!p#$IfpC`z_e0_EHJElwcRc$? z_c{AVE1NKfl}ncD)yY4s`)r_~!koK{_;_o3*0E_(Fc2=1;%X2_fw*1yB!fhAsQ$h6A3+rVAvD+Ns z@&%0-bT$y%cOej$_F2L;3A#k2R|2um)VAf&ZWOdqq;~?b&kq3Ml^@o3iryyC+brBx z;obz|6nY1UQ~VG0q|*S1Ef_A+0wA_NEP7{%bc%520kO|B zgsT_5sBo7Fca?DTy)UQ1jl$g~+?~SRFWjTTZ4mAm;a(K(bwO{5bf<8;gtPEQz!qc( z$_CZF??gQa=31^|f!Ex&Y#P-qmX3QNb+)=^}6ON|P@DpMz(1RA$O@%=G zgeVccvqbM)(YsLeW&!b2r~!z>T_D_LKpe(ZK>QSn192GFir&wG*zN5=oC|jYag6Q< zqE;xDxf8t&BBl3p&aKx(?`B%SuH4-CQ6^GG{g0>6F z>t&>K1R<$Z{~EWmsi!TSioMmYP^L(;1@#vxHWg37WAk{JB3>>Xp=~v7H+ekEh612+^d4NiFCVg zI|RKe(w)M6B50RLzY>mW9!^s~5a&^baG8R#McQ9Dy1RAx6KPPm96>`xI!w4+L3tuA z5N@oXutW3K6DhqPF;^vsY9x;D9O3E(HHkDTT&tkPB5f0Hsi5T| zT_IeDpzB16!AM=V9|zQl({GKyf3C*|3zrGRwF-cB5KgWw7-ir$^?;;X=I{hjn_Sx;i3& zNa;Re>D@qV0p$gAZd-QvGS{AZtQfmkmp z9L1{>r{B6+xL*nS9T3~MRJd#)JMB-zFSd^n*+)Ko+qAC|{}_>fw<-?*EUIIC>S^#> zg@~hm3g+%oi0r#lA^dZ=pt!K!?-e3FDjz;;ApW1E5QRp0;#0GJD6Lq^D2U&Th6>6R zR3IoUC?cp#&@@3+g60Tn64WZFP0(^d9fF3>s;j4*rQ@63n8W9*ZmNw|&mKOri9C~o z*1)C1X9d+)DE!O)zXdu$qoYLh)F#`NE5-Z~OqGk-s(nT?72nlRuML$=KF}yp2fdll z(VIe7=mgF51%pNhjxx>AFJ@>t1&V|ndR*&J{gCdv5&sXw$p^c^U7>Z31)c5-(tn(M z81$;vIY2_+1;!m#7DWh0Kb+~lJpA|5Pj#4h6^o9E*L*NRq=9X72bdhVvcp;hhUQV( zI!}XXcImtaCX4_{hpq0+;Ct2f=SH+d%b;iLJOk!^mp^?_X;s0ct#d7yAS|@~If^n2 zr>*k_ero`_|*XH#J@t9g`aU_D5J?$!AWp)4+rQ?a-UR(4rl-&V9t- z7=Sa~M|U_()`v;?w?)VJd@wyea2$#=-FGkkYjc2%s}j*Mt`>r!IdOLA*Wee;%C;@M z)1$Kn49%dkU2O%^;c`U_chIVow$2f7L36llpC^H#)hcZrngz1Wr9x>8Ux=W|dqjNPFS|8JP^*9*HeB0;G!2}06 zb&kVLbGl3CJTPiKO(_XW!OU^#+y^Eb!vuC%uY;kP>ULNMASIeyIt5@>xO8TN+3eD} z4h+p~xBb}whUO^RVeJI7%B3^pAfCTy>x>0MGvRH2E(D|2_mp@o21D;cw$3lW(7KJp}4VVE~c%M4`!%K=NvFiL8nd>%u1Ke4Pa>fP}`q-!O#qRJFMry(ELtY z=R+_wGvC(fkJ6NVtW$@+ddfg;W9ys+hE^LQf4GjK`66vDohFnxn(J%pj6`Xo8UD6E zpVN(w<8Yj*>Xy8LN(DOR&aDGOtDV}hh=W<_^7&pcvt$dA88$A5d1lw zL~d);c7hZ(!2t?=T(>7{P;}A9hnH7 zF#g+yn+WF6LjVUJhtQ$tfJr$!rOwhi^lVA@eTx4mya`98)}aSvx{qS#JsPx*3MC;d z(jGoD+Ssg9kseyrkmc z8wml;BHDG_t#zoBru%~UZ`)(i@E=+SRTXrSr{STfW$B=lOZSm2UVkdI4l06_{#>JV z)E(g)n$(|lT8FYfl|8$(4qeiH!;<=Q61_;`pi3%$W@sH$$k0h1uUoXvkRJSbMe9(E z(tQ)~-+TO1>!2dlck!2+LG`Pdp;R^E2;$`Y`JQHu6sA-&WG(B=(9F@ov}%Ux7S{Qd zW~e4%<~hw!Xv}m8V|218Vf4W|1;UW4%JUi)E;0(@Pqj;j#6R#bcet3!^J?nL78s9= zJ*!l68+3I25_Ap;~nEsTR>M&sq_b`PX=3Ecc=wW{7VSejj)_a(39%i?P84}bc zOFDng!(8NH?)EURdYG>~%%N1=)M3(RqKBdRU~ZkuJ`9CwQ1*4^!n~ zF7q(Ad6-Qe=4}r{bIaWE8tP%nJ+m%ICqdH7#9OhwYE}L5?>S3<- zFn4&Empsfz9;P2v-s&*+oaAAqd6=ah<|Yrb-owxr((bVKr^kyrOz6jZm=X`O$iuAm zFxx%MZWnVXny0F*nNxY5S=lD9w5}yu;#k?HIKKuxQZwfiFR-|+xVOrx(YUwD)Z!i9 z60L5I&TrD;*gus|_D`idzoEWvZf*S{qip|XZTmN=lNsgFyr$~9W-Qy2kClH)>t@(% z_vAVk?n~Of1HaWV=HnD~;;p%1~)2Z*J|P@r?}&YMWc? z8XH=QlO%w0Y8MMTM-o#PCCwJ@DZ7%JIDBSfeN8eORGn{w#Dv4dqsr*Vfn0 zjE2xQD9^7fhH`yvOG^oqi_5DORUA6Ga#CeoLrZOQv~qq!-No~3E76V^Ul|Hj7S`7{ z&a7-`tf|G?c<}CIV@4$kZgVwyShTMrM~P%6ic8cjpE40)PpPOJUf0rGJv^84@qbyA zB&*!_Q7E^rWn%53v#aatYKo^w116L^Zc()MY~)L0v%0hP-IWCR?@h=86b)o_OKou( zvfs{RDiSK||6^IYx0d{e5{B-XnT<`0N=j$sVi8I2-I5}`$|IE|k^5QQT$MAB!c!`8 z|8qCUztw!sg2ac}Ubk=^Pk^2u7It&m;lww4nOvse5~@)QZBRF=|| z&@vc#GJ8L@p=EwkQ)6?qwx+DPu?baZU2O~9=?U#Y&!c@0siB(0j#%}a5Z}51z4swd zBiNy>Q@KdD9uiWA=u|0}7&GHjiU2^T@~L3voZ6XlQN40{o43LwW~R^-j}srx`OUQr zHK`hHA{6Hdu^-)3-HZxT7lMSEes6VCd7jr?TV0bhFSI0;L$ub)P%86IN29g4K1m|E z6;gT=+JiSIx70?xHytHLZY8g>nw^|NjN=drwjn` zsi=!0(e_k}6eQP7>Di;-sg+ZCPu5JRZD`)Rv`(U#%3~^D=Tck!q9ldF7N&Bpa#pq1leu?DQ+Yr^6k*)g zoo0JgL+q_n2|BSd8y!`pS5@DsWGNlzqhpUsXj0cAOzC`dwJL>4T^m_S$0yI!1udy_ zTbj~?(X&-qO6uIm#Ids-ZTc3ZHZeVrDo*S^xNYRx3 zziP~XE_o7Kq~koVpUE23l++WxMT7d^lBWOG7;r`;ZBskiwu#M7M>nLS@kWiwy>^sX zWrT8@?1paATg$B>B`Bfg6B>m&(bHxQX=V{@OxEYL7p`EvrXDnVphksb|5TmO_D`j257V%+{hPJz-(s}ssFH3FQ@tj1Tk+eB^nCA|GYQQU zx1Qge>{m!ndhOv2&Eaw%!%T?Z-Wke{_BAAWsoK|w6)8taL)yDaBYA*(>6UL>?vHo$ z8tb=2suCP*&v~nq?ePe;YlwHy1B|WX48|TDak94VUIcD?u}9^~*{!XW=s##_Y(QsW zbWvqX?HuYTMQqWDTRF3}wR%R~f)ILOD`(bMx3pA77d6$Q*LGH;P7|lrNVsUJOQvXQ z4rdQ!C^W0Nao%{nAxhcAna)P8zDLK0&~(Kc95tV*rBq2{%XRgk(UmlMVRvHDGjL90 z<6LwXk}~YBuEe`^<;?2n%sKk^jM~|C4KAj+Hae%daiLW?wP9f$w5Qaz%%4~5Y^o#k z@P4WuH|BmpuH>Jt23KHQ3Q1yT1H4JnWuab66I6A)6Ij_QCLu^Wm5_YuO}7HsLpdX3 zN?N6!-kWqnI%1+s;6x6oM0P%QmC!vF3b%;llyZuTE5y2nJ%%Vr<}9S6RjJ{8 zHj#JAN1>FtN`ajv-q)-ib7(X=^b-4iv}d&!7bAaDM`@xfs?9ld( z#7-|T=!`_3c~Ko@gYmv*>hj_-DZjq9VRn>0pmLAm}<`X25C%8CJT+8Z;#!mzBy<9I}NaFHb)Y9^8jU@ z9}ZGGI!&o-#T}90-g85RMw+L%`iN-H2Duv&A!mSz$>x+f)6E#+a$JBxe6;WI-G|5M zWNDet?E<&5E<|>2IqzmyXrp3N@`H{els_gvFEnyg zekd5sRXqO><>uz+Lo>f1r1h)%)?CGt8~bCL#{~6Vr=N%I^jDsA>GWd;LmGgd8aW&= zXq8ntXZ4U?vLkGjbvkGEB-0_Tjr7#}m#y(GAkChAnx@3y@Zk(wxnX|SQk43a0l}u; z*iTC9jWc?VSw5slvs7qJ7v}-{!XxsWjHPBFZ-d@NdV&@?2_n8DLStNt^r3Pt=FU8< z^^AQZMvZpq(R>!#vV6VPOUG}D$B5A(mtGLRX#H2`5zdBv1*4plibost-qik4)+oJD z$Q5u9d*)j_yjXGclLM@`j&X*v#Dl@r9h!yDg+$S9>p>-4ED4KXDuR_5Oj z?qx+bhADE0-FV(UH!=P6KEw7du(79lZEs<>w$0pc8MIn{RzK&Ie#xN3m}lC$|B`oIK%Zj zR_6X44`({$XJxcq60qXqGNb8BI)jPnLH@8N16E4 zj+H2uk(k_Ds{HZ&6(5(;)*680r{*7^4cBUH?v7fQQ^(%K6d7M2%?gb4<@y}^GP`&q z@0D)#8kd&qtK#R3(joUfolZ9nJP3;cX3X&CrdOpk`KWTmfqkz_X%_Y|0nFUb4Roei z1qTC_2Ue$9=MMmC4XjGD+I$3W_64xm)~|fW18?yKR;F36`bhaRUjPeU?)H%v5-)8( zg>fYP!;y>g0-S!FRXFK6N_FT?oHX~8@`@sMI8K`W7sRz1XAUr}z4J0o%D-*6zKyd0 zcqgv3R_It@3lE$=IKzP1xDLXJ>ck4-IuvIFI2YFfoTb2F;&4(@l;JuJX9aK-t{2m9 z;5J;Bwi1@bbe#>ZdzbZ&>fbLDgJ;nuV5Y6+gKtm{sYYj?&9`5PeI4tC`{~+Ws z9cS>x-hfTs4?JIxy*?2jPlv9)-66&p=2=( z2-vD@pz(^k7Kr0P4HQn@a|O}5cO#VEFhO~OXh#E<76~d9R3T_NeE1$t7=q(yg&@=j zWtBD_gEUh(Dt)X+RV1Vu&KD%@g0Z6aMN+;TxHMA{+Tb%Jgb=}p3|6m+{t z?-1^8L90Z1zi_JsJu1>p;noYc;tJ{ybh_dO3r7ik*h!uz02|HTSqHI{xM3r&J|B-aV>Rq3tZ6QvoIGD@l1BC)+EI_-4~?) zIQcMWtNyM0QTQYLr`X#}Cj76`47(c#hVsMKsU#b4+6=8U9&|CcdYDJR&{N-b^_GX} zhx&M%OJ^h)Y7^M5XdNR9r_Ef6U)e6^cKiyun7`szu8a8yzrrqNAR=7mV#a`}axpW( zw7Hlcg6VKEtHEq`F>iyRR)uXdnu+S5)x#jbK{av}PFtrOzuH_3ts6uKb&#a{)T@B{ zP5;;z%lett;q^VTA%Q9SARYCYi~fy-g+J7$8Lk<=ID1^k_1>+c;_^cMaQ3v2S?NBy z$0=0%aQ3oLqXuh0^D9@2hU z>rg0(>uHdjjxMc3{aUHk!T3b$&|S&7u)l7%Q4TV5tY#>`nEAeDEGwv)vxOm@Jh8Wo}or?yZ|S$HQFiVy?k2RThUQe9q$do%p#+ zlJAb3?Ol7moc(b?a=ATaE{R-ESafvc>%lEGyln@P+!K2Q&oK^?&|&P9c)!ipp`{!z z8jf$^qde2gYh%wtcuA*KdOi6zp98>+?v+mcRlbgy>LN#f{a%eA=~}DM((IRsQ!rYLZNG-h=MpZJoCrL z7|vveQ|hgHoKiEol*C(m5HMlP%`ufTp$2vOTtJ^#ImYFagb*4@I;D*bv*|2uMY(f- z4prS$OCJbOyL))!jEhFd*j8Thv8|E0Bl97`L1SCgrpMZpSdZ>{g}h^1O<7p6AI-1+ zM=Ax2-mz$`$Jx?iiT8haAI7#4$Cx_cT@jW$s~^h#(xW_>jWMP?_gGI5{1)ilqV=dv z6wb!jQNoxIwPZel-W^(xT9ir;5R;-_8QcKcr)X4?n833i&WIp(g&X~J17gtQFD0=Tb}q4eCGo{Mxh1ipoZOvD zM)>x?Yh9rZ8moIgAgpOjG&FV2oESu>Cn3NStsr16=;>4g^*UZ?`HhruH8%8b(X zg&8GdUXKPbCKidk9*G|oiJzVwX`h_EJKKy&K|cQ@6 z!X3Ip0gSei5h{EWzi+3{={s}}>Dz<++>Chovd-wBB|CgecKH^LiL_62*hTSM_uGb4I)u%vshs|5Ri?f`sK`A{o&UDj^C{ z7)-PvjJ+I*BdM0G&1QquINi|mFI+dP!;Fvc*q!2d>=+(IVih?N9Yy$}6Gss!xKBjl z5JzB1_mA!JDfa^O=?;I2EYp6>&1i4x6EC)6pCN0H)mgh=qnqi7;s$K14dns5F&&%mP9-5K%v$NTm zQ8Cx{#l3xudHOn6U+1gqx~>WO z_vN@s{opEXxJ3fg0EonV_}t;42w+KUOKEIlQS2`&Z#II#7;pO=*uAba#`jEVd&|I5 z^J#-g+708wR%z@_=tN={a>j<2z84)DiBG0D+f|}{2g}ndYe*R7aRD+yeRuJNv!E^6 zFqA+0&}D@STZh{he5tUZ>u0c(t~7p0*Q@pQC%D?>Tk0RzhfMe~>8~pK917VITZam? zeJ+&_{OF3MD^Y3t%zOR!Z4|tN86OIgsw6~H$rf|Y6+@rbzb7lY~Jwiq;t-jva(Dl9!kM3~__bm$7P7FLJ z9jz0G4XA>2X?USD_Jqq4+%IH_9&K;`fn8fTEh&w?1D%rC^c*e=CGpZ6IDCg16UIVn zzo>^OeMfQ-YO+Y|i7rcBH+JoZE0v3XgMG>>HjqlKiru7m4eZ1H*<)MmP-tYEHke9f ziUTUtFv>5ryBg8%dTkHwuGbvxu6vM{T{$}Hc{=Lf*VhTScDTP8i=T@`^hK8aEjmI< z9e{3Uv`;iO>dTzQDs^@JsEUOuj29{YQGe(wZRM1_ehAYu+SCDfnBp#xN+3QP=~a|7 zloPC88n5##ZoR&zTCaG@>n~jC zC2jji>?Ko)>UdsGw@SP>*COZOhr1Rz$5D%%$*PC*KU1%Q(ZT7t<~2*<7(%>vpsUfyEmf3p!NuTkjEb>F4@(0 z;h~W$)|14}J~S)1oT2W<(;F3elc^)XsNo^}F4T32`3Tf}To-#;RrzaGx=~XKk$=T* z7@~QKrd+N=Ds9GCS1~&c{@EeCTrP?Ft!waghS6s z0d9}xlodXNxLcEAJ5V*5M;f;cO4T=&%F9W3HB)81mCE|0_-wqVO~~C@xMWxk74=EW zwnxKgbB!&DM|035RMz9hh>Y184Wj-08QKGp_=Id^oqGS$*)=AbGj#qN@*IgT&1r)v zXh*>F0u`*(zjq3Pb=n|mo7!?udnnqm;Di4 zlIIWZ`JGFK`sSBL;&u2c_`T?OYAmXkmc4yXL7wQxklfe$H)1S6=Kh14(I@Gsy z<2>KiWt^UNv1P`wmLZ|&Nct>SZxw%45h$Y9ZOWcgO5%7Bm7oBieg0ZB$F#XpzH6b5 zmYj)wt}6t*aO*k&O(E0xH8-C(CLJAv`u4K=j_j2isPZ?Zm!)-*&G?3_&*Zd)R=ZCI z<*aK-fP>1S=QQ6hCSIXC=zt9CfRTN3`&4B#^)Bnx>EE2T4K#((w>n^1*Z9(Yqx?&B zo9g%ey{-M{q`AIr^f|wKr1(tn#OKh1n=R{VU*IF3b-nL!%le})@P*G><2!_G8I;|} z%Dyr)cfYE>O?}ETI(u#QZ%f-r5@l!gVX$*V;3dB`Iq)05bsnMr@(lre)EBr1+r;|@ z0>9}CJm|OHQFwV;;Bh|&{oz3AUN_1zx8(s7y+ckNt+g?e_xBaC)WBIwx?6 z3X8rC^_Jgk+ADfQ;5_S;z(rP3V1_j)v$vHwE+e;hRj;N%nZGk_Gr3l2GJy6x9TQmU zvx)=Q&~S19-_p%E3bG#D9L{b&BR3zAo44Tx-fZxt{hf+{HOP^V^c!U)^YB2Wb!^}q z*mWkSQFGEX>U;Eg=+E<|JxCr6>g~6Bk4(=^tK#ij$e$zO{sj0n3Vx+XtD_EvF}Z>N z@>$`)<34Lr0G?eGxW{L;1W-g52k4n<4LYc=b&&5MD_LnlI7NeJQJD^GNVk6OI|iSF z`T{SeTVMME&!k(|qy@11)az+!kEL5zr4zm;o%kElN#~Yyg#Ms{6!(7g4@VH^P@Ggq za&b~ea0bpWPI`HwzS}aK^um>mvkK>BIMK~*wc)%4=U|*GaXyAK2WKbFzu+8(ld|-3 zM2!4y!}WJKrvb0R^);MTz}s;B2Im}L3pMi*IGX^2xZZ=a6?he{C!-sq4LFP|Vq{$h zybaekVf;$qow%OUn|CL!!u4!Kgc^2LxW0pv_HNmU>x@3=cLi?3H4`60ybGL-YZf}X zDa>qK7vh`_+=lD-kqC={!?^wiCw<|w3fG0`XkSk{xX!{Div?Tc{Y2{Z#F{?wcZZ{Y z>GMeJ;~nq_uaTy5)t5nPlE32@IE??SJKK;L76s62V9sy-Onal z!?yi%?bhul#RYNrz~!;A$s`TwB)HxSH_2M~u3#u^w%cwjuyv61)YjF$uuXeTg`S$9 zCOkVOU$%3UlifBhF_GD^o!F{HFvvo|+K$4xg$iv31~gExX``YV+|GF@@V8NMQFWPr zKhT3{K9I5XGWLVh!;~)ihrm z;p3VDb&vlDxMO>uvn541YsH=ndaj))HYKtBO40SRJqWJ?dQsS11BZF=z@q~jx4^db zNp$Tv`j1fI?v<`ekKsxm;hAt}*tQ+6WRwp`qb=}rJ>p-1_(x$!4eZE+&2QTJ2Pyr8 zd~*1AjFMCO^_V6q{Z3W7luw5ud<+I|83=a+5I&j~(Ss2_4LBZze8K=A4&+nDa75!Y zxTC|=^YFof-v&$i@jsDAeiw zCg8oL3GdRMMhoz6t^6o$pQU>{+auZNu|s=Yd8;}^^lgY2mL(Gg`rvNhJ}g@cA%ZW@(yrT^jP762ly{cPt%d-m-U9sbVEZ4d6PAK7A9T zrjfIn=p^ckU@rkZU+JLdDIMSSe2tk(v_wp<59-OzsPUXiW? zx>RwW0<|eL0G0X`3XKP1UuFVbskpf!T>!L1ao33S29e$-())nemrN9!rOHK65Pk2t zSaB19*uUjK%M{lE#J1c9bd}820%Biw0C5g}E!+X9v^hU6 z2AZw>yBcVrLcajw9J~vNQ}TWws!RRWMj*Td0_~T<^{U@G6o|{!Q9yAeod+~qp*A4) z`R71fO6~&Ua=IFbOWl`1>|#GWY}iE*h;11L#I}qEiYcEj2Vxi31F?%cf!M_ZK)1`zu<189YEF&BvaivqEKi-Fkf1|W{d8$g`S9|CbY ze*?tnd>9_>E0ljZKB-ybjfjf>X>9oE}$M+-Vp&?rHt z2pTVFqM&j?JAv5d@8J$$`^E`6L(mjKFA92H&|88gql~jJv>Pa+3kB^2;(K+Ma5UM0 z^)du~Ea*!?=_s+Rx1XTNK%7T2g_|p=MbPI!oX)49B(g7YAa;ALa6cFHOF*i=c5R5$yI1K~n^sCuoKs7^?O@^{W}LY+oxlMr}ZiIQ>?&aM?ihIMZ>e zS9>577YoG*2pMBdRtQFEpDTdaKid~71I%3|=o%mnjna;#?$F404vi80pQ5-T{Aa6H z33^u$wPsmLgB^@$cU?wgI-@*6=q}V;hal>&&~63M93SlqLW|&J`xudZXDcpKq!c5T z_7^ENYnh|x7^9#_bA%fzXqZTIh07CEAkwkIg#}Ssu~ifjhgK@6Or(@=ES)B3x=5>p zs}VFuq?9J?wn!(~NS6w?T+j-Ub_jQ!pc_SclW;2q-7eBQgu7eNDv{nV z+-gCOinLR>^@28u^l9NX3)&*mt-`%3Xq!m43%5hiyCU5w+$Vx|iS#Ss=rtjNUnqY- zoWC^liMdQc^v1{1{=y9uG+3lT;c^5G73nbHas}myv_Lp|r(_GlA}tawBB)fPWx`bm znkG^|V#qZ^CJ@&ahXC=j@d)9L6>hk21;ULNG*M8w=$$WItsn}C!&oGUeltfk7o!`1 z;yC@P7nLpjHGZ?DzZdBP!gT_%+f5>+GQ@7Fl6 z?B5U|_K)(CIm$uiP61-KpwU3=_EaFYpjfyZxU0vRuAZihmI_Dp3v=59(Y?wXL5y9;+4rKZU3*z|Z9A3T28kTTp)>mJSqdu%MtwDQ@iFP(i~)nk!tMAiCe! z=dr?t1r>>u>Ie3@R8W~nD}>~^`J z6(a2r?m9s?iu8Lx{C0AsAbJ}hEBw|?_)lT`t*7vx>Jz`}ljD;3F@9g7xG(XaIjY-# zpt${kbcqGxlGq;-ifKAd%Q{pczn~1DD#hWSH4i7xD5q3{7dUM0BE^x5I)$?FpM3JE zwO7zI)^6vDG$K+)N#~%OnJ~~b#}z2Cbdc}qKI$PrH-bL2$ht#xFqf1~H7as_QtQw& zAl(|!>7 zDRVK~!Bn}J-C){W%uz^~l`iJ{U^-pQ959<*%um74kqJBDB@T=it1&v;=5N5P@;PHM z3Q51s#Z05jKr+~_7U=BBf*{>Ty^#Bn_v$cdNc~B4WFd6ss1GUV^5<D2XuG-*OrA@JdWdMu(AN0~3>^b-ru%~QA15CMWy8hQ zpzN?p!MOcdLJV#b+h^)Wder5r)1&h$7#gdzU3~)Pb(gDtkh^t`2ScNpwyQEQ`0224 zu}9~ZU}*f)cJ(qCYRTF0>JMMtI%g1rjI~|SxGJ^2Y**9|<<|KxFf^uWyIKo|o?W)9 zkHCa8ojQGC9gQm3I>&*bF<9H5@nC4Q!PcQ6EE=1&b$$$nMj>pSbztbA5|i#5tg!iK za`_#tbCA-ZdX7sh=^34Vx`>@WW~2# z9f5qDr0tFW$VUdGO@&LyH zIMaRfBtDLQx{kqGhjKIB7sh{Y+)K1hKc%Cr0^-A@;R3BQ5Ok^)9j?$i^!#FXw`zv! zC}vh`hRQQDTQx&vl9^qap|Z+MmX17?OlFRiFwUvr||r9;l!JWPj&xy{3@@-WYNm=8S60rW^zhp{=w!<^<} zF7PmI9_HsB<^d1$iii2y!wjT??6R=H!<2iNr5@&I9_Ei8=2Z{#jfXjuZW@<8V?E6I z9_CsP^Sq1s2)`1yT=I^Ns%hU`G4;6J4(rLjHhKzpD*w!$)~VH!?$eUQyQG`Iq|)2R zbp!TjWe?lrcujC9?>U(q%HB0synZL$aK2|X*U}4mgxg-2!L{arM=A@i^c;k!IR?>n z5VXY0UKT!kJr{3iTHnm=3EMd!@#)clEK%Z3 z_`TU>KmrMkbf~AY%#$F=mbLdN<;$)CdoG3ct#2oUw>-PFJmK}cBZAszZk(Od$(IfC zcxvx#;90sy-vyqXTO@7u(j<~q9?#8!Gs(Rcsd$i>*Jkx2y=H!rrI2RmRm|`hbL_HZ zf8JxKwphIvo~Aa4HkEShiQr9SRTCtQM~aF>nFCqRVWxJRv|fRyNjITZS(>nBOv;2w zvCT(f`a!K{+a2k(mtN{*wKq|4Zp4t%UazaYw#)03mRL&6#*`az^_1EPOYDgCv$X>ofi z&YbjrYnd6nIQ-6b zuS*h*y;;C*FIH(oM$!g==4s}Pm^b|%DV(p+-8>zAqhDca2p!a|9Zs_5+|%HvAsQFa zkS~r=I7u&Y&AvAHmxEroIeI8$81yI}iTgrP&-?A@MGMkrG&oGSiTgq=B_X<=uhDu( z;-|7tJqt<52X*`{bq||B4{NI>>>ovX*Cp!FeorT#tbMZmyB&J8J{=utIMv#3q1;i5 z(EozC-k;3BkbA8=(%S;PceQ^QoY4N|yZj4-{{(t{g8(>a+=Rm&Cr*) z#Y`A1t)=z}Qfs5A-|=vPS=-I5-3Fz#!H9S5Hmtn{(VAcvd5E>w%vxCIf?XF}`dsut zwYrzg$-^pBgAK#;)s;&uWT0}+dWZ%jc93V7?1Cxv3YNrn8aL{9H|8C#;}AXJWjPiy zLSO^bPe(|49(t;9Y}egSP#`p};aI)J#4q+t?Dsu1+q`DS5WS`feup!dkp0BUkn<5N-hjo67UzU@_Na}aHWuXs;gwYw z>*R$USZKCx`ds~FiCS;s3p3yFv(1=^6kE5Zdx-Xqrz@&u(8{pLg|hNA_)OO3FYU})MxUpV78Yh( z_FUHT4*XO`n<-l2H7x^YatjfP#CRDE-W1FgA8ePV?vK!OOw;OLTPaou#*yVz*qxUA zQK__K#}6SxKBHgllY`^{L7M<1Sop<37sVs~qPV_)C?esEWu2`Dnlz8Z%d<}$=l6}n zS|2*O*ODRlh5gi&x7`s=XRPWnbG;(a=z2`8=e4ejszEAHRk&jPm9S;j5{$$z zhCffmUQ!W?oj#D9#m^qN?77xTM;Wj;qce3AuXq>hR4ZngDYmo_6Q_(yU96VUq$dE< z?|8)gXvvP9K3GgW9SJ~zBGp?@Q595V$p(|#xZAM0ALUgS(va7o(Ul_BeA=NyQ_jUh z#2qP|vFypL*zJh0F4oz|nDElw(J4xryX@1}^WtR`(U$bG!H&3+_{65cCpHbVD@(qU z3$gAEZIFfvdZQzntp$7^Vj(Q4k1!Q-*{6$sAtr4gU%P)Ka)jronr`UeXty^djW!o- z#1_eGZYX%?zK__T*cx?>sq&4&9p|NN`1grTe&35ojaV-3uGmg08wio?(7A@%`w;tQ z*E6b6wIK-;pHEMyP+*a*-MxVd7=0y2*Q@pQXZm`jzTT;?Mz2}_ei&Eh^M<#_t1{c; zVQ)N>l+GpEu+mpJf>m(JB4gG>13F7esgj~45^atbJbNgt0^=nZVPqs8$N*CudJ?&@ zaXjDK?Gsgkq(?T6r#28GGhVNPv~hd^6R7ttT{m=X$F;+*AN2l}Sk=ki22ici_HQw|A1tHgo9yyx?B4z*+pVNz zuSL%WTr+S@Vy|9GPSqk<*iWr}H3AFqWz!a)xDS21sd}4S;QWaiowLdmJ1n}y_NcZE zg?6+K^-v0x>MN5z-%)rvd{4Mjb-2a)I@W}*>&t0aQ5RJawrhNz9)zkQ!WxF`9qyi! z=r-4l9a_Z9epq5vvR(4vGK&($&rj0G$)S6SYjNeq@tEC-becvhVXd>PCRH7|?nidp zy_)Vr`WBp~I^#k)Y47z1oNS$zLvt;wEHK-u!pBO<a3tpku;SYq|WywU*1l{f|P0jHPTUXib}$0CVBM*foRqPo&?NYd^Tpb@1tzzQ7}X z>n>lNh2?loSm(F?mi7YZ6ni8_`VGbW`M_6x>&(CwTJL9R0PDcK>$esnj;nov?S5;M zZ#HcY7{DGb@1*5f*6-5;D+1Od>6nAr=?}c>xBlX%c+xsF_quF9^kDG809IC+9)Jn$ zzQA96)~&vy$(&^C)*Q4y^p6bO?6al>uE(-J#{wnO%RK(Tnb!9M=UcQJOtSTFjz6#k z^0|o8Opf<$p7pD;j#!NERDA(_tp7X80(JD!SE|$K71ob4h?82H892i@C*dS{8P3OX z(rZ&EPWnO-iDTvBO7FoHz!sV#nK)YkvvH*_^bxH3vh+^iHemXu^h*SEH!yuld>y{5 zd=+pduFDXpy18(r`Ly-$H;n6DI4P@F;d&z8^$`gx7uR=jZUL4@mA*r0H4^>s>XG?; z2N|(v-DDc3b>j}ltb$_hRqt;TCf|>Vack)s!(24T^9FEbo+(Cj|BeDEIR zIZ948BK#=AuR-{Eh^xZ}NmGw z^@_QEAl@9NA6E@$XdNS?E7d3aa!?&W2i^b9!}vpWiu3rc*R%-1^9WAAH5dQSQ0NBy zpQzBS_+P5fAMl^*OTS84*82v(S+5ULl5)py9YSfU5Y5zLJ=(dHIeIKJ`n^bL?iBm- z1`zv#<>Is+&2>6U`8NeKvYKj)>5FU3at?IFwohGdmV_a`drX) z=yap6ef`#HKrE#_QKu=c0_a?YrUS9hb4727pg#)g1UgT-pw-0ASEvhUxm;h~xVx5L>zls8UJs)V8V=IuN&VwL&KXvEFDPPTf<1W+-VH z&`gES2dYtsnj&lq_KUV^7577+Sql9Uh<$koXtv^>1kxn}XpZ6r;I8IyPXuBYc#%B0*OO zIv#1t(vTpUU&5*T3*mkvC=2PrxiA2T-O_p|jA%{?qaA{RNTFh!=_N z3W^~8*hQbO9u)!SWr-;Il>JUMEK>S=7C+G~3QZBHR(w=>;5suQCxdp;q2E?{pCDLnzyFs{Hg!{E{ zzZdQS;T{uigK(RL+X~c-({F9Vf41cvpcch_g#VQ9e(MYTXQ?0ej7}>ccH19_r8IM$ z;^McC6TK0lce3aeie8E6oh5qb3RexpKGVYS9B#94*$9d6^I?J_g60TXDu_xByLejA zyMi*|v-VF=nINdCT8it4eEi}%qClZck&;y`?GMD#fx-W_td7e;n~iNg80pd(vK0P8l$AMoy|81 z&@#u<8u%>C5n_XkNUm=KkyT1Zv9x|e(8bW|PGJ|b08E*SL6?s@dckeFLJxuI1hRdm zcK?B3Y#nMBP@jvf(?5;h25lXBAFy!RI%ne-^~l)FCHNI|G1NmtIc)p$cQEvBWxM(U zzbF>A&Y@&_z^OAD4Alv?&Qvff(XO!l`6)+O&+eo0(hDaaT7>nI`K{IV2USXfKSf|V zP*`lAV_@*p5&H8Uoq@2I-YIQYxnSr`*bZxwN2eAHy@A@UE(JsH%(knafuWu$TjyCY zvs^m+>!?BvvkkL!tle=xPV4Nabf~l;;q_tCr%>x;f=@N;wNmTsuXF~|f9(q+=a)1v z68=!1+6vJj@LkP%b$&fVnUwDP52nXdUGe>F0vVxi!BaG3h^f1)s=fk+7l@;C02QDW0 ztj@lacM7k|J&%<2mVQ%v< z-5$ow>$c14@l>?cVL~tWFijq2g@?J@!#w9<-t{o{)N>Ph5#3lWdzO2c-+Gue9_C{Y zLn~3*J{RMcs(&5(-mA~w9lzCtO~-GUaVTGs=W+k4JtILrCih6hjiX;SiMymy_XqK= zFlkDqjQi8j|YxxN6FG%zx8Y(5_rjWKhoTXgs-k}(7giKO#$Y4IZzs%t4XDOg;FFMJD1 z&cs*Nwbk=H6PqZ)J?V?3i7A=aQoW$oH9J7U*P_%;VM$H${K;ccN~f3%M$sXwCs)s_ zEuMj2q0xoz0yu^y!InoC(RhY^Pb4e#_Gjv1{Jw^e+SJfKnws1gclPZuzTbr>Jw@ri zZ%(pVZIqwHrwlpayM4*6WK++SXQ`&1sq#JwbKyKSOGq<|CSe-3V*-POrDnYL?2PTV z%be8Gp8ESct=ac+NrL3FrzD;Uv!f`*6qRT)roc-4+>S-lN&mOzK+$a5P;O=A%+}WG z8FdRnBY|7$DreSLx3pA7F^9dfu3=WA$~IG_7N8EF+ECZnkn+JJ8sFx@;|WGRBAwGO zMypzS6wJWn3ui?w;Ziv)uA^Iuv|xRzsa}+hNj&1`Z|;owvu4#cm&?RyT~&{s8m+5u z3FT6i8o^oHobW8TXhvDRqo6w{p}=BHR&h23oYK5mbqzHjy36|Y%L&L z)Cva9^iZO_mfG66#q~6=r=YB{r7nt`bLFRw{acnoFJ|6%W40Hdm|HQ+PJ z3=_qP2=>Ew=U+tX3l0qO}&i7XEMTwf8#b%$y0)_V)Jw|9jx%e6!ZtYro$w z?IcGSs~9NMMrA{hW6NNAd>QHR#JZNntxffbdL;A=DOFsKw1+I=?eehB2DXGVOgRW9 zQ4k=QU2P{*B^^@Wz%2@Q4eRY3ljtRtHMF!OkpI$}bS2XiW8mN+ zEm|-=!lW&vBE-GFQUzgZgT@h|QV?+va49sWup0lJNt{z$WBWy|_06snrx>O_pOcuR z%4cl%DqK+8-dI;n4dLc1E0@kmgu``f5Qa@B_$=HP+4gy6C8W%J~)b3h|rvkb3~B(sx+5Od+Q4H zKqal&2>lcG*4>Hmx@R$R@-Pj5f5M+k}jFkV_Bwol8Qt>sep*7bs(hu;4~ zV*v2L%gP_Ad+T-y`HV@5R$Azv=q;pR3(>SYWP~{Ok4O{iMv^i#MQw zJ<4Kb5SME!lXQ`-(!hJ`%He#o?~heIN|SjpeLH(Y@K3n>Dx$`SpNi0MJ6Kb5gQG31 z(S}OwU^Irc-*DlYtZ-m#7} zx@nxE{aX8v7nXMJKMVIL>vgiUDx%ihSH_T(M{w{ z*M=Wn8r!-5=p~U%LcpSN-JzpuAM z9@LP=dSu_F-qRx&3D62+mAW|Bs5>4(4?YDf(^28 zLUKyZW0Yap|L^#eYMox*MHsy8dop=do+H3HN;yrxXTs8aJNF;Abh`P`e=O~B8*kDt z931jlt3EoHT>ItO#5-?&uw%rkkA8*HAo%47D3Cz__fG`Gy5j_G(@~|TNrh_Po-C}! zmDXn}cayhOkeda_SNjHUKuNHQS znT6f2*gDzM@Mw9`-Y(~`UHQ(aQr6Kr1w(M;UVUj_1ecgPq7OR7Vc6T*MGN^QXgSvy z{wu*p%>FsbC{XfYa#8N8zjdor_%az>h3!C;kh-Vj(GJe*5$4?&(#E=*6M!fKpT@fb z?{D6V1<%~}UhvEp-irp$e6=Asw(q^*XGc=@ZU~M+LGxL)o9Vsa70=-J3-1MUM}`#d zip}^9E%W;tf`9032)>+Umru%v4eL0*yAkue$7%roCW<`$+86* z>)`4Cx+)j8_Ah|5C_UYvzhBqitMvC){k;}nc8}Sclzh27`3&le)E!*TYC~5QQQ8bd z3C2_*sygBNV^92Vu02>=`yYT+W&yr)FAvC6ANT@UR-n*V;IUuFpC6dywT~x#u9a+|zEF#{Ol?S{{VXfoVG#%&B zy{4xJ9?Q0hpkvMtd_cHS5x4Z+ltt9vWf6WWD{z0d^+DE=z_?Kv^!3?9C%28l9pv8k zMqhanHnp4^c*t+fM?>xE0P2SofoJ^IjXr{3_Mt4==nHJd?QwJ=-XCBqT|5}r;kQ=7 zCLI5tb*g3c!XiIzJSMr_*@650);rlp0m?=5p~p8gCppgzs3qWRBK_ zl;WKW9Kn~?K+XrI^-B+-U2r*YFTOXx0qcQj&GcLF`hMVj_+ElW-3l@%r3DvN={rn_ zA_cX|UB(P?usQ93CK@4Ayl92CX*VM?-N+e*nO%l^?=1xWr`nH#j>Hp)g}L}T@0Z<- z0K!A}@bcahl0&sN7wO8mN98qJj_<%lp*gsFYe!Iep%v*<5f20HD>)2&dPeg{tqwvm zl|3Qn0aLo78gK#L8vXq@eAnWoV&kWHd+}ZxombJYI1!Q!9-vu~FGuKuloe4QYu5$* z#o9aF-A$W4sbC38v(CrJr;eUz@lU)Dgwi-YE7f27Pe?<`8}vlf-+%nwrj(b?!RuFR z>!&D`6xug{nD$+usfzmx{3YM|t(WkZ&F%)8rf3P|wdo42rd+2`4-mCl{MOfjE>wut zh0Rdtc_23N1`wNg2Z&8%Wtp8Q#{#j5u+S=nb}0~Rrk*{^T`%Zs!lm_JY{#2GY{&b; zr5jh-EbR@UvdC{$30frF>jixqh+V%4h&A^DvF2X@v8(b>E|n;KA)uKG(e95~3QYoH zIb1ia?Y&fJwSqPPU8GDr0mQaF3&ghV1Y$e-fmq+WK$OP(*2h3>FYVE!)}!B|Rbwm{ z5=6H>vybR5SGHq15ZghwbFhh}K&YTY-PuTLZf`n?xX!8jA&IDql3R+)Inu#p3tb}#%4ppC08+RtROPSX36Eu zEfz#&G;=2lEh4B~xRj>YY+O*4aH*zeE|pD;sFr8VH9}h`XpwN6gw`r3A>3s`TOnwr zaJz)IR?tntT_?2L1l=jzyM?x1(7nRFPiPMa+8|s%5U0rzK;?LOl|HA~6NNSwi1SB* zAPR9dQ6V(SIV^XHpwEk3gV34xlcRC0MjJ6=!-h`ISfqcCN&ALs zqHt#JWT8a_Q4BB_z>47ImEGqmgg;hPXw;VB)!w9u<)~f5G)nEf0-R9@zZsEB8Iju< zk*gSat_5$Ebw=YMsGbk?*Joj67|IZ@=R{3cGD=`3C?O!5(hdr_!=}(a|A>o%lMz(S zW6S&=6naMC<-1K#1nLJBrFwEu@>T)aralA8N*84sDD>ECl&=D%7ZlqR^$iYp$sA0R znGQ>--(j2j0w^ID z`Y*Oj0CndAm&_zks9$5ttOSMfkFDpqG#RRI=^2hU+h_W2iiBLn58Zr4&tZ7IZWAJ2 zot7D)WR4}0JVwu2Ei)3FY#-%B!(rr{jX|J6hWcoii5>#~bL+Ed4n{jr+vuEqLBPR1 z599CInrnX^)W+zO?W6w2Q8rT}+QCW>rR!|pF8tL5AoDz{NjV^7`(pS@>C}FB*$n?4 zhEKMS@_zdBs@8-47-XiW3xM*bmZ2Pn#D^!KvmB)arsQi1#XD2z7HxVcmYGtkDHNwn zxn5H&E2JrR2*t=e?xJ|FnSMiLj2?AX5m_&q$52qIhh)50Y)^5?knojhl+HBDx6>#; zO{4rSjgm#tq8{VslhP=aX_VSD%8E3~eJ%>k75@FJX+3(j_R1_-qBNkCYkiY*&46=Z zp{Ppl8r$}{Rv&t5@>qK7lyj~4aIPJZ9Nl?DRWUQrTWh z4V^N)bf7>lL-}NjLO!*gLpsW}RAms3%9KzF3rs?p+1S+7*gmM#vZTJPomOQHoLY*I zsM@Qr9!({hLkJgg(wf$W#k>Qjns9M#b8XY|YwM?Ww6)bYC!A|`9BVOB^WZ?n4i(zr z0&V3*O$!HWT?QkEvWnL|JC`91;HPxqL#cNs=1;i9DRXK*l%hjA%axoDrOmOHTgv4D zOK&Nd2b2ZfITnOEhao=()ZCE71-#KKUy^TD`B{X(#={xpR;Ud8}#61@Gf(oVatV5<@@IvLaSh@Aw7nbU1=MAwf1+NpdM`!KnW{ zq6Sk&S|9bGpfBwlc(V8STFd&L!`@IX&Ves>E%AcSFwzG(=M%{-h+s{ilcf441(4gI z^-&*F$%Tt1It9tz$&h<4)!y)=LZ=+r8~3ueFkIl2qdrj;5#|9puKQ+FR`Q2ibc!Ln_BCx%`6$leFM?46iy?*_iOkvbUtj6)qIc??dhmhd!0AO47rbhGrg4_3tG2eE{U&T*x^erEgMk zk&{ODj)B~^RC_0ty5z{eA;|r~A*cLXTIfp8{8sjsx$_(OH{oS(S&3`WC)v9UawVzuVo|Tt!{pyC$jx=gDSL76f-@tL ze;@X;H(W4@beMr(w24i`K1k$-o3+8cJ=AVK!N3b}jJ z>@5rzgJ&Mny$5oe9dhj7!ii3M$-jAZ#uR_qABCmP5|!)?L2j2rAIlXLI_)L@j)U9* zEtf^+sC-6w>MYpEzmq-fEplB*LH0%eY;UnEp^|@B zc-mWBmg?Uw$jx%-BYT}EH9(a`Cx)$qT$7d?3tGfVUyD6C8|zuFMx9BMA9$X}OL7y! z6N{V~qzd%%X88A;Btzv^S*pEvr`k*D zv~ZHEd?9=9gNzU{f z0>5;nWj&UruPp5J2g%KcobzFQWyQ|?7J|UCmGDctK394nxjP}}e3ZVTf;4+KLGFW8 zeMJSX7IX-Tc0$hiXnn4RLy!8`3cDI?A;`r%^%WL4^Cjt91i5Kx`U+j;0qI+ormqJ6C@f8l-#a09S(<-~T=~2J z`ZhssnUGfa?a{JQdT=gK?y9{!9=nK+g zyRX<)u7$w64{{MLXUFfvwD8*oxhvA;Tn)A==-UH1=MzCc&vVZT-(G^n?kD4#nH;(j z0oScyp?)L>Yo0@&iyho0_k$?H7JJQotn=-$vF?$1uqS3Vwx|`=d&p*}JkfBW^>AD3 zSSY2v2+%hccU#FCetmzGQKdK4hy#Phf#wPa&z&-kW%hb~{i?S&z&Vet#2_UTxw=<;I5c?ki&+R@P@w|Xu54k* z&JOR`Iu$;nHK^IKo~fZ&&(&DQj;msNrbZf)b3(YngTf0EQwxAqHi{*y*^_G11TJNG z!d%KQbM@~@x5p2{3k|_V z+Zuv3+k>Mkv2_U7a_sj7yM7HNN;;AvQV<+{aR@S5!LE%)rYc3I3NjJMWCy!$H8M3R zGOduQfs8-VrtE2T^ONgfFgW^_mH0p^kcfkSQ$GDn5hU+Ia6LW{9NKZJ5+vg(g4 z0W}D%*4|kS(csIu^e2*2ncQC4xodyi*W3Bp&|uecC@T+cgyC4v7^|T?>5s;HBEFer zyMmpcH@q&%mHiWu zDuyWL@Hkn%3k>D123S3!{{{TakfiM-%PAVEIo#Wjq_jOX;!MY!@~diDCo0nBDHWG_;2z~`yruTY`y z4P!lheK}5DZ@F}>gtQfYr@zv(7q$?e-&`{5cwI8RHL*9s^(Y z=Elmlb-Y6*9p$>75!Q^J5hEfWJcYbB3(9a?4g58;rwSSQqpT(QGrLEW$Kj=!$-c_Y z-5*K4-t;Lp4GgX`5s`?XK{I)3BnlP)Mu@ktp% z;W~f0_J=4XpNL}YT!JUqi@~l7phUbE?d#2P`!NKz?MKD8J(^8EBaf0X_Ut}nZO$ji z-N%5x4&SGl*hSGv@p%n?!{PDdZZI$8_~0MyFhS)2@)^p30rJ}~RDQz_IoZOLR_RK9 z%b3@uyYt%S&VxFy^~RE)&&k;wO}-TDqGlCp?#_c*iE;=8yY_;hvkx|!-HczsM~-S( z^$}&aAF1s2(SeR@W8Ggw(Xurw)-xY>mtB;*_gJ0o*(kUb;n&ejAfC#SdL!)W-z3hb zeQdFw83!x6Uhjx-exem~v7TwJ9JzD_wU>|`r`cI(3+i`jp_%L$(fRQMN_Q#dgE#I| zj)!?yHr&#&*P%n)s~y`<8A#Ieiz+?8;>?H0hC`g$@Q*RNGLo|)65^;2wjdW?s$zYo zD;LJQM@-9<3qJ#SNv3u#+!^c~367mYb>am5FD7wv!u$jMr1G2dA?;eCO>K_yBiP~} zA~{BKi!&R(>gAIjD6UMpd{T;rfq&X3$b^;9A-+q=gz(ClVB21FWQFH;GW#7>|q&64jm^le6+f_AZ(SqaCh z`#c+x1$%$2^I^lP0|yTzhBR~@IMDG;=)zWKZ9-M{aS!(!cwa$_$bkXGc6jU_*dbsiYC^tc#Y*ijsOq{2dzC|BKxxpzE=UknX* z2)+UpLp4KG)8Q~xR8_c(y2{`qaSBXlv!nYuG|kX} zOMa+y(;i~F;uI=_T_+Rh9ts|=_3J+Zzs#O+%Ksn-*Zi0gh0gzf4z`pB&_OU&uDkIt zs|Uw#QtKhnO>K@d`r$?&U~&P5F^{&q7>$nry-!->+h2TVlcKJ7YdHba%#Hz>f2Bl#!kPJt}x3 zc8sIS{%`bgjv(W!e-m7NA(7}vg7W;*@YA{;LeX%nZWEeoQ|(b0^p#3gnT5IoMUYfo zSLDRI$pxl`_z?}tIJ&W!iZLp+&UKes--YWcd)%c~@WwAAhLG7^Mc00GOmH16Zhh@f zoUIGkeaMRHy3FY1QL5#ronm^IvrxhrFL}rXA33@qIX6Gj-%kyJldOs)Mt-&gZzzL< zW?*z7e#VymHHu}Y|KJ*K|49FdI!~?wu&?87SDz!!1z@l%ima5<={RksDFnUxPq{E4 zZ5zAgwm;bU0bFG_YwT{tf01kL{?qg9FRC}F>XdpD(T|wxi*-|4!H)=9VW@yPL=~}n zE+l%6x70X>DgRNPUImR(o?>_R-X{@mszcHb?s( z-@{j(5v0Z^VwA%uXVC#CFUD{$cX`=`dF_WGT4U$C`z?2h*|qg^v3)-x>>OHNY-0#MJiNbIR;dYpC|#%ZUi zaav_wwQF#R_>*?K=AFc(SkFwv@jNs|X-I_HHEE+NOJh6^A`P1-F`m+WHG-fWFP|$w z4I9cUvDNPcyWSztU4b;%Pc0kDE4p2&+BN;bH8j5@?Hc53KL$ly?V3HNH+E5vAA=%K z4o&nxo3mLHG6N#2Rnvrk9oaV!ibu*K@(4M&& z`RuE3xQ@Rq{gm1r_bDSE>%lf2X`_r0(!zE*uVtjzenm=lSF!FGW#^Xc<$6><*1Z&= zUX7Pea=>iGDCC*MuvjhB=?#slP_oRM(o(5k-=ZD8EDMw!{gpoEXyJm#qWxLxSqTU%_Q%lIVkS}l!s$w(Hupg`L6bklJBeTpE8Q|_*D z9Fc>zI7%kQCj1?+H$*pL~B!ZAgZVvZ$AC6-8=(X8N zs@`=!PvR$rT5N2r?3eAoYv?@3>UgDR4RX!(o%{cW!Qs6>NBWZS=y=a*H20_)dp*lg zg8f|ewM_E*P!&?IRig4y4n-%dbN|7_MbzL|m8`CHy%P>b6+6whMXGRnpoesaG+ZMDYscx`d@tS(S%&H;enDWWl-m#loW1DB`MpOFuiyJD+j=wmu*D)Wj)2Usa*zQ3~6pjg!W0ce&+>^*L`6ta?$H85P zAwOyNY;wAX9bwMYq?R(Zs#N)1fyt_9aN~%q2J{y@hIPT;lta&1Kv8m0dQ8&k%& z1~z|tig~u&luzaiwC-z=?XJs`dUsXa6rpZ~x9nHqQge?|Xnnn(I5)&2M6FI9O;&6|tS zZ{TtkLkzK=d7*gEl^6%#9_*S-DWV&Mve$w)48;$c>=?H!o@_uTWbU#o$E=6$#GCg0 zq0>qDY1NZ=cjIH|z&9jkg{ZB2sD8X_enOA*nST5XxHYXGAH0#qS5o@&v^Jvq3&RqZYZzd^r;1|_FJ1ndc?~)k zYry_LI;%Vz%l&^^6mbc)&fHTQ?lFL35;(-n295NkjR9bsZ$I1!x{LwrAva5V1mgft zvL`rxxjl6QweaUt8grCClD_QWA(g%&!HsBJHlvz0X{?^pSgA9OW$QFHd67Zq^|+Sm=2k~FvjGWzA(o0snZu--MmiPW7i_1{@m1Ls@O_W-pxD` zL{%8K(HtWJX1;iAOpouF!A$3ZFbp$Mm(2|BqzqeiUm%@09K4%p$_v?irnQt6i2kqQCzsPG?`ZiaydQqLe<)l+J;xQ45}7aS zEB;yOXQCthV3^vk($94F^!pU7GMfH(q#D(qqjh^fq{<2FpzV2g|4`@fG!_eC5KI;e z1tTA99h&$G7CfY`6q=rCrBEG$)MLI0>4BCJrp-5j9tPbp-*gK7RO?hJcGkge6bcxk z{t`vh%?KSwZik#b{x(pK=PXW{9?Cxbx{0m!{K5x`l!&AHE!L9~anvIDbP;F9^{Ctr zuAx=jpE%xb`y}zU5P|I-Z?r%I+L*IY3e#nfU9!9#o3L^#~`&c!DYa zlf0~0PdzzGYZYlcaje!GnVASZrluMno`Y_wgKcP8l5Tw+p!t)hZ&Miow?!sf$bLmkab1pJ7(ySgukQm zhyPmIB5@fi#`C#iyhyJHL%oQy+FoBY=z7s)6s^ZuKcd+1tRHEeA@&Mnt{N2Sz{XqO+ytnyK=`VovQ!*JD)U{K4F>c>&8`VoxnhT*Co!Fa?l zT=gRu_ke-=ag?qfzl@(!KVE|$@V=vdd|BmLneV}fC8jKBW&V_$wDm4(t;@w~HlC)M z)Vu)38)qh;iI+VS4^G=ri5aVtXJX3bcpk&tVrIIxB+e{P?lj}EXFP);HZ1GKY|Hg~ z0Z;<2TybXKTPG#A)A%H6gpt%vrg6%6+4jWqG~OAd@z+RVZ}8UMEov-pi(`H!mbU)R zp3tzf49y4pudcsS>uge1vMjwgWf6<&+NPFcp6l;0w~?b8%9zMgo4i&cD0P1V>+oFj z)j{_%luYaJI#W8UDeLfR5ow3&t)2%Nuih%%w&Cop(!>SDGumy`(Lj5E*57@Z3g$hO zD&76lUt(H!&oGs?D`>M@EY|s?kET#D5Rez#xR2_9SkD}L7^H`Sq8o&=*V>9{4eFD= zhGa2@L1-=(!yv(p6$iU|J1})iZE!U?sD?wNesj*a+T#VJhkFRHkfwNz%D7P(TwM>J zrKw%V{l3NEaej38&$Z?kBgGdY6Jn%f1}`b4jd4sxmP%qo~ z34$=wvJJLhui04eKelFLGnQ@W&Q#i(4H}n98|ztGPOU1(9vIJlcp`{-uf%YB&WjeY zs6|@rFX>Oa(*NM*y>7ucYUcGCt%$n;Q$PCBamb{le)OfOAMQ;3`H~Kh{sZ{oy~;VUbN_{V$p)ceQ^#Cder*sdB+glB1x|YZx%^?ZDiRMw{|oSFwQ| zH>w}4mU-16cMn)>yc_JC%*BIy@jANDR7^OFjWPJG+rw}_ZN=gC+!x>zEVM)g+T~vG zwY8sa2cb&!O#M9^Up4<^*0&VIdQRZd;24x0T>GFutTUrtZ-V>pxGc}GXW^6eEn-Qt zGEAj`-ROOzIMJ2G!9<0-EZL#bfG$f`BX;bvQ^;cH zxbwQfjW-9oW>VDsW5%3y|JZBH`AsAhs;kn*oS!ocSAB@0^CyPkst>`q+b~@9AsC&8 z;i?b8pmptzG3U?WC#`QgI!;Tdb!_!Fp$O)|=L6tViMyH7l#DMq#xp%q)FAfTW*)uq zXsBV_>%`83NKw=gfE&$VitQf6wp|OO1a`INe&H;EmyFXbx%RW{k~frA-tN8ABVEl? z>FVz(A1_ep>mSnIqKjXVh`iccG&|?n-s&|BSNg(0%l8e#mA=5Z*)Uw`3ycoKaHTIW zE(gQW-kOP@NMCYw=zEx1rxhR)i~SZ|%Bco&-h(WqwU^S$FEgI$NNhY3i=EwT=jO*U zROizA$H?p2G)J`wL(n%ns|oaHhOQk{SE2XEhk5Q!(> zLf1(dnu%U4b`D;I1!rB@eDwyjs{DiI-Wc?O&A~FN4}2Xa#+G8l?ILb`D@EvlZAMVZ zZj9&^(Q38BR)?!`nK?11yIEBubSLdov7VW_8IRS{>oL+njig+jk;q4oBfnpUdCp)b zoqvHmf07!~4R&r*j^y?-^1q{A!T$LExyY%G@+HM>CcfE!YA>p!PQi%{s+R+q60T7JKyp3KS23J%GVVCMrqR$E`Y`&;GS6Sp6C9G ze1e#vaP0pv3?iA?^R2J&crs15ioQYBe?Jd)U7>Q|&a^S*Pci3u1XNM^lsf0S6LayX zUDE46Fn(tkuJQ?tt%l($pTKy~FkIym7`GXQt9$~3dKZrRk7~Mxb!flQaW_~_gz;q6 zenWoUZ|7IFf2)*QF0`vVj{d_rYHL5z;#{pt2uj7EQxFGg{eQSinesI+?|?Qy|&y$kF7H^h9~>G&&ZuVeiQ?T`#9C-q~? zW?tWGSvu9|i$*b$LiSY}OoXm*o6xFTvXfmtuFC+EyRY z_O8e;PzFCFdwn~!VP4%w1AJJ@jQm}RUGPsQCMfp?9~q7zaCAI3XRVDL2tIP*fwhZ} zglC{H6UB<0%3PfJ5RH|+(19z-vHs6ELaU_NUU9@qgh#47;EVwsajLR^Gj)7@Yh#`k z|Mn0ToAxV(yTkvHyq>w133ztyqX#Jy^;BgwBoPu68c_+2uxZCWg0_}&PuAKC5gxGv zYp?QfR^O)#k53gZi#T4qg6Ek-xu?NZ(RcVEzQ=;U7YTn$e?B3cVYa1z zJfX)3l@i+E)H53t{HCtX<$&1VVe(J(gPkgRkdG>kL1z7sj_BEQ59L+8`V?PNiC_(# z+Kh+X+1nAoQtgfvsxOb7#KEQK;jgdbGZddE2cwoOaJ%Sm;D>@)%!lW34Km%40?tTk2ii91HRTWMr%bJ_ zAl=j`jGH~Ou=kbB+SMi>6cbAED=JRx%7^B6ovodM@CUelo6l!m+t*f_ATWBq)ZEvir<_ihVIj6m20idztwDxmC)zz&n?V+(t7d6%` z3N^NePP?|_jL`X^#G=Obv(ImDytaPq87bTpm9?#{_00>dVYqK@gf-F%LHTWQoOL@B z=lkMaKLh6h<2OAnx4>7;a7#yB0{82L8roVGhnhQ@n#c{!@Q3m_% zE#}&IYC6%A!yn=w0XPu<J|QxQKY&>fv*jRpP!;Cqc`Z zfj52DEj~KD$?}oh0$Xk%w~WSt-Lb&0vaPTAu2N?4CzE?dM{%BV;LU972ezyUSMxn) z#87L*w{r@H)(mM4RQY?ewv$$McYWShe1Sg)tb2Tcy#eb_3jZN%HA+q&#mNmEC(8U3 zPxHA)EyTJEU*Ic#>jfW;WF0fqZw;NDU657dYt?ofaU8(M%NC9#<7{`pt zu|~}vUNEdCr*&x6kY4}xtX*0@cq-(_2cF5Ymfhmp0i6_9u9x!oY+pfYm}Us0;YHV2 z*8RS~U($3G`U(c{+o+=^OV~D%+g#?&Z}M*;``72d1L#c;Gm4+VhA+u3@Q#Zk7vp?z zU*K1M>lNRvaIA8}AZ1-{_fFFzk3hVf82ER;wdiUJ4(pf!<-VS6EvjWX?>sm1Naza% z9?Z6`(Q=OPBZJ77BS%B#_`p3rtA0G|$|&=7pH-`62DGowZ(XCZmBeR;bTi7450{bU zK98^;AfAuPhuhDt{f^(d%@_DLzx9UiXIc26(|)06+CSxVmAl9ddF=r1hKOMKl59+`@V@{B2&2(V|{9F(**a2DkgHs{=cI)?L1dfU3^Z<*Rb*L7%Fp#s;c9 zd1IjC^g!i6<>pDJL1ud3jx1|-00+<3UIFx^FR&)d`i<`xVD(JnkGdoJc3?_R>+!yU zHy1Aj_bu?uSbW#x8-&iwiHGl*cqtVMmH6I;6DBqQugCX_V{ktOa1FkX9Sb)g9D4EHhPMECJH9*d z76b3X_Z_^Y!29q$h<7rubsWy+#~T5T;QKSYG2mW&e|kLX2*UUtz`KIvPr%L8cvq4< zzBPEefa!bDNw_x(xC-AIymUAregA;>ao~OUULAry;8uLUi}wlO4fyWCyNzV;av&bi|>$f#5Hg( zzHLa*&jPQ+w{kkt8*mlAA6^J|4uP&2h#$N$;2M0tF$;Gg0k6k*|h5|4dLg&ldluX?eS3hMcoJo%wD;R6{R%l3c zaF*;L;}}Q4AOuGGRi_B^A~LXmAqNt$TmFnZ+TA(l1ZG;Fqj1Ah%O6s#Ezo*W38}x= zr4jxK6d6Yl-`ZnD?EZD@c!Zg}WxFuNZ)q-#%cg13qHQobpf@#yKrutD1DP6(%%R-p zZTmmORH`S;Af3a%dPqFQx5l6=z>TPJ8WvjoS*5GJzmIk9@pY7QBI9u~4Cz@1tJHCU zw1{x?9?I-AOMo9V;FjI+6k?H+HBvpTxlzepCse)WOh=2uy(TAk#h7u}Kr-$aGXb&} z3%)*Nzu;79jWC6#(RLsVt11EQKn{$(8hw+ zZrS^NV_T}v%x_93Zr6Je>`1}LCp*&4Sg)|1$5<$27ow0T#&-c164Ylu45VY|X2~Z| zan41Bn?MD;@My@PQud*;#G~Z!b6_2ZK}QaBpx{kF=|b33j0)n0RJ#T%Hw?O1Nx{c3Od%1k5ai-;3d1BXidYz9T5}Ee+s0;_CyY){Ql&DYxW=U4dQz@-dwyVd@sdY1w0?$M!eK7qXP%NfcHLN(%XZVRz%UR;&0;J54;}V zf5&?~`a87qa|_;b;3x3?CEkU=v>gs3yH*!4Z9<|=7c|I0Us^Z)5-@#fX{v>4i@vmS zv;dgCG)_7nn7(vvRTnV1;|;v`0sjHtzvA5vOm3o$3;Td+wwLBEXsJMtk=JqAT|g33e60 zA58FrFe=z}r4X_~I5Dx{QB-VtKDFma!nm{xf6)->3vSGgB}d~dKKi{j%6m1iPOWo` z54-cTqRBpN)gJ~ow2y#W`d6q0JrS&{=9Oz^{ZG7SDxIqq?0N%sV_J5quL3icz5PR? zD{-3Z>My`p->$=>eY-}SMhP;yY8Q1;r{TzV^uXxE!C=?F!6XdAO7a^F;y$d^QEOW}a8vJJHjxB;G{4}qUX(WFxQc53^*9BeRy1^O$?B)WLMT2&4<&y1 zdj|Zy&2~O5K7~k@ax>)-h|I~Vz{(bJbd9oVM6_==tb6T((`ZO1x@tFhmOWAt-cjDO z)*6dF1FJqf2*)g)V8^G4NRB_6S~p8?eBoZ~`P>6LE#-7tYjhqN53YGf!Gq8=tfFg2 zaP@ETyRv7#4?#w3KU_rde%iroBmsZ4uYY*M*;al-GMd#8UDY2M+usiZkD}n`G&O)5 zl=akmHFHSh9NMiz52x|67lNx-<5&MK{84LUDnaTx9PtwGsq_aQsmv!5iO)Y~QZo-6zl(Rb^+dzo#q5%3uF6k^@bYZ$`XD`}Pj$+m#dTduv3r^Y<6@ z^&eh7Y$t_qaO2aUmk-;Hzr(i0lTU-3jC@Ro`_EEhQlA}uw>srM=#5#atQWKs=BG0=bKB+BZS)z!Ds zY&MZdsq>jt+>vM~wPh-tOyE@c6t>0Y!=;V9CZL+u1YqhOYXVr)Ak7yV^W++*8wP2< z$YDNQ;!rS1^Aj<*U(IV2s@qyx7K?^MnlG7Kdu6MITzKgJ#Z_Z>I{)@%0ksZ-Ahjh)%pJpIzM zFD)q!Eh{alE-5~{qpmG+HddrGE<3xue$lwlf{w-CVu&? zLLh3N`K<{4vTd_~sIBI=K8wFsD^!EO(-ry#{x&Iu$z+QzxbRyiqflWJ1F_i^=)koq&5r-; zAqduT1`um00AekTKy2@|K&&yMbKw}I+Te!fLP0SfY_xk3T>Cr=Ah5Tay39K_f;Scm*;_&Dt#XSu|IssH0+NY zAofQTh(l;L5c}vJAlCOK441J>zYMfY>AN3@?R^}GH9rN!nx6w=%{dru<1okrVts{z zt^r~#T|lhm%RsE<4j|U@3ea+8Z#{3ijYRj6X{P{vQPJiAvHNO(*nL+6vHRM9*nP7wgT|Vd0&&>?5Qt4Y z3dAOQf!M@{Ky2Ia6HSQE1L6=Gaj@3y(?D`lGo4p2zZMy@AZTl7w+jbui+qN5sO}q!hww-^PvF*&$ zjcpTv*tU5SYaaF)qxo1M)_fHZht>CiI7Mt6YxJFXhS7Hh5bG-d zVttK3?9yw2Sl=^1tZ(Rl-=Fn7H?BW8z0Z zY~o2EHt``4o0vM@n3y-gn5YF}6N`Y@#J7Oh^$!8D*^hzPeTRpQ*%N@+EL{xFW*dOm z#210s#AYD&(Jz45#Opw8;_yOa;tU`*u>^=stO8;aYk}BA9}w4rJAl}>(~6AQwuvT= z?g3&gKLBDa8-Q3#KM?!!BOumNQDU_GW|E1c38f~7RseBHGYg2*)fym9yY~aJZ9f5G z+a3pE+x`N?whbvWw#^1&|DJP>NxK&SaoW8GXqqY`ZUkb@w*s-|ZvwIAmw`Am-UMQQ zl$>ka*AB$)`}Jg_~bJ>)fdh;u38Diu6huNU9|;>Lt_UJyYII^ ztod~ycHb!%821$cu^kTsv8x^jV%v(N#_aViEbb^@dVHfKB_C;1nN}ieV{Idj*l6AmjZEWS_Q;%-9Rk& zEs?vX(r~{3#N0Dx7`K!HaoB$W=uH*6-v?TwZ2J+=jS4*l^b^J1A++5T`a{nfBZ;9M{A{Uxz^o<2#eXD?2UlNG*Z4|km ziQKSRMs73^%bfyrlXBHoAP&FnKpa9NE;4eHfo@iE^MJTjbtMpoRTI#c754`~we zAa11%t+KEZjl$(PAg0X$;&jje^cBVZ3ear|eH)15<7FUjF%G%da1RG!v&RFm+$)F` z*1Q|&Y^7zj-=H2rG~~`)T4l$%_Vyg1jWFnlktT&52gD}+BPeLJK@*NNXp*3><{8>- zw58bWWrBWqtf6fb^e9?4EH~pMgO1KOXwvBh-8I&r|3=NpCRU$q(D(@ky<1?=x5Ea_ zLJh$tzFTb2xhUJ2HXS7`ijPig{1#&W@ z4#}Z^xzNx`kp7r^zMyG>W(k@n=n6rL1holTA!v=Dn+1JMPy#8I?Oh@0B|&E+B{KIy zq&h~k1zjcx$mi3spzUQua(@xI3i!=$9fscv6#}q=ic2nKL?%8|G(v0w9W-qs z1jKn2z(OZY+s24Y{7uowmtMA^v!qQhA`?EiC0ngz9N0EwIc=5^nGGnjnQS{jOfVu7 z!v<+vNX#-Kvm*zz?Nl+rh)j$gq-`iBwBHz!SsG=@#y{_nJVQ({A`{09(zbD8mJyjf zL77Eirq*g^TWDTsv`ElRf*uz1s-Qe*pmCmTOjH;|brI8^5JYosOv^(yVYEoldObvXG70 zY=IzJvcj~NfY|IFq2&%W+;M`c1i>Oz4slts8^1WG&>U(ut<}-oTtSo*nTx7Sb17EY zY)H8ILK`cHQUjYsC8SLh3qs>xb17}GzKEc5;l_j(7lZ;>o1H7P`GPJNZjI0u3ZnGK zu4)omtDuB%mkDi!pq0Yy653ipHwky0&~6iSr*Q8U+Im6v3im#tJs@am{nk#Q?Gm{?LVHhW9|GR4=gH--L#Z!#adU0x|a}AU1KLa8DQRc;S`^Eh=)Af-V;B<)& zy97N5#4h*=&?+VOQ=x4IVlB@Jjmj&gQ7Oe{-xAt;LZi}$<*3YIxluqo>UWgTP81rI zAj~ZkM7zb9RtdCQrK?#$?9zF{y&8ypd4tG(38+W;=vJY96^PB=55$@u0%G?)2DDC@ z*etYXg+?nXS?;$&dqZgN0SJyV}O{OC$!@Qg@l_gw6TK53AaFK#e%2?V$G9< z77<(kaWW6mFN$)(W~w zxa)*=o1i;|d$-Wm3%Xah_X+I*K^uhou+TOMdR(}@LVH5cHsL-iwC#dk67Ei+y((yz za9xi`oZlg6bYN z@gtzql!=W%GnE|mVrD5sr97K}h;=(&E(sas;CB(^FhUCSCSJc)hTp6?0(6$5O$WLN zuiv^De<>~atN~=D#E_99ucb;&0j)nBuW-lF(OKG1qdzqzm zhN)cJrI#tL+x3)#@ZaTvD?|&0HT#ln%Z1!%ygrM<4@<;=Lil@!$Wh8+7f@@ghevI4no$kL4&$vfNma8zpkpA~#Xw&JphC zgu7d~jK()KHr0bh&w+!~BTV3gGORWpU)S2oWcBxB%(T)Iz? z<3AgnCo;y=Tuqs$Oi>I`n&1ZwIrUtlWyauFwlAOlG6R2&9XE@N(fnOaQS)gT-1Dr+ z7*p?P%CQ63HHMNso?|J#6jEms0;$=w40g@arcMx3*Jw%zCNuf#R*^AwJ*X+CDpTZK z69zVVL1c`nKWWP81K4#0MID~g#f4!_Q8Q^7{53~pj9o37G7h>j`Rf*uF{U2W6e>a3 zM_V-Ia-}CkfAR8T(C^Yr{Y6v45X|;X#a}x`nUD${&RW7^SB0ifO_}Wr(OA3cIw*8@l1;f46zUJznqLEj&Q!8x z&PH6_?2`E+D3J+HncG2G?~-{46gq>+*0T+ihg>qh2ZhdNvSmI5h59C7fu zW*jIlyJRXsp|hN9nR-y@L?@fFlJrb;Qtkp}k4w*gfD)PHlz9=9P^pvh4k#bGOpQS2 zf=+|7?K&M4+EZ=&q5>2;CCZkm28H%o+cMXILJw4-CZc_!)DGYWKh$$TWK4a!3~8C3 z`FOK^-fgX~X_*;H1{u;awV#b1(=s&Ik?r%A*{x+R9l)-f5SVx_!kbCYxDZKL)@67z zxw$HYP>phkv1{)Kg?6OdAvWw}lq6b)L+A=nXs5a@vnfqx`qF#!~sX|qku zOOsg!3Z2_!o4OMe+Wl^u`e~ZXZ$Y6GzHC#YPUU^_wyAPZ+%g@Y&{<%%sk@1S=RCaG zz6Cylh#VA+kInOd_W2>gj1T|A!?9noxRWjb`XZUHP7kLAkvlR-1LMN2j zE}RR>a4>CutpJ5iF0*C62@0JBV9PuO3Y}g)$e$W z%!^tEQJ*p7_i34!lA+?#evF=@Kf^REIfWiH7#xq0Db+G@C4&Zm<1sRqX&FQZ^q|6X zJVxd^ErVc$%xH%Me(PUf*D@C?nGE5hWo9cGZ#Vx+%gh--&wed4SILC%*M5w9PNf8k z=MubLDSUjQepy0EP}(3FIwOz9gzRVh!rDZw{zUmDfpy3Uf z9Q?H(6V7jI8A_#@+%x=4HmB;u4E`$AGL*A2>A6hHP_rzPdv4G&R2pQ`bHA3Mra-3f zc~;9%g`G*yAGOTM1Gp#mEHLq$f;W?%LM@Z8WW3YQrCJ7sdqzDgvqLGuG2C_N+#Vsr0;$$gT^rQP)f6lLz6FF)-okZ##>Jo z1q>cEn4yQx?rBlKoqtAanNlV5HVQ+x-%0jlEmNjsw!txNM0P!4EpslYnd0IhEi+lk zc)PiXA_~v>cr)pFR?A$VWW4p%Q)J?a;LY|?DoQWs+qFzo$+*iOkkoU7mYITIsp*ge z#@8iU+H}n`RmqSZJHAMUo?En@&jV-srYl|Ak|AzG8fA4F<$GzAC(|gq(kKVgD92Exq#hGurD>EEX_T*}QGT07 zIhCq1m*#8IC^w~1Hlo}<5rHg746-z8`dJIxlH9-a` zOI<35sOv*-Gq zi4-4tNDO3&m#^F^y!_)K;kG0-L3(<|TPVdp-a?14&C6G5io87LE#$V%oyk3Y<|UHi zFE5b+?eX$ciV`m$d5IW%+^68BoKlzKu|dd+4+kMTI48LMJg{1~=LaE6P8i?O+|+n= zebaJX!#RE{-#C677pvm1lukTMw1i74XO&e~U)kJIUAJsmcv5wBb4%Oe+NSD891vKG z-d1JR(phs7pc6YBE_7a6Sh;jgA{?$;RNGdaXsc~Zv{x>zm{W^C^i<8LtEiY;J-48G zPDS;c@@hv7{J-S@iQfM$2c*S7xFpe1ddL`<@hPKV)||rX%Bs3KiIOGt)N`(^L+l_{ z=s~>9t)5d^JtyWFGyftEOOLUC5r?U)*Pf_tOLVlFoF_jy3msZDxS+Z9%tjzftVZLUhwOHW1tqrqL4d#T7QVRWR{a9&yll9^-9 zLY1>qodM!5cAdJ#ocjz_55t)RL_?-iRXubaT6Eq(2|+Ut6~jg>V+0z3%+X^c1`7Il zDM6o7VLL-RRaAJ_UVH5)>Gut;b7%@?-H&tygX!GZnmpO5eNlHvr7Q8~r)o(J&2&AP zBt(-}?+1SIBHQUt$ENdu=8Oud-QuB8HD^q~D%-qLp=zWV(-{Tac6*9BU6D~BMUN{Y z-7ZOI4QSS7yW6ZsIHbmz+iFj4itTAKE(dsWQ#82KpW6i(*dG3O>ypX!t zQZuIKb|i@u6RO8=(vzE)QjQqU99k%|3sO{~_!*qlp1w^{R_-a3nL56%rD-8$G3}v= zmn0gS+QWs_)8iLSiN>p|XH}zR-arlaggy@(t?z4L3|ES`wzah4Waz)kbgBb%r8Jcy z(N^rBW->r==w)E`j5!6>9-MGRCQczZpQd9n3l;bGn1uQapA|3{o#MO}jd zJ>-(e>^hg2XUH7NA_qUSH4Y)NWQIG3mL*y)<@7scqUvsPYDtj_7bIGyYB{guG;u-w zm5t3V4Q^{v1jMx|_N0iV2TDz(+Xm*Bw0A7P zbWz1sS9ut=nVDP{E>NAA_DdTRi!$ZJlG@f*1jL}&Voyqh)HT)Dwt2>-=7_=6IO>4q z+GGY+CZomejn~$DCa@CBlU)f9tD-7J>!il^ip8yo<(|xv#`akqO--J>iHVjN}6ngBfpzGO;w13B_>xur+Sm z?#&UOrm<1Bl1*Op%!a&;EX`~{`9IB$x(o(t=VbDa;$*H_F`DEa@~fjEKN?g@_v5El zHISn-J1z5QuM;<{8Zh0?;!X@`yDU86eg?(gh3*V1v#8?v$aNmC2Uk_NBG0 z6|;4VEF~K@B{C(Pl7;n&+B#iqx~&sdhJZlsVrRBCp_$}1TY*7L#9s!EQP|o91?gs$ zK~IitFx^yUw}8V2r8l5Dw*UOWbd)FmOEx>ZOx&w?b$4Z)hQ>A7jp0KIcwXa_ZqXsc zjCHBKU#F8Yk5VB-Q+rf(Ev?I^wY4n1WbU-mirJs0;6Zv>PKD3^jAoODQ*sQtWdn6K zGMC_o=t}&(N;5f^I(eA`_ftC;VSfk@xg;{X&Lx&!l_0neWs!rQ*&2tCrzI3f)!~9E z%M4nOG%e4rXNbyCZjVk^^P#Hm}yR;Jl9F`P*t)#j8@)`1+7E~<7WIM(rbv^C7! z3-3@Eq-?5QS8Qa|=q;71%N=nUm1Pi1)s`B`8TDlp6pgCbx95)3c)T5Ip4^OPX{zl z0?lRElWE-KE___((pjmYQ+(-Ethl6Z;6-h?{8yQFH$G|T#kHgi1l`!PD`lrwQmCe3 zm??k^KRsv-C*2pu0b$R8No~q$$GOu5`_u%7yH!YD&d5pC?vcQ3)0q}rVUg^zW!0E% zYHw+-MJHi-HEv|ayn1!x;@0Zw`nI;_7Ea9J0<~DSc0uEkFfFL9YpQK;uTEgfxw^5r zp+)&(-Yln7AxyM4dI@4!#Eu)aX2R~>IRjuK5<-20Yu3ieW|NmRFU4eH_3Zlgj>YwG z_+lL8x3qdmdvj|W?oDri>%BtIO!9y7MZhI(^=gi7xpU0g>8v7g^CwqcRz0)2uC1Of zBcHuojj@@&n$w1fb#&Fao^|`=mhkK=2Jp2FpIn2UpfxJyBnpdhVA`U#mZjA#9f|6e zhU&K3<}2%~8x|)p%tR$;=8>?BlM+ZvGpiRiw&S93JwN!#9ZKP;XL8B0a0uLrbjfbz z8Bt2*Ep2e;r*q~cq=)*pCG{05x;~u~7k4Bm%9k(Kj+`~)lj{jjqDk}WhQ_w`1eUu~ zEYKv)r;g)riPDE`o~jOu=4-2Ko0?kc;OOf5Wp(wfiN=;@MKn zIMu5bwzD*{Rr8S50B+92n&?<#kTJ<*9BWQ1Z7>UpZ4)|kv|QO(H@Li!(SlEqg){0< zS-8Eu@yccj-C~+GgELF2t6Q*!puTo7svqRP1a<+WP2pm;FA*-{y&YP*QtjQSm{U?+ zHDgXu^)kxyx;_pU@c3N3u|0vPbO*W3vR8&+;96I!RQq|UF;R}}Y*%<@1Y-DvvZB(E z;|Z6Pl@x~yi%N<^p#nwczu|&{l9G~8C|q1tRHW!N!xygMW4dxq!P#zV7pkAfr}dsx z`n2K{innoM!-}JsNc+%3R#lDjEF9*f|BYBxz0UJ+(j}O(5^@t{2Q<^x;d42TRQTSp z{F_cq2<2AQOemIZ*@_Xu-?t&RQ_Inb2a()@$b?e297L=UBQ5JSEk|bnC^>``pgc8D zkOw(BzmT4Bc$I%u17DHUpI0HbY!psnq+>Dg496R>3L?%kI*3mGn44=^$Ky0Odh+p- z+=OtE>;@+KF6et5a$Wk|HluGsc%mz0mO=K3!*L#+mZJ~rGbbsKHk_x0ck&Uqi!ua& z2hqskS6Co>g^5n?c@=V(h3FTb7@@+Yu-GL>;YSx+E({UC*%5eIuGA$*{v83i8$tkh zB;JY&UH%P$M`wsWOaKqO&-#k~ANJk_JgVyI8$Xkoz;KZX8Wj|D)ToKvG7v(7s1r!w z3`{TrB3>{FBoQ<~OeP458o8BmjBi@0+JY5ZYrVEqk=jaa!W{vPfQl70;H8NHi#G&O z^Z%{A&RJ(>G83@%{l4dWp8t7ra(=V++H3E<_TFpnv(LU{M(|O%>%jMl8vvJtn~@&D z=Y`u=@a=O0;39ckUWUmUbfS|y=jnv3OQmCIhOC_@7vf6>-zRSR6&7x$Cxa=*e+1+P zpW{6K-3<>FZsyQ-@pGSn9ZL*8ik}L1Sb9YHqi~DBx4_^t)61j790vVIQPIl57k;6> zc?S*4hzQpWh6T}lNyL{W>)c5O$y*7&UmM{j;J26fvIb|8yLq_*o{c3hYiL9{Aif>o z`(s2pNM5$=1pyX~_zr?^M>Jpd5M!SU;$pt;utA@;D0472wYI+Iv3l5=)w2( z(Aj!ubdp{>KB+B94}RWEa=}vlp&o3}7i~H+oEktyktC_zy=)nz&R>yL3CK)ks zN5()8zOEvX>kkz>^Ot-SxYQTAA;sydEl)u--V3C-&aENQ@#FDc^@sl8evVY|7{Yf` zd~$A3p;IhiEwnmHe0b2o?SFNH&faPZoLe*-ewOL3+3PoZ9a@>Iyk6hp?FAZw9_4iP z^g=U+>g+0z4RvK@16}7XCKjzu9HG~dPCZDv)od0uf*X30{0MH>gKw#5s0ityJDf&Z zzR+uRXnhW(Z7@im>cMvyE*jIz7N+Zlmi`nAD?(xVrV!o^58)Owgl{PXe{Cs3*sK`* z!2^=Pi}DacaId9MWNAYSl`q%1UM)<%sTOdvQqABHS-rL*OtqU&tXfW8=oY8a2E~mj zq>A9TapNhuj!159xf7A3$kr;IsB)Y$Ip=DLbAc-@kmA*YyY=8sy>>y0+X!`(lM28$ z{!q0O1>lGts&M*iXE=%5t#8RqNrybmm;JSC@x1^_t`W_$B#EZdp_yTbv5{e+Onng~ z*x&(vg@{rm_#2+#UtZm2u>PZISYL|G)#PkMxYHni+f`q|t< z(nwD`@Kojdng|VLSv47DMybXZd^69eHhS&6uu{Gyx|A#90gZ@^Jk1xvPZTeGQ9aDu z=D-YpZApro>}T!dq`cr^%c7~6X?o~Rvqs!))rg3q_KrXJE$f7AgDHRmLfKQ{RIh>x zvMd$k6e>I28Mcq=%bDuAp`{H<2)Aw#_6n8eHGgmu2L)@ThYFF5EvnJ*z}T}v)N3bN zZ3P+-v?$4X5cZ4nwexU5~)r6?1T!JV>*cUI#oKlXes{z!F;BF*NuT`BGj)mDK zMa1TKpr6ub`*dLv$-gAdx8fHP_XBrZ+UeW17P4`;-3VT69J!J{< z$uU0RHqC~E4ig94(ox#9m@-!Mv^jg=WoA%fzKxiOFP1#wO9G!KaZ<;8y=^_t#T(3& zGk;~%<|jU8Gr1x6w65A|GaOovUvy3HQsk`YT+pfB(U{OgVYaR4Ydh^6_$yBQ&Zbo) zer2=0W_PsFE%9@kZG)ni zdWlmXdcy0lUL~xz%69qC_hPsYN`yMD?DdpQn+u(2chS$KHaHm9eB)VzCz(?9ii~i{ zTx8*Q5uW$p_5#=8`7v&EwY9@|`jNtN-~v34;a(0*FMSRN-g^OQ_sISf6nN?U2@mS7 z7ubvEv$*MeuGM%JLY0BX}l(CjdeT zcrp-B7~g4%uLD_BrcOybRqG2zgiF^6<^HFBk`cd)I@zpn(8Z_0gFP;!1A`JMm)ax@ zVg&FuS%S1>U^Kzlr@74x^TP0W!rw>W-9vf+?XJX7<=GvBm7N*zX1G|z+VRZ9WeY*czxh$V0e5x&?CaI@&vLcL3RMLOW-F1vcuwX z8pP6t*r?HB3CP3FD|H;r)xaIeC>+IViq^CR3laDRpi@fR@HXuNv>T7`KquK;!*qLu*&`Yg_xO z2>GR36IpPK*s@IH$A;D&Xs4;28XTjYLK|~-HY(pew#0fHOnBlZo9zHK0AJY>(cDmC z&FcpPxJ`obG)KBKXr$a1HVTf_Qgp$ZMO-F-_y9X|GFvo%gy;X_M~&fk%&1Yr-KqIA zXOFpNz%>|LpO=+cn3*x4dU|DG06s3xoHqd9y!*SSRnIIBxTno`kE|@6J|p0sSUelw zpR3Z`o*@GVW39PduxeT{Zili^H!DQ1>rA7!GN$bpM0>=uYcHU3<%76X^Qp~ z5KDPkTweuZDQ^O?lylLVGv72ImU1f)^DO{kzEwb#N-~|3%-T2)4I9TG6=<4ry&Q<8 z+y+E;-l5LLB1`YkUI49HAv)ccU3UY`RkT(h=KDeTMxh*Y7}o-^rz11XEr>dw zOrx$4BkF808X)LNLHUR?yIw75s-Rdkg>=Gcs{y(Nw?pL_)5sRwgxii=(~tllMA<-2 zpeuyNKDy&KOTkdIA(`@)T`v;X0YDYF9okTF9S(G>qK(A=ISP%%f0lO@5c{|mh~?b~ z#6HS^*awvr_CdMKw0nSh;dW?2alIdiT$`yvM}#DRKRyxUL0a$*%yNjoYDZ z#(xgC5s1ssJ|GVFBXRw=xKhbsDRz_`_R$T9eVhiw^2kbYOx-{n(+hz(rUQZ4Zzd4? zxI$=j(kr{tiJ$CxjnI-11J2+6f+h)~ULLzXE{IaZv}8zOMCW8NqP`uYHG<$l%f`(m zhY^*WJVm4O!ZeBtqhxU3oS!Xmbi`(npaS+xaval3n~y- z(h$dLil7_BwMb|sf@X+oxzH*E1;llp&=v@)5!b~+TPEl}aV1@`?!AI2226Wc&<;V} zC69DLbTS$HptF-1?GXg8%D!-3lBMC(*L@0g7gx$lcBQ;zSBf9gC@&eg#Wh7}l$Y$< zUtB3KnMQfZC`()^FPY{Qlq;^3m+a~nM0v@vqP%3+DS{|3*|kV$q)FzZykysMp;2D4 zE9E7-o&r>i+o4eyTx;n!qq_tx6+{+^Ybdp@%txB!TmYcAYoi`9a^iQsqS0>-jZ(>e z=LxC-V#!tvA|;cx=3He&lF8!Q)%zdI!%w`intY6i?`lOO>rEPQsF!_4KgVxw#a9B6 zWp-%W@t>{UZXmXu?*efc9|Cbqn}JBL4t0JfyMB$|Z1s|XEWJ>P;@C5ySY4}V_@~am zaA~TA6nsGV$<~Y$9 z?CN^m&QFqVw=Kc{L?+-rwX$>_5gvEk(~Qp~0l50&w%gqFA2(knqFxC`A!+YTHqsH6*)~=qs~71Yn9i{fp!(K{@HF)q_rRwpK$ z3LP?Su0c5+4tCoQ_)m3`FVoj=g~#-@6%-n|BaLxh90R34yjdEfJ}HgpSz5gwl!6GJ z`-p;IES?uYA!}sG`Jf$7C#nDl*79`;D61lTO$3F;3N4;{K-m$&vj!9zL$r9l0_8{q zPj;7Rp825AXrtxpNl<8<$cpnmP-qm=;yDfqjU!n+=XOOvxRgawr|a-<`p-JWd7lQ) zSwxF-%G@l2hip>3li%()c$A%qab~01vw;G}g-AjUjh~VwwXX0PUsN)v_ZNMI&-S7; z#Nr`8e=_1jMb>U}@+kH<9gnZbFShU6N5w3{%-J4E5lOWGbofNO!>y3P#t8- znUpQKsKzm6m_ecX#gwZI3e_g2++t8P&23N?3dQ7kGJ+EOoSZj=hvdXQ@rKT{=F1H0 z+jf+Tsohdl8n=iTUeS(nZ9B>x5tLuz zm+UrUOu%hFp2&+5qZb;+GM>B>2dg$4JqhI~ zzLQXn;xmH{n@yfxNCUlvm`7bItC7r!&)6jkI~nEWWzoVFW4}9VLE?WSL?Zm(2r*L= zH&0{_r?8FuPlj1ycQVYfA*?LfYM<#b*Y$VICek7Y)~(G5B)8%*$Qs3t0}{5Faw4{_ zj;juHDtyNbR@^1bSW$~J+nx$=d?(o*!-zt7V%X4}u(U*NX4^h$Q4A45Q0MlouCqVVLBo$AP$MOem88oBn><^N=pc@o{M$jw+z z(9Tg)6Sk>^5+C+kbuYqxpG5FKs&jb~@|49saW{vzycc=@jd7O1{u?0@leigR8E{B{zu?oD}^1$%lPO|una*4CVpCTE)UjM&b)gQGE zU)Dn!rbK!Zss+y~ETnx^XO?@0^2^2SIVGj)4PzKyBxcN+b4y-uEE*)eqw;tTh9ARUK#&8{lL784Z0M2~6;OdDrJ_5}NrTU(5WH6w;sv!5F+(b|{W z$i8sBps5I7DIB$VT{{oq{YXPh{GFVk_~@-3qwKFCB2UAL)S=n#uuE2?V)bdP6{#76 zho-X!T9Ha4Ojz-EkES&!)P6;(*NcgO7+joJtQa)J$;zY`uVBLX+ z8o^g%@Y(R&t9k38=ZJ9Kpzj4=_@!1#4zW%JCO0ZqM~gJ=UPB(#$tx-|2DeMEvslx9 zWAL$Fuu?K3a^-IU{HKC1{PJRDBW6E_uEV^W{Pdn~y>>)`FZ)>KXdUw!0~35{yZpAj{#u78 zzjmz6pS`te0A>*C!GE?Un=4ipt;fo{2FyBa3>3K54)$hw0PrPemMqbi3XOs-_-TT*5*QXf4b#_|vssOWGof2mg0YAZ2|||kFw$Io zW@LJ3GOJ2}k!DfFT~I|^V3!_pg{y+6fVRGjS*k7PBUmdw?PmgGq1WPiOs)MZRdv@+ zSMH}O4u7Q*ZY^6uAu$)eoTE5d>07+Sh6SbnuKz1lWpKHA%DPjB9<&Ej^-$s}C|D2D zS|zNs4ITwVvTwwF8_jAp*GFw>@hcHqT1FVp8%VYl`LLB*!A3;6tfAhC$h&ga2RBJx z+N|jP_%u*8j!Z)W(om)n@#IM+;w~fd)Iv}O+>d9SxpJ(%{`H6q&|N$A|2zv+p^nG` z=-95S=&wG>=&v@Sy~=pj<7s69m)~?=G-|E>GK)_tuNeCAijQ4*zI63W@3{ET;!ror z5UqSfE#J~|z=-xP3^pxF=ej1UU$9z)0X|Lc9Czk%6@fZ*{8W{lmLhE zq_qlVhP{ZV?=shatnk=HZ*=VNz- zG3NS#@wFML%4Rg=xYq9R2dk3ugUu?jz_2DaI=75g(GSkXl2>KFDf;G834IId8>TyY zj+kMzZlRRX+)H|{GoCx}q?NES^!u7powdwN}#3U?ZzpKI3)2?Er z+7VIV=9af0IIO7B;MC?rKhTnT-WFm5$x=)p-TSzG|Hu|XC(m^s1v<_+PTRso2oPn0!U zT2Fl}Bc1zAV_}pCRIO#dvc;2G)s#ZxE{R3>4q1XDc^~B2Wp-@yS6jrhxuzqF{ z3xF2PMdKaS^TlQm=CWhT2i34!`i zm4E8}2yG~>b=0T)cPYEvc{e>9peoWz@c-lD}kuK37?c3X|G= zK1DP%(dnrVjZMaDT37W3J2FYP)7CE7rh)4h-e;9C*mvFDlSIxu-qzOojIpy0w&Vz1 z0$zJuN0(DDjtOxXu$%Cqg#g5;_mI+9{XDnfW6?w%Cfs?w+01B%%cI22$r zlvhJK-t$iN(LOr0Bk=CN+YfqZ2EEefhtAS%&A!?UyvR5EY^}cFdU~syqF&_t;}!hV zO25A7m@RN^9>_U*+H3qaKRkc>Hh=A8deN@xhqrlJ6?hu=AM~*I`RiS4hkLWK1Fe4B zR(er?(|nzu8vZ_CfarJgW$&uoPl4=12zvJ6Dp;@eITW<3wU0_S$<6*Euucy)W_7JT z%&+!SHy|dh-C&>nwpZa?^$47Ycdh;$I}mVupn%{TD)C6QKXewdoyIb3jWm4Wv+dT? z8gpt3AiA+~1cg5=H@Mzc>p0Cw8pq+Z)>Je9DSiIzT>%#dMDb91S4rDYRu>i@uvH;1 zIX-WjJ2x5o=Hz+s4(&rXVawswSD zM+T(r*V8@?Ow9}K8DHD~e1CRJi75tTrlEJi)Rp})+t&v)~E;(uM=A>=N z4bp&&G9pw2auxD?s>WS*E#sj2&t97|oVbhpxo^4d7>`7=YU`j?gL*rmDoTwW4Xs>Mz z%4RRAcP%$1aD3FRV4(@fSgNPFp^?dXwR&6brFwGJITSrLo;HC@Pe@Pl*}I6C1`N3& zD$zSzkv!Tb2qGa1MI_4)`$Uq^DF{tS%7dwbFwZtpUAKHBJ|{F5g1hCUHTZ4Y4Dm=e zOq7c0hRE>^>969w*R;XGw{wjhX~+=6IEx{6Eg6BnoEYOPzl>*$e|eBx(E5g1^hiOw zsh4S5^-ggG`IR7;dc~@0%d{lF-Q9Ylp>G&L%as4->v$1zm~x=G(8wgp7{9F^ZG$g+ zV_aQ2)s& zN3}0q5UG}PFp$aiyPbQ>S8#t3-8*v63EwH{o`X(Ocj#sm8>;@*=$tN3nL@PSYx%)V zIg5U7X`n_P5M@naR`D*6rHmIo0_>Ni6l{?LLHFJ}_P=a|au#VJn`Z)ma;G>p^1 zsx4Qf=4%mOY?0?g!{yn9QjOXtd0gu_OUI6OQz(p7bL=!XG%A_$X)H{rYcajcs``rI zKRb4OTbxp_B88V_>;=|*2SWFU)}?G!q5EkEq?PK2Ke!-eO7lKwz#lvwnwad_hB581 zny*jaL>rBz<_8bw+CGK_$n$)piU@5Al^d#n0Y4JxM&=qBfg*Z-?C8<7{mAGwSv z-iMM!(Id%v$WMLNmFfpa?=mBLqbPdyQPD%s8<8_@6Gh8D18u*RUH03P_30n@LuD`? zd+GhCM{`@7FVsCHxJ4C@4-jZhaAQu|zWnK5skEV0Ku%CM4CDE(`)8t*l9HEP2te7I zMH#C9n@hz@D$WrZN~Gpx2&Lr`Rlrf@7pF85AAJU({OAVHl;FL}vymV4gA?p0zqcsA zH6SYghv~`w(Leo+{U0TwsWAG%{=1X^S1tcJh;(w=2kjGgSB6R$_1V6RCLtLh*;@!X~U!R>WWXxboX_4_pmrr;$-YtT`83 zn&-Ag=OW_FCR*uz?MH^*!M3fgZ7GX_&X+*i8eaF_eD`k=K zJHwO~qqTP}K7@S?bB1$^-v=%Jn3mgX+xjBUqIHexw{N=4^?koWYS*GTVqVLi0EuzfaD{h?_nzBAFo3#26H zgk~jU@63fyL($X?So#=1?Tu|q4pk?&mZ5XR@2iVi(H~d}r{KR)-qSwFe&6pJy?JD< zqjUDA$^+_MGzYC(Qcmz#PAH#ROsWIuIijzt3Jc!8U&a?S)k`*d?qoM0H!wK+OKcUH z>l(cwCwp)8A%3y_K#9u>)_?N>gc%!4!fd?^AJwm^7la65;i*MFM~~+mg#9KHjK==| z(s<5C$dd5-g?)Rx$@0E%a^n{{($no@r6+3qV%mO6DRr4)cD%@m1n7x}E%2ViWe0;G zX1V&j`Oj1&Ux?D5>cxwM4g9?uJ#VvbF9sma_{sv+uqk~<#czER#ScVPr;_pRfw$=J z!Ic`6vRLu#Lh&@mS7>x4S_0mAE{uPQ?>z|DA26}On*&HZT81YI9*Eh!Wos@0a zIZnJIZb18^%C~y41)ut@N~BKXCjL+Yh7x?W$xffG9y^I6-`>Pvgohe4bi6a#;#H)aM@7ob0--m6B|c2CH|xLh}YO;j;_n3$5Y zdw*`1t@+vOtD6w#8bwBZ$O+{jXS%{a#eBW%Raf46(;eR5q{y3cM?)@&8bh)n4@odY zehe?vpTmfe&j}6Z1b6$gH&l)Gr|pF`_Gj1oTx05Ws5=AEB_0*!ZPf#8jh=1NUgQKD zk#&ν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 z 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�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 IMol{Y8#dVW&;S4c diff --git a/taglib/lib/pkgconfig/taglib.pc b/taglib/lib/pkgconfig/taglib.pc deleted file mode 100644 index f7b799a..0000000 --- a/taglib/lib/pkgconfig/taglib.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=C:/Users/TaurusXin/Downloads/ncmdump/taglib -exec_prefix=${prefix} -libdir=${prefix}/lib -includedir=${prefix}/include - -Name: TagLib -Description: Audio meta-data library -Requires: -Version: 1.13.1 -Libs: -L${libdir} -ltag -Cflags: -I${includedir} -I${includedir}/taglib diff --git a/taglib/lib/pkgconfig/taglib_c.pc b/taglib/lib/pkgconfig/taglib_c.pc deleted file mode 100644 index 68c15e7..0000000 --- a/taglib/lib/pkgconfig/taglib_c.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=C:/Users/TaurusXin/Downloads/ncmdump/taglib -exec_prefix=${prefix} -libdir=${prefix}/lib -includedir=${prefix}/include - -Name: TagLib C Bindings -Description: Audio meta-data library (C bindings) -Requires: taglib -Version: 1.13.1 -Libs: -L${libdir} -ltag_c -Cflags: -I${includedir}/taglib