From 1857e61a9d46354b4bb719266fa70cab4cc3059f Mon Sep 17 00:00:00 2001 From: Scott Wheeler Date: Tue, 17 May 2005 23:57:23 +0000 Subject: [PATCH] Instead of returning 0 on finding a deprecated frame type, create an UnknownFrame and set the flag to discard it on write. As a special bonus this meant implementing the discard-on-tag-alter flag. BUG:100515 git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@415248 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- mpeg/id3v2/id3v2frame.cpp | 5 +++++ mpeg/id3v2/id3v2frame.h | 21 ++++++++++++++++++++- mpeg/id3v2/id3v2framefactory.cpp | 4 ++-- mpeg/id3v2/id3v2tag.cpp | 6 ++++-- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/mpeg/id3v2/id3v2frame.cpp b/mpeg/id3v2/id3v2frame.cpp index 0675483c..f58e3500 100644 --- a/mpeg/id3v2/id3v2frame.cpp +++ b/mpeg/id3v2/id3v2frame.cpp @@ -417,6 +417,11 @@ bool Frame::Header::tagAlterPreservation() const return d->tagAlterPreservation; } +void Frame::Header::setTagAlterPreservation(bool preserve) +{ + d->tagAlterPreservation = preserve; +} + bool Frame::Header::fileAlterPreservation() const { return d->fileAlterPreservation; diff --git a/mpeg/id3v2/id3v2frame.h b/mpeg/id3v2/id3v2frame.h index 392bb71a..88607715 100644 --- a/mpeg/id3v2/id3v2frame.h +++ b/mpeg/id3v2/id3v2frame.h @@ -29,6 +29,7 @@ namespace TagLib { namespace ID3v2 { + class Tag; class FrameFactory; //! ID3v2 frame implementation @@ -44,6 +45,7 @@ namespace TagLib { class Frame { + friend class Tag; friend class FrameFactory; public: @@ -295,10 +297,27 @@ namespace TagLib { /*! * Returns true if the flag for tag alter preservation is set. * - * \note This flag is currently ignored internally in TagLib. + * The semantics are a little backwards from what would seem natural + * (setting the preservation flag to throw away the frame), but this + * follows the ID3v2 standard. + * + * \see setTagAlterPreservation() */ bool tagAlterPreservation() const; + /*! + * Sets the flag for preservation of this frame if the tag is set. If + * this is set to true the frame will not be written when the tag is + * saved. + * + * The semantics are a little backwards from what would seem natural + * (setting the preservation flag to throw away the frame), but this + * follows the ID3v2 standard. + * + * \see tagAlterPreservation() + */ + void setTagAlterPreservation(bool discard); + /*! * Returns true if the flag for file alter preservation is set. * diff --git a/mpeg/id3v2/id3v2framefactory.cpp b/mpeg/id3v2/id3v2framefactory.cpp index 1d695d08..1755b4d3 100644 --- a/mpeg/id3v2/id3v2framefactory.cpp +++ b/mpeg/id3v2/id3v2framefactory.cpp @@ -99,8 +99,8 @@ Frame *FrameFactory::createFrame(const ByteVector &data, uint version) const } if(!updateFrame(header)) { - delete header; - return 0; + header->setTagAlterPreservation(true); + return new UnknownFrame(data, header); } // updateFrame() might have updated the frame ID. diff --git a/mpeg/id3v2/id3v2tag.cpp b/mpeg/id3v2/id3v2tag.cpp index 3daa1515..1032489f 100644 --- a/mpeg/id3v2/id3v2tag.cpp +++ b/mpeg/id3v2/id3v2tag.cpp @@ -343,8 +343,10 @@ ByteVector ID3v2::Tag::render() const // Loop through the frames rendering them and adding them to the tagData. - for(FrameList::Iterator it = d->frameList.begin(); it != d->frameList.end(); it++) - tagData.append((*it)->render()); + for(FrameList::Iterator it = d->frameList.begin(); it != d->frameList.end(); it++) { + if(!(*it)->header()->tagAlterPreservation()) + tagData.append((*it)->render()); + } // Compute the amount of padding, and append that to tagData.