From c0ca5c97d51512a40b4f75f0daeea7ce44302ec9 Mon Sep 17 00:00:00 2001
From: Michael Helmling <helmling@mathematik.uni-kl.de>
Date: Mon, 10 Dec 2012 20:56:16 +0100
Subject: [PATCH] Fix issue #88 by changing the behavior of setProperties().

For file types that support multiple tag standards (for example, FLAC
files can have ID3v1, ID3v2, and Vorbis comments) setProperties is now
called for all existing tags instead of only for the most recommended
one.
This fixes the problem that under some circumstances it was not possible
to delete a value using setProperties() because upon save() the call to
Tag::duplicate recovered that value from the ID3v1 tag.
---
 taglib/ape/apefile.cpp             | 12 ++++++------
 taglib/flac/flacfile.cpp           | 16 ++++++++--------
 taglib/mpc/mpcfile.cpp             | 13 ++++++-------
 taglib/mpeg/mpegfile.cpp           | 17 +++++++++--------
 taglib/trueaudio/trueaudiofile.cpp | 12 ++++++------
 taglib/wavpack/wavpackfile.cpp     | 12 ++++++------
 6 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/taglib/ape/apefile.cpp b/taglib/ape/apefile.cpp
index 2572a2e9..fae4ab03 100644
--- a/taglib/ape/apefile.cpp
+++ b/taglib/ape/apefile.cpp
@@ -131,12 +131,12 @@ void APE::File::removeUnsupportedProperties(const StringList &properties)
 
 PropertyMap APE::File::setProperties(const PropertyMap &properties)
 {
-  if(d->hasAPE)
-    return d->tag.access<APE::Tag>(ApeAPEIndex, false)->setProperties(properties);
-  else if(d->hasID3v1)
-    return d->tag.access<ID3v1::Tag>(ApeID3v1Index, false)->setProperties(properties);
-  else
-    return d->tag.access<APE::Tag>(ApeAPEIndex, true)->setProperties(properties);
+  PropertyMap result;
+  if(d->hasID3v1)
+    result = d->tag.access<ID3v1::Tag>(ApeID3v1Index, false)->setProperties(properties);
+  if(d->hasAPE || !d->hasID3v1)
+    result = d->tag.access<APE::Tag>(ApeAPEIndex, true)->setProperties(properties);
+  return result;
 }
 
 APE::Properties *APE::File::audioProperties() const
diff --git a/taglib/flac/flacfile.cpp b/taglib/flac/flacfile.cpp
index 0bfe84c3..26d79974 100644
--- a/taglib/flac/flacfile.cpp
+++ b/taglib/flac/flacfile.cpp
@@ -168,14 +168,14 @@ void FLAC::File::removeUnsupportedProperties(const StringList &unsupported)
 
 PropertyMap FLAC::File::setProperties(const PropertyMap &properties)
 {
-  if(d->hasXiphComment)
-    return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, false)->setProperties(properties);
-  else if(d->hasID3v2)
-    return d->tag.access<ID3v2::Tag>(FlacID3v2Index, false)->setProperties(properties);
-  else if(d->hasID3v1)
-    return d->tag.access<ID3v1::Tag>(FlacID3v1Index, false)->setProperties(properties);
-  else
-    return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, true)->setProperties(properties);
+  PropertyMap result;
+  if(d->hasID3v1)
+      result = d->tag.access<ID3v1::Tag>(FlacID3v1Index, false)->setProperties(properties);
+  if(d->hasID3v2)
+      result = d->tag.access<ID3v2::Tag>(FlacID3v2Index, false)->setProperties(properties);
+  if(d->hasXiphComment || !(d->hasID3v1 || d->hasID3v2))
+    result = d->tag.access<Ogg::XiphComment>(FlacXiphIndex, true)->setProperties(properties);
+  return result;
 }
 
 FLAC::Properties *FLAC::File::audioProperties() const
diff --git a/taglib/mpc/mpcfile.cpp b/taglib/mpc/mpcfile.cpp
index 18f533f8..6d6b3f6b 100644
--- a/taglib/mpc/mpcfile.cpp
+++ b/taglib/mpc/mpcfile.cpp
@@ -135,15 +135,14 @@ void MPC::File::removeUnsupportedProperties(const StringList &properties)
 
 PropertyMap MPC::File::setProperties(const PropertyMap &properties)
 {
-  if(d->hasAPE)
-    return d->tag.access<APE::Tag>(MPCAPEIndex, false)->setProperties(properties);
-  else if(d->hasID3v1)
-    return d->tag.access<ID3v1::Tag>(MPCID3v1Index, false)->setProperties(properties);
-  else
-    return d->tag.access<APE::Tag>(APE, true)->setProperties(properties);
+  PropertyMap result;
+  if(d->hasID3v1)
+    result = d->tag.access<ID3v1::Tag>(MPCID3v1Index, false)->setProperties(properties);
+  if(d->hasAPE || !d->hasID3v1)
+    result = d->tag.access<APE::Tag>(MPCAPEIndex, true)->setProperties(properties);
+  return result;
 }
 
-
 MPC::Properties *MPC::File::audioProperties() const
 {
   return d->properties;
diff --git a/taglib/mpeg/mpegfile.cpp b/taglib/mpeg/mpegfile.cpp
index ec094cdc..90754007 100644
--- a/taglib/mpeg/mpegfile.cpp
+++ b/taglib/mpeg/mpegfile.cpp
@@ -156,16 +156,17 @@ void MPEG::File::removeUnsupportedProperties(const StringList &properties)
   else if(d->hasID3v1)
     d->tag.access<ID3v1::Tag>(ID3v1Index, false)->removeUnsupportedProperties(properties);
 }
+
 PropertyMap MPEG::File::setProperties(const PropertyMap &properties)
 {
-  if(d->hasID3v2)
-    return d->tag.access<ID3v2::Tag>(ID3v2Index, false)->setProperties(properties);
-  else if(d->hasAPE)
-    return d->tag.access<APE::Tag>(APEIndex, false)->setProperties(properties);
-  else if(d->hasID3v1)
-    return d->tag.access<ID3v1::Tag>(ID3v1Index, false)->setProperties(properties);
-  else
-    return d->tag.access<ID3v2::Tag>(ID3v2Index, true)->setProperties(properties);
+  PropertyMap result;
+  if(d->hasID3v1)
+      result = d->tag.access<ID3v1::Tag>(ID3v1Index, false)->setProperties(properties);
+  if(d->hasAPE)
+      result = d->tag.access<APE::Tag>(APEIndex, false)->setProperties(properties);
+  if(d->hasID3v2 || !(d->hasID3v1 || d->hasAPE))
+    result = d->tag.access<ID3v2::Tag>(ID3v2Index, true)->setProperties(properties);
+  return result;
 }
 
 MPEG::Properties *MPEG::File::audioProperties() const
diff --git a/taglib/trueaudio/trueaudiofile.cpp b/taglib/trueaudio/trueaudiofile.cpp
index 9efc6e9d..6af72aaa 100644
--- a/taglib/trueaudio/trueaudiofile.cpp
+++ b/taglib/trueaudio/trueaudiofile.cpp
@@ -141,12 +141,12 @@ PropertyMap TrueAudio::File::properties() const
 
 PropertyMap TrueAudio::File::setProperties(const PropertyMap &properties)
 {
-  if(d->hasID3v2)
-    return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, false)->setProperties(properties);
-  else if(d->hasID3v1)
-    return d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, false)->setProperties(properties);
-  else
-    return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, true)->setProperties(properties);
+  PropertyMap result;
+  if(d->hasID3v1)
+    result = d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, false)->setProperties(properties);
+  if(d->hasID3v2 || !d->hasID3v1)
+    result =d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, true)->setProperties(properties);
+  return result;
 }
 
 TrueAudio::Properties *TrueAudio::File::audioProperties() const
diff --git a/taglib/wavpack/wavpackfile.cpp b/taglib/wavpack/wavpackfile.cpp
index 2d1f8cd9..6cc86527 100644
--- a/taglib/wavpack/wavpackfile.cpp
+++ b/taglib/wavpack/wavpackfile.cpp
@@ -119,12 +119,12 @@ PropertyMap WavPack::File::properties() const
 
 PropertyMap WavPack::File::setProperties(const PropertyMap &properties)
 {
-  if(d->hasAPE)
-    return d->tag.access<APE::Tag>(WavAPEIndex, false)->setProperties(properties);
-  else if(d->hasID3v1)
-    return d->tag.access<ID3v1::Tag>(WavID3v1Index, false)->setProperties(properties);
-  else
-    return d->tag.access<APE::Tag>(APE, true)->setProperties(properties);
+  PropertyMap result;
+  if(d->hasID3v1)
+    result = d->tag.access<ID3v1::Tag>(WavID3v1Index, false)->setProperties(properties);
+  if(d->hasAPE || !d->hasID3v1)
+    result = d->tag.access<APE::Tag>(WavAPEIndex, true)->setProperties(properties);
+  return result;
 }
 
 WavPack::Properties *WavPack::File::audioProperties() const