From 3a1040d55b25e41680ca3ae6e101a5eb8fe5d19a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Krej=C4=8D=C3=AD?= Date: Sat, 20 Apr 2013 16:49:57 +0200 Subject: [PATCH] Added basic members of ChapterFrame and TableOfContentsFrame classes. Fixed minor bugs in ChapterFrame and TableOfContentsFrame headers. --- taglib/mpeg/id3v2/frames/chapterframe.cpp | 97 +++++++++++++------ taglib/mpeg/id3v2/frames/chapterframe.h | 5 +- .../id3v2/frames/tableofcontentsframe.cpp | 90 +++++++++++------ .../mpeg/id3v2/frames/tableofcontentsframe.h | 15 +-- 4 files changed, 139 insertions(+), 68 deletions(-) diff --git a/taglib/mpeg/id3v2/frames/chapterframe.cpp b/taglib/mpeg/id3v2/frames/chapterframe.cpp index a0e842e0..1474db1a 100644 --- a/taglib/mpeg/id3v2/frames/chapterframe.cpp +++ b/taglib/mpeg/id3v2/frames/chapterframe.cpp @@ -28,60 +28,96 @@ #include #include "id3v2tag.h" -#include "uniquefileidentifierframe.h" +#include "chapterframe.h" using namespace TagLib; using namespace ID3v2; -class UniqueFileIdentifierFrame::UniqueFileIdentifierFramePrivate +class ChapterFrame::ChapterFramePrivate { public: - String owner; - ByteVector identifier; + ByteVector elementID; + uint startTime; + uint endTime; + uint startOffset; + uint endOffset; }; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data) : +ChapterFrame::ChapterFrame(const ByteVector &data) : ID3v2::Frame(data) { - d = new UniqueFileIdentifierFramePrivate; + d = new ChapterFramePrivate; setData(data); } -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const String &owner, const ByteVector &id) : - ID3v2::Frame("UFID") +ChapterFrame::ChapterFrame(const ByteVector &eID, const int &sT, const int &eT, const int &sO, const int &eO) : + ID3v2::Frame("CHAP") { - d = new UniqueFileIdentifierFramePrivate; - d->owner = owner; - d->identifier = id; + d = new ChapterFramePrivate; + d->elementID = eID; + d->startTime = sT; + d->endTime = eT; + d->startOffset = sO; + d->endOffset = e0; } -UniqueFileIdentifierFrame::~UniqueFileIdentifierFrame() +ChapterFrame::~ChapterFrame() { delete d; } -String UniqueFileIdentifierFrame::owner() const +ByteVector ChapterFrame::elementID() const { - return d->owner; + return d->elementID; } -ByteVector UniqueFileIdentifierFrame::identifier() const +uint ChapterFrame::startTime() const { - return d->identifier; + return d->startTime; } -void UniqueFileIdentifierFrame::setOwner(const String &s) +uint ChapterFrame::endTime() const { - d->owner = s; + return d->endTime; } -void UniqueFileIdentifierFrame::setIdentifier(const ByteVector &v) +uint ChapterFrame::startOffset() const { - d->identifier = v; + return d->startOffset; +} + +uint ChapterFrame::endOffset() const +{ + return d->endOffset; +} + +void ChapterFrame::setElementID(const ByteVector &eID) +{ + d->elementID = eID; +} + +void ChapterFrame::setStartTime(const uint &sT) +{ + d->startTime = sT; +} + +void ChapterFrame::setEndTime(const uint &eT) +{ + d->endTime = eT; +} + +void ChapterFrame::setStartOffset(const uint &sO) +{ + d->startOffset = sO; +} + +void ChapterFrame::setEndOffset(const uint &eO) +{ + d->endOffset = eO; } String UniqueFileIdentifierFrame::toString() const @@ -89,8 +125,9 @@ String UniqueFileIdentifierFrame::toString() const return String::null; } -PropertyMap UniqueFileIdentifierFrame::asProperties() const +PropertyMap ChapterFrame::asProperties() const { + //DODELAT PropertyMap map; if(d->owner == "http://musicbrainz.org") { map.insert("MUSICBRAINZ_TRACKID", String(d->identifier)); @@ -101,24 +138,25 @@ PropertyMap UniqueFileIdentifierFrame::asProperties() const return map; } -UniqueFileIdentifierFrame *UniqueFileIdentifierFrame::findByOwner(const ID3v2::Tag *tag, const String &o) // static +ChapterFrame *ChapterFrame::findByElementID(const Tag *tag, const ByteVector &eID) // static { - ID3v2::FrameList comments = tag->frameList("UFID"); + ID3v2::FrameList comments = tag->frameList("CHAP"); for(ID3v2::FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { - UniqueFileIdentifierFrame *frame = dynamic_cast(*it); - if(frame && frame->owner() == o) + ChapterFrame *frame = dynamic_cast(*it); + if(frame && frame->elementID() == eID) return frame; } return 0; } -void UniqueFileIdentifierFrame::parseFields(const ByteVector &data) +void ChapterFrame::parseFields(const ByteVector &data) { + //DODELAT if(data.size() < 1) { debug("An UFID frame must contain at least 1 byte."); return; @@ -129,8 +167,9 @@ void UniqueFileIdentifierFrame::parseFields(const ByteVector &data) d->identifier = data.mid(pos); } -ByteVector UniqueFileIdentifierFrame::renderFields() const +ByteVector ChapterFrame::renderFields() const { + //DODELAT ByteVector data; data.append(d->owner.data(String::Latin1)); @@ -140,9 +179,9 @@ ByteVector UniqueFileIdentifierFrame::renderFields() const return data; } -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data, Header *h) : +ChapterFrame::ChapterFrame(const ByteVector &data, Header *h) : Frame(h) { - d = new UniqueFileIdentifierFramePrivate; + d = new ChapterFramePrivate; parseFields(fieldData(data)); } diff --git a/taglib/mpeg/id3v2/frames/chapterframe.h b/taglib/mpeg/id3v2/frames/chapterframe.h index 192711ce..ce9096cf 100644 --- a/taglib/mpeg/id3v2/frames/chapterframe.h +++ b/taglib/mpeg/id3v2/frames/chapterframe.h @@ -54,7 +54,7 @@ namespace TagLib { * start time \a sT, end time \a eT, start offset \a sO * and end offset \a eO. */ - ChapterFrame(const ByteVector &eID, const int &sT, const int &eT, const int &sO, const int &eO); + ChapterFrame(const ByteVector &eID, const uint &sT, const uint &eT, const uint &sO, const uint &eO); /*! * Destroys the frame. @@ -143,7 +143,8 @@ namespace TagLib { /*! * CHAP frames each have a unique element ID. This searches for a CHAP - * frame with the element ID \a eID and returns a pointer to it. + * frame with the element ID \a eID and returns a pointer to it. This + * can be used to link CTOC and CHAP frames together. * * \see elementID() */ diff --git a/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp b/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp index a0e842e0..1cb24b50 100644 --- a/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp +++ b/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp @@ -28,69 +28,97 @@ #include #include "id3v2tag.h" -#include "uniquefileidentifierframe.h" +#include "tableofcontentsframe.h" using namespace TagLib; using namespace ID3v2; -class UniqueFileIdentifierFrame::UniqueFileIdentifierFramePrivate +class TableOfContentsFrame::TableOfContentsFramePrivate { public: - String owner; - ByteVector identifier; + ByteVector elementID; + bool isTopLevel; + bool isOrdered; + ByteVectorList childElements; }; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data) : +TableOfContentsFrame::TableOfContentsFrame(const ByteVector &data) : ID3v2::Frame(data) { - d = new UniqueFileIdentifierFramePrivate; + d = new TableOfContentsFramePrivate; setData(data); } -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const String &owner, const ByteVector &id) : - ID3v2::Frame("UFID") +TableOfContentsFrame::TableOfContentsFrame(const ByteVector &eID, const ByteVectorList &ch) : + ID3v2::Frame("CTOC") { - d = new UniqueFileIdentifierFramePrivate; - d->owner = owner; - d->identifier = id; + d = new TableOfContentsFramePrivate; + d->elementID = eID; + d->childElements = ch; } -UniqueFileIdentifierFrame::~UniqueFileIdentifierFrame() +TableOfContentsFrame::~TableOfContentsFrame() { delete d; } -String UniqueFileIdentifierFrame::owner() const +ByteVector TableOfContentsFrame::elementID() const { - return d->owner; + return d->elementID; } -ByteVector UniqueFileIdentifierFrame::identifier() const +bool TableOfContentsFrame::isTopLevel() const { - return d->identifier; + return d->isTopLevel; } -void UniqueFileIdentifierFrame::setOwner(const String &s) +bool TableOfContentsFrame::isOrdered() const { - d->owner = s; + return d->isOrdered; } -void UniqueFileIdentifierFrame::setIdentifier(const ByteVector &v) +unsigned char TableOfContentsFrame::entryCount() const { - d->identifier = v; + return (unsigned char)(d->childElements.size()); } -String UniqueFileIdentifierFrame::toString() const +ByteVectorList TableOfContentsFrame::childElements const +{ + return d->childElements; +} + +void TableOfContentsFrame::setElementID(const ByteVector &eID) +{ + d->elementID = eID; +} + +void TableOfContentsFrame::setIsTopLevel(const bool &t) +{ + d->isTopLevel = t; +} + +void TableOfContentsFrame::setIsOrdered(const bool &o) +{ + d->isOrdered = o; +} + +void TableOfContentsFrame::setChildElements(const ByteVectorList &l) +{ + d->childElements = l; +} + +String TableOfContentsFrame::toString() const { return String::null; } -PropertyMap UniqueFileIdentifierFrame::asProperties() const +PropertyMap TableOfContentsFrame::asProperties() const { + //DODELAT PropertyMap map; if(d->owner == "http://musicbrainz.org") { map.insert("MUSICBRAINZ_TRACKID", String(d->identifier)); @@ -101,24 +129,25 @@ PropertyMap UniqueFileIdentifierFrame::asProperties() const return map; } -UniqueFileIdentifierFrame *UniqueFileIdentifierFrame::findByOwner(const ID3v2::Tag *tag, const String &o) // static +TableOfContentsFrame *TableOfContentsFrame::findByElementID(const ID3v2::Tag *tag, const ByteVector &eID) // static { - ID3v2::FrameList comments = tag->frameList("UFID"); + ID3v2::FrameList comments = tag->frameList("CTOC"); for(ID3v2::FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { - UniqueFileIdentifierFrame *frame = dynamic_cast(*it); - if(frame && frame->owner() == o) + TableOfContentsFrame *frame = dynamic_cast(*it); + if(frame && frame->elementID() == eID) return frame; } return 0; } -void UniqueFileIdentifierFrame::parseFields(const ByteVector &data) +void TableOfContentsFrame::parseFields(const ByteVector &data) { + //DODELAT if(data.size() < 1) { debug("An UFID frame must contain at least 1 byte."); return; @@ -129,8 +158,9 @@ void UniqueFileIdentifierFrame::parseFields(const ByteVector &data) d->identifier = data.mid(pos); } -ByteVector UniqueFileIdentifierFrame::renderFields() const +ByteVector TableOfContentsFrame::renderFields() const { + //DODELAT ByteVector data; data.append(d->owner.data(String::Latin1)); @@ -140,9 +170,9 @@ ByteVector UniqueFileIdentifierFrame::renderFields() const return data; } -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data, Header *h) : +TableOfContentsFrame::TableOfContentsFrame(const ByteVector &data, Header *h) : Frame(h) { - d = new UniqueFileIdentifierFramePrivate; + d = new TableOfContentsFramePrivate; parseFields(fieldData(data)); } diff --git a/taglib/mpeg/id3v2/frames/tableofcontentsframe.h b/taglib/mpeg/id3v2/frames/tableofcontentsframe.h index 54fb68b4..0d189dfc 100644 --- a/taglib/mpeg/id3v2/frames/tableofcontentsframe.h +++ b/taglib/mpeg/id3v2/frames/tableofcontentsframe.h @@ -53,12 +53,12 @@ namespace TagLib { * Creates a table of contents frame with the element ID \a eID and * the child elements \a ch. */ - UniqueFileIdentifierFrame(const ByteVector &eID, const List &ch); + TableOfContentsFrame(const ByteVector &eID, const ByteVectorList &ch); /*! * Destroys the frame. */ - ~UniqueFileIdentifierFrame(); + ~TableOfContentsFrame(); /*! * Returns the elementID of the frame. Element ID @@ -88,7 +88,7 @@ namespace TagLib { * Returns count of child elements of the frame. It allways * corresponds to size of child elements list. * - * \note Return type should be uint8_t. + * \note Return type should be uint8_t, not unsigned char. * \see childElements() */ unsigned char entryCount() const; @@ -98,7 +98,7 @@ namespace TagLib { * * \see setChildElements() */ - List childElements() const; + ByteVectorList childElements() const; /*! * Sets the elementID of the frame to \a eID. @@ -129,7 +129,7 @@ namespace TagLib { * * \see childElements() */ - void setChildElements(const List &l); + void setChildElements(const ByteVectorList &l); virtual String toString() const; @@ -137,11 +137,12 @@ namespace TagLib { /*! * CTOC frames each have a unique element ID. This searches for a CTOC - * frame with the element ID \a eID and returns a pointer to it. + * frame with the element ID \a eID and returns a pointer to it. This + * can be used to link together parent and child CTOC frames. * * \see elementID() */ - static UniqueFileIdentifierFrame *findByElementID(const Tag *tag, const ByteVector &eID); + static TableOfContentsFrame *findByElementID(const Tag *tag, const ByteVector &eID); protected: virtual void parseFields(const ByteVector &data);