| Summary: | doesn't keep parsing after discarding deprecated frame | ||
|---|---|---|---|
| Product: | [Unmaintained] taglib | Reporter: | Tom Kliethermes <thamus> |
| Component: | general | Assignee: | Scott Wheeler <wheeler> |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | ||
| Priority: | NOR | ||
| Version First Reported In: | unspecified | ||
| Target Milestone: | --- | ||
| Platform: | Gentoo Packages | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
|
Description
Tom Kliethermes
2005-03-01 03:16:40 UTC
Actually this is happening after it hits the TSIZ frame which isn't supported in ID3v2.4. The check to handle that case is a little broken. Sorry for not coming back sooner, I had some account/computer problems. I removed the TSIZ from some files and taglib was able to read the genre info fine. So, I went ahead and removed TSIZ from all the files since I don't need it and it look deprecated. SVN commit 415248 by wheeler:
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
M +5 -0 trunk/kdesupport/taglib/mpeg/id3v2/id3v2frame.cpp
M +20 -1 trunk/kdesupport/taglib/mpeg/id3v2/id3v2frame.h
M +2 -2 trunk/kdesupport/taglib/mpeg/id3v2/id3v2framefactory.cpp
M +4 -2 trunk/kdesupport/taglib/mpeg/id3v2/id3v2tag.cpp
--- trunk/kdesupport/taglib/mpeg/id3v2/id3v2frame.cpp #415247:415248
@@ -417,6 +417,11 @@
return d->tagAlterPreservation;
}
+void Frame::Header::setTagAlterPreservation(bool preserve)
+{
+ d->tagAlterPreservation = preserve;
+}
+
bool Frame::Header::fileAlterPreservation() const
{
return d->fileAlterPreservation;
--- trunk/kdesupport/taglib/mpeg/id3v2/id3v2frame.h #415247:415248
@@ -29,6 +29,7 @@
namespace ID3v2 {
+ class Tag;
class FrameFactory;
//! ID3v2 frame implementation
@@ -44,6 +45,7 @@
class Frame
{
+ friend class Tag;
friend class FrameFactory;
public:
@@ -295,11 +297,28 @@
/*!
* 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.
*
* \note This flag is currently ignored internally in TagLib.
--- trunk/kdesupport/taglib/mpeg/id3v2/id3v2framefactory.cpp #415247:415248
@@ -99,8 +99,8 @@
}
if(!updateFrame(header)) {
- delete header;
- return 0;
+ header->setTagAlterPreservation(true);
+ return new UnknownFrame(data, header);
}
// updateFrame() might have updated the frame ID.
--- trunk/kdesupport/taglib/mpeg/id3v2/id3v2tag.cpp #415247:415248
@@ -343,8 +343,10 @@
// 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.
|