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
This commit is contained in:
Scott Wheeler 2005-05-17 23:57:23 +00:00
parent 6ceb7a8151
commit 1857e61a9d
4 changed files with 31 additions and 5 deletions

View File

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

View File

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

View File

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

View File

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