]> granicus.if.org Git - taglib/commitdiff
Add support for private frames.
authorScott Wheeler <wheeler@kde.org>
Thu, 26 Jun 2008 15:06:20 +0000 (15:06 +0000)
committerScott Wheeler <wheeler@kde.org>
Thu, 26 Jun 2008 15:06:20 +0000 (15:06 +0000)
git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@824701 283d02a7-25f6-0310-bc7c-ecb5cbfe19da

taglib/CMakeLists.txt
taglib/mpeg/id3v2/frames/CMakeLists.txt
taglib/mpeg/id3v2/frames/Makefile.am
taglib/mpeg/id3v2/frames/privateframe.cpp [new file with mode: 0755]
taglib/mpeg/id3v2/frames/privateframe.h [new file with mode: 0755]
taglib/mpeg/id3v2/id3v2framefactory.cpp

index 9ad3c816f9f0710928d9c9f024acee8b5c5d29f9..4e9b7139cae8d80c12bae1404365f2f5619034e7 100644 (file)
@@ -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
index caa08561292c759f30631afeedf24aab97d9f848..6636ddecb5214690ac712dd1ff0ba3def1ae0278 100644 (file)
@@ -3,6 +3,7 @@ INSTALL(FILES
        commentsframe.h
        generalencapsulatedobjectframe.h
        popularimeterframe.h
+       privateframe.h
        relativevolumeframe.h
        textidentificationframe.h
        uniquefileidentifierframe.h
index 416e4abc4a1363e506c25389eba99da3028ed128..0f8231f872042ef819aa03fc7894162b2f5c366b 100644 (file)
@@ -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 (executable)
index 0000000..9491561
--- /dev/null
@@ -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 <tbytevectorlist.h>
+#include <id3v2tag.h>
+#include <tdebug.h>
+
+#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 (executable)
index 0000000..866a6d4
--- /dev/null
@@ -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
index 1a4d36ae3e73e3e9d031ef0d3093421f12254ae5..346c616de22597575569dd215c2c24c52a56c2bf 100644 (file)
@@ -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);
 }