libframes_la_SOURCES = \
attachedpictureframe.cpp \
commentsframe.cpp \
+ generalencapsulatedobjectframe.cpp \
relativevolumeframe.cpp \
textidentificationframe.cpp \
uniquefileidentifierframe.cpp \
taglib_include_HEADERS = \
attachedpictureframe.h \
commentsframe.h \
+ generalencapsulatedobjectframe.h \
relativevolumeframe.h \
textidentificationframe.h \
uniquefileidentifierframe.h \
--- /dev/null
+/***************************************************************************
+ 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));
+}
--- /dev/null
+/***************************************************************************
+ 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
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
#include "frames/textidentificationframe.h"
#include "frames/uniquefileidentifierframe.h"
#include "frames/unknownframe.h"
+#include "frames/generalencapsulatedobjectframe.h"
using namespace TagLib;
using namespace ID3v2;
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);
}