From 9947f45b31809d4db027a4e6ab30c54abce4354d Mon Sep 17 00:00:00 2001 From: Scott Wheeler Date: Thu, 26 Jun 2008 15:06:20 +0000 Subject: [PATCH] Add support for private frames. git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@824701 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- taglib/CMakeLists.txt | 1 + taglib/mpeg/id3v2/frames/CMakeLists.txt | 1 + taglib/mpeg/id3v2/frames/Makefile.am | 2 + taglib/mpeg/id3v2/frames/privateframe.cpp | 128 ++++++++++++++++++++++ taglib/mpeg/id3v2/frames/privateframe.h | 111 +++++++++++++++++++ taglib/mpeg/id3v2/id3v2framefactory.cpp | 9 +- 6 files changed, 250 insertions(+), 2 deletions(-) create mode 100755 taglib/mpeg/id3v2/frames/privateframe.cpp create mode 100755 taglib/mpeg/id3v2/frames/privateframe.h diff --git a/taglib/CMakeLists.txt b/taglib/CMakeLists.txt index 9ad3c816..4e9b7139 100644 --- a/taglib/CMakeLists.txt +++ b/taglib/CMakeLists.txt @@ -65,6 +65,7 @@ mpeg/id3v2/frames/attachedpictureframe.cpp mpeg/id3v2/frames/commentsframe.cpp mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp mpeg/id3v2/frames/popularimeterframe.cpp +mpeg/id3v2/frames/privateframe.cpp mpeg/id3v2/frames/relativevolumeframe.cpp mpeg/id3v2/frames/textidentificationframe.cpp mpeg/id3v2/frames/uniquefileidentifierframe.cpp diff --git a/taglib/mpeg/id3v2/frames/CMakeLists.txt b/taglib/mpeg/id3v2/frames/CMakeLists.txt index caa08561..6636ddec 100644 --- a/taglib/mpeg/id3v2/frames/CMakeLists.txt +++ b/taglib/mpeg/id3v2/frames/CMakeLists.txt @@ -3,6 +3,7 @@ INSTALL(FILES commentsframe.h generalencapsulatedobjectframe.h popularimeterframe.h + privateframe.h relativevolumeframe.h textidentificationframe.h uniquefileidentifierframe.h diff --git a/taglib/mpeg/id3v2/frames/Makefile.am b/taglib/mpeg/id3v2/frames/Makefile.am index 416e4abc..0f8231f8 100644 --- a/taglib/mpeg/id3v2/frames/Makefile.am +++ b/taglib/mpeg/id3v2/frames/Makefile.am @@ -11,6 +11,7 @@ libframes_la_SOURCES = \ commentsframe.cpp \ generalencapsulatedobjectframe.cpp \ popularimeterframe.cpp \ + privateframe.cpp \ relativevolumeframe.cpp \ textidentificationframe.cpp \ uniquefileidentifierframe.cpp \ @@ -23,6 +24,7 @@ taglib_include_HEADERS = \ commentsframe.h \ generalencapsulatedobjectframe.h \ popularimeterframe.h \ + privateframe.h \ relativevolumeframe.h \ textidentificationframe.h \ uniquefileidentifierframe.h \ diff --git a/taglib/mpeg/id3v2/frames/privateframe.cpp b/taglib/mpeg/id3v2/frames/privateframe.cpp new file mode 100755 index 00000000..9491561f --- /dev/null +++ b/taglib/mpeg/id3v2/frames/privateframe.cpp @@ -0,0 +1,128 @@ +/*************************************************************************** + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#include +#include +#include + +#include "privateframe.h" + +using namespace TagLib; +using namespace ID3v2; + + +class PrivateFrame::PrivateFramePrivate +{ +public: + ByteVector data; + String owner; +}; + +//////////////////////////////////////////////////////////////////////////////// +// public members +//////////////////////////////////////////////////////////////////////////////// + +PrivateFrame::PrivateFrame() : Frame("PRIV") +{ + d = new PrivateFramePrivate; +} + +PrivateFrame::PrivateFrame(const ByteVector &data) : Frame(data) +{ + d = new PrivateFramePrivate; + setData(data); +} + +PrivateFrame::~PrivateFrame() +{ + delete d; +} + +String PrivateFrame::toString() const +{ + return d->owner; +} + +String PrivateFrame::owner() const +{ + return d->owner; +} + +ByteVector PrivateFrame::data() const +{ + return d->data; +} + +void PrivateFrame::setOwner(const String &s) +{ + d->owner = s; +} + +void PrivateFrame::setData(const ByteVector & data) +{ + d->data = data; +} + +//////////////////////////////////////////////////////////////////////////////// +// protected members +//////////////////////////////////////////////////////////////////////////////// + +void PrivateFrame::parseFields(const ByteVector &data) +{ + if(data.size() < 2) { + debug("A private frame must contain at least 2 bytes."); + return; + } + + // Owner identifier is assumed to be Latin1 + + const int byteAlign = 1; + const int endOfOwner = data.find(textDelimiter(String::Latin1), 0, byteAlign); + + d->owner = String(data.mid(0, endOfOwner)); + d->data = data.mid(endOfOwner + 1); +} + +ByteVector PrivateFrame::renderFields() const +{ + ByteVector v; + + v.append(d->owner.data(String::Latin1)); + v.append(textDelimiter(String::Latin1)); + v.append(d->data); + + return v; +} + +//////////////////////////////////////////////////////////////////////////////// +// private members +//////////////////////////////////////////////////////////////////////////////// + +PrivateFrame::PrivateFrame(const ByteVector &data, Header *h) : Frame(h) +{ + d = new PrivateFramePrivate(); + parseFields(fieldData(data)); +} diff --git a/taglib/mpeg/id3v2/frames/privateframe.h b/taglib/mpeg/id3v2/frames/privateframe.h new file mode 100755 index 00000000..866a6d4c --- /dev/null +++ b/taglib/mpeg/id3v2/frames/privateframe.h @@ -0,0 +1,111 @@ +/*************************************************************************** + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#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; + }; + + } +} +#endif diff --git a/taglib/mpeg/id3v2/id3v2framefactory.cpp b/taglib/mpeg/id3v2/id3v2framefactory.cpp index 1a4d36ae..346c616d 100644 --- a/taglib/mpeg/id3v2/id3v2framefactory.cpp +++ b/taglib/mpeg/id3v2/id3v2framefactory.cpp @@ -42,6 +42,7 @@ #include "frames/urllinkframe.h" #include "frames/unsynchronizedlyricsframe.h" #include "frames/popularimeterframe.h" +#include "frames/privateframe.h" using namespace TagLib; using namespace ID3v2; @@ -223,9 +224,13 @@ Frame *FrameFactory::createFrame(const ByteVector &origData, Header *tagHeader) // Popularimeter (frames 4.17) - if(frameID == "POPM") { + if(frameID == "POPM") return new PopularimeterFrame(data, header); - } + + // Private (frames 4.27) + + if(frameID == "POPM") + return new PrivateFrame(data, header); return new UnknownFrame(data, header); }