]> granicus.if.org Git - taglib/commitdiff
Add support for Unknown TXXX frames.
authorMichael Helmling <helmling@mathematik.uni-kl.de>
Sun, 26 Feb 2012 17:07:02 +0000 (18:07 +0100)
committerMichael Helmling <helmling@mathematik.uni-kl.de>
Sun, 26 Feb 2012 17:07:02 +0000 (18:07 +0100)
taglib/mpeg/id3v2/id3v2frame.cpp
taglib/mpeg/id3v2/id3v2tag.cpp

index 7a7c0da1a1810a6d82e446ab77d563c688221b9c..ed023123871b6f603d5f995f318237b5b554c76e 100644 (file)
@@ -431,9 +431,16 @@ PropertyMap Frame::asProperties() const
 {
   const ByteVector &id = frameID();
   // workaround until this function is virtual
-  if(id == "TXXX")
-    return dynamic_cast< const UserTextIdentificationFrame* >(this)->asProperties();
-  else if(id[0] == 'T')
+  if(id == "TXXX") {
+    const UserTextIdentificationFrame *txxxFrame = dynamic_cast< const UserTextIdentificationFrame* >(this);
+    if(txxxFrame != NULL)
+      return txxxFrame->asProperties();
+    else {
+      PropertyMap m;
+      m.unsupportedData().append("UNKNOWN");
+      return m;
+    }
+  } else if(id[0] == 'T')
     return dynamic_cast< const TextIdentificationFrame* >(this)->asProperties();
   else if(id == "WXXX")
     return dynamic_cast< const UserUrlLinkFrame* >(this)->asProperties();
@@ -443,11 +450,9 @@ PropertyMap Frame::asProperties() const
     return dynamic_cast< const CommentsFrame* >(this)->asProperties();
   else if(id == "USLT")
     return dynamic_cast< const UnsynchronizedLyricsFrame* >(this)->asProperties();
-  else {
-    PropertyMap m;
-    m.unsupportedData().append(id);
-    return m;
-  }
+  PropertyMap m;
+  m.unsupportedData().append(id);
+  return m;
 }
 
 void Frame::splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties,
index 4731ba556d1d3836dd0a950eda08b227ae25160b..49c0c517800ce41dedf0287a69d28c5d18577e49 100644 (file)
@@ -350,24 +350,32 @@ void ID3v2::Tag::removeUnsupportedProperties(const StringList &properties)
   // by the PropertyMap interface. Three special cases exist: TXXX, WXXX, and COMM
   // frames may also be unsupported if their description() is not a valid key.
   for(StringList::ConstIterator it = properties.begin(); it != properties.end(); ++it){
-    ByteVector id = it->substr(0,4).data(String::Latin1);
-    if(id == "TXXX") {
-      String description = it->substr(5);
-      Frame *frame = UserTextIdentificationFrame::find(this, description);
-      if(frame)
-        removeFrame(frame);
-    } else if(id == "WXXX") {
-      String description = it->substr(5);
-      Frame *frame = UserUrlLinkFrame::find(this, description);
-      if(frame)
-        removeFrame(frame);
-    } else if(id == "COMM") {
-      String description = it->substr(5);
-      Frame *frame = CommentsFrame::findByDescription(this, description);
-      if(frame)
-        removeFrame(frame);
-    } else
-      removeFrames(id); // there should be only one frame with "id"
+    if(*it == "UNKNOWN") {
+      // delete all unknown frames
+      FrameList l = frameList();
+      for(FrameList::ConstIterator fit = l.begin(); fit != l.end(); fit++)
+        if (dynamic_cast<const UnknownFrame *>(*fit) != NULL)
+          removeFrame(*fit);
+    } else {
+      ByteVector id = it->substr(0,4).data(String::Latin1);
+      if(id == "TXXX") {
+        String description = it->substr(5);
+        Frame *frame = UserTextIdentificationFrame::find(this, description);
+        if(frame)
+          removeFrame(frame);
+      } else if(id == "WXXX") {
+        String description = it->substr(5);
+        Frame *frame = UserUrlLinkFrame::find(this, description);
+        if(frame)
+          removeFrame(frame);
+      } else if(id == "COMM") {
+        String description = it->substr(5);
+        Frame *frame = CommentsFrame::findByDescription(this, description);
+        if(frame)
+          removeFrame(frame);
+      } else
+        removeFrames(id); // there should be only one frame with "id"
+    }
   }
 }