Add support for private frames.

git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@824701 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
This commit is contained in:
Scott Wheeler 2008-06-26 15:06:20 +00:00
parent 07a6c86a31
commit 9947f45b31
6 changed files with 250 additions and 2 deletions

View 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

View File

@ -3,6 +3,7 @@ INSTALL(FILES
commentsframe.h
generalencapsulatedobjectframe.h
popularimeterframe.h
privateframe.h
relativevolumeframe.h
textidentificationframe.h
uniquefileidentifierframe.h

View 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 \

View File

@ -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));
}

View File

@ -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

View 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);
}