]> granicus.if.org Git - taglib/commitdiff
Fixed a crash of APE::Item::toString() when the data type is binary
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Sat, 13 Jul 2013 17:28:57 +0000 (02:28 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Sat, 13 Jul 2013 17:47:48 +0000 (02:47 +0900)
examples/framelist.cpp
taglib/ape/apeitem.cpp
taglib/ape/apeitem.h

index dbe80feb8286b46c427989b76e84f6b0a87bbc62..679aa3934c7f6155f41246ae7bb330062f2dbde5 100644 (file)
@@ -95,7 +95,10 @@ int main(int argc, char *argv[])
       for(APE::ItemListMap::ConstIterator it = ape->itemListMap().begin();
           it != ape->itemListMap().end(); ++it)
       {
-        cout << (*it).first << " - \"" << (*it).second.toString() << "\"" << endl;
+        if((*it).second.type() != APE::Item::Binary)
+          cout << (*it).first << " - \"" << (*it).second.toString() << "\"" << endl;
+        else
+          cout << (*it).first << " - Binary data (" << (*it).second.binaryData().size() << " bytes)" << endl;
       }
     }
     else
index b1670a65b4bf017af194ed12f137044308247d2c..3490173a2cda5fb622b6302a06ca530ba8f886ec 100644 (file)
@@ -125,6 +125,7 @@ void APE::Item::setBinaryData(const ByteVector &value)
 {
   d->type = Binary;
   d->value = value;
+  d->text.clear();
 }
 
 ByteVector APE::Item::value() const
@@ -137,31 +138,35 @@ ByteVector APE::Item::value() const
 
 void APE::Item::setKey(const String &key)
 {
-    d->key = key;
+  d->key = key;
 }
 
 void APE::Item::setValue(const String &value)
 {
-    d->type = Text;
-    d->text = value;
+  d->type = Text;
+  d->text = value;
+  d->value.clear();
 }
 
 void APE::Item::setValues(const StringList &value)
 {
-    d->type = Text;
-    d->text = value;
+  d->type = Text;
+  d->text = value;
+  d->value.clear();
 }
 
 void APE::Item::appendValue(const String &value)
 {
-    d->type = Text;
-    d->text.append(value);
+  d->type = Text;
+  d->text.append(value);
+  d->value.clear();
 }
 
 void APE::Item::appendValues(const StringList &values)
 {
-    d->type = Text;
-    d->text.append(values);
+  d->type = Text;
+  d->text.append(values);
+  d->value.clear();
 }
 
 int APE::Item::size() const
@@ -200,7 +205,10 @@ StringList APE::Item::values() const
 
 String APE::Item::toString() const
 {
-  return isEmpty() ? String::null : d->text.front();
+  if(d->type == Text && !isEmpty())
+    return d->text.front();
+  else
+    return String::null;
 }
 
 bool APE::Item::isEmpty() const
@@ -234,13 +242,15 @@ void APE::Item::parse(const ByteVector &data)
 
   d->key = String(data.mid(8), String::UTF8);
 
-  d->value = data.mid(8 + d->key.size() + 1, valueLength);
+  const ByteVector value = data.mid(8 + d->key.size() + 1, valueLength);
 
   setReadOnly(flags & 1);
   setType(ItemTypes((flags >> 1) & 3));
 
-  if(Text == d->type)
-    d->text = StringList(ByteVectorList::split(d->value, '\0'), String::UTF8);
+  if(Text == d->type) 
+    d->text = StringList(ByteVectorList::split(value, '\0'), String::UTF8);
+  else
+    d->value = value;
 }
 
 ByteVector APE::Item::render() const
index f7fd05e3cbe2e96d70ac060ac95f2f8c0b95431c..0588d185073d6852ab0b1c9433bd950caf4aa734 100644 (file)
@@ -97,7 +97,7 @@ namespace TagLib {
 
       /*!
        * Returns the binary value.
-       * If the item type is not \a Binary, the returned contents are undefined
+       * If the item type is not \a Binary, always returns an empty ByteVector.
        */
       ByteVector binaryData() const;
 
@@ -152,8 +152,9 @@ namespace TagLib {
       int size() const;
 
       /*!
-       * Returns the value as a single string. In case of multiple strings,
-       * the first is returned.
+       * Returns the value as a single string.  In case of multiple strings,
+       * the first is returned.  If the data type is not \a Text, always returns 
+       * an empty String.
        */
       String toString() const;
 
@@ -163,7 +164,8 @@ namespace TagLib {
 #endif
 
       /*!
-       * Returns the list of text values.
+       * Returns the list of text values.  If the data type is not \a Text, always 
+       * returns an empty StringList.
        */
       StringList values() const;