]> granicus.if.org Git - taglib/commitdiff
Patches from Aaron VonderHaar for a GEOB frame implementation.
authorScott Wheeler <wheeler@kde.org>
Thu, 31 Aug 2006 22:44:17 +0000 (22:44 +0000)
committerScott Wheeler <wheeler@kde.org>
Thu, 31 Aug 2006 22:44:17 +0000 (22:44 +0000)
Nice patches Aaron!

CCMAIL:taglib-devel@kde.org
CCMAIL:gruen0aermel@gmail.com

git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@579369 283d02a7-25f6-0310-bc7c-ecb5cbfe19da

mpeg/id3v2/frames/Makefile.am
mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp [new file with mode: 0644]
mpeg/id3v2/frames/generalencapsulatedobjectframe.h [new file with mode: 0644]
mpeg/id3v2/frames/textidentificationframe.cpp
mpeg/id3v2/id3v2framefactory.cpp

index 929485b3bff6f121b5b8640930ac64a407eab222..78474b5c34f59c0681cca2d72a9d7deaa19d316d 100644 (file)
@@ -9,6 +9,7 @@ noinst_LTLIBRARIES = libframes.la
 libframes_la_SOURCES = \
        attachedpictureframe.cpp \
        commentsframe.cpp \
+       generalencapsulatedobjectframe.cpp \
        relativevolumeframe.cpp \
        textidentificationframe.cpp \
        uniquefileidentifierframe.cpp \
@@ -17,6 +18,7 @@ libframes_la_SOURCES = \
 taglib_include_HEADERS = \
        attachedpictureframe.h \
        commentsframe.h \
+       generalencapsulatedobjectframe.h \
        relativevolumeframe.h \
        textidentificationframe.h \
        uniquefileidentifierframe.h \
diff --git a/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp b/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp
new file mode 100644 (file)
index 0000000..ecd6f10
--- /dev/null
@@ -0,0 +1,193 @@
+/***************************************************************************
+    copyright            : (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
+ *   USA                                                                   *
+ ***************************************************************************/
+
+#include <tdebug.h>
+
+#include "generalencapsulatedobjectframe.h"
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFramePrivate
+{
+public:
+  GeneralEncapsulatedObjectFramePrivate() : textEncoding(String::Latin1) {}
+
+  String::Type textEncoding;
+  String mimeType;
+  String fileName;
+  String description;
+  ByteVector data;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame() : Frame("GEOB")
+{
+    d = new GeneralEncapsulatedObjectFramePrivate;
+}
+
+GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data) : Frame(data)
+{
+  setData(data);
+  d = new GeneralEncapsulatedObjectFramePrivate;
+}
+
+GeneralEncapsulatedObjectFrame::~GeneralEncapsulatedObjectFrame()
+{
+  delete d;
+}
+
+String GeneralEncapsulatedObjectFrame::toString() const
+{
+  String text = "[" + d->mimeType + "]";
+
+  if(!d->fileName.isEmpty())
+    text += " " + d->fileName;
+
+  if(!d->description.isEmpty())
+    text += " \"" + d->description + "\" ";
+
+  return text;
+}
+
+String::Type GeneralEncapsulatedObjectFrame::textEncoding() const
+{
+  return d->textEncoding;
+}
+
+void GeneralEncapsulatedObjectFrame::setTextEncoding(String::Type encoding)
+{
+  d->textEncoding = encoding;
+}
+
+String GeneralEncapsulatedObjectFrame::mimeType() const
+{
+  return d->mimeType;
+}
+
+void GeneralEncapsulatedObjectFrame::setMimeType(const String &type)
+{
+  d->mimeType = type;
+}
+
+String GeneralEncapsulatedObjectFrame::fileName() const
+{
+  return d->fileName;
+}
+
+void GeneralEncapsulatedObjectFrame::setFileName(const String &name)
+{
+  d->fileName = name;
+}
+
+String GeneralEncapsulatedObjectFrame::description() const
+{
+  return d->description;
+}
+
+void GeneralEncapsulatedObjectFrame::setDescription(const String &desc)
+{
+  d->description = desc;
+}
+
+ByteVector GeneralEncapsulatedObjectFrame::object() const
+{
+  return d->data;
+}
+
+void GeneralEncapsulatedObjectFrame::setObject(const ByteVector &data)
+{
+  d->data = data;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void GeneralEncapsulatedObjectFrame::parseFields(const ByteVector &data)
+{
+  if(data.size() < 4) {
+    debug("An object frame must contain at least 4 bytes.");
+    return;
+  }
+
+  int fieldStart = 0;
+
+  d->textEncoding = String::Type(data[fieldStart]);
+  fieldStart += 1;
+
+  int fieldEnd = data.find(textDelimiter(String::Latin1), fieldStart);
+
+  if(fieldEnd < fieldStart)
+    return;
+
+  d->mimeType = String(data.mid(fieldStart, fieldEnd - fieldStart), String::Latin1);
+  fieldStart = fieldEnd + 1;
+
+  fieldEnd = data.find(textDelimiter(d->textEncoding), fieldStart);
+
+  if(fieldEnd < fieldStart)
+    return;
+
+  d->fileName = String(data.mid(fieldStart, fieldEnd - fieldStart), d->textEncoding);
+  fieldStart = fieldEnd + 1;
+
+  fieldEnd = data.find(textDelimiter(d->textEncoding), fieldStart);
+
+  if(fieldEnd < fieldStart)
+    return;
+
+  d->description = String(data.mid(fieldStart, fieldEnd - fieldStart), d->textEncoding);
+  fieldStart = fieldEnd + 1;
+
+  d->data = data.mid(fieldStart);
+}
+
+ByteVector GeneralEncapsulatedObjectFrame::renderFields() const
+{
+  ByteVector data;
+
+  data.append(char(d->textEncoding));
+  data.append(d->mimeType.data(String::Latin1));
+  data.append(textDelimiter(String::Latin1));
+  data.append(d->fileName.data(d->textEncoding));
+  data.append(textDelimiter(d->textEncoding));
+  data.append(d->description.data(d->textEncoding));
+  data.append(textDelimiter(d->textEncoding));
+  data.append(d->data);
+
+  return data;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+  d = new GeneralEncapsulatedObjectFramePrivate;
+  parseFields(fieldData(data));
+}
diff --git a/mpeg/id3v2/frames/generalencapsulatedobjectframe.h b/mpeg/id3v2/frames/generalencapsulatedobjectframe.h
new file mode 100644 (file)
index 0000000..b1d3c5f
--- /dev/null
@@ -0,0 +1,169 @@
+/***************************************************************************
+    copyright            : (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
+ *   USA                                                                   *
+ ***************************************************************************/
+
+#ifndef TAGLIB_GENERALENCAPSULATEDOBJECT_H
+#define TAGLIB_GENERALENCAPSULATEDOBJECT_H
+
+#include <id3v2frame.h>
+#include <id3v2header.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 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.
+       */
+      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;
+    };
+  }
+}
+
+#endif
index 26afe10cdc6b7c2211737a0fb0ade2820d4d0364..8d61378e479ccb6de20d6aff90991fc870febe10 100644 (file)
@@ -122,7 +122,7 @@ ByteVector TextIdentificationFrame::renderFields() const
 
   v.append(char(d->textEncoding));
 
-  for(StringList::Iterator it = d->fieldList.begin(); it != d->fieldList.end(); it++) {
+  for(StringList::ConstIterator it = d->fieldList.begin(); it != d->fieldList.end(); it++) {
 
     // Since the field list is null delimited, if this is not the first
     // element in the list, append the appropriate delimiter for this
index 1761f9b76d4d2c8a572e118b047055076028479a..2d9f552153bdab75b8cc2f5321b569b6eccdee05 100644 (file)
@@ -31,6 +31,7 @@
 #include "frames/textidentificationframe.h"
 #include "frames/uniquefileidentifierframe.h"
 #include "frames/unknownframe.h"
+#include "frames/generalencapsulatedobjectframe.h"
 
 using namespace TagLib;
 using namespace ID3v2;
@@ -156,6 +157,11 @@ Frame *FrameFactory::createFrame(const ByteVector &data, uint version) const
   if(frameID == "UFID")
     return new UniqueFileIdentifierFrame(data, header);
 
+  // General Encapsulated Object (frames 4.15)
+
+  if(frameID == "GEOB")
+      return new GeneralEncapsulatedObjectFrame(data, header);
+
   return new UnknownFrame(data, header);
 }