Merge pull request #681 from TsudaKageyu/xiph-remove-fields

Add alternative methods to XiphComment::removeField() that may cause …
This commit is contained in:
Tsuda Kageyu 2015-11-22 16:19:15 +09:00
commit 559c6b28c9
3 changed files with 83 additions and 18 deletions

View File

@ -264,22 +264,36 @@ void Ogg::XiphComment::addField(const String &key, const String &value, bool rep
void Ogg::XiphComment::removeField(const String &key, const String &value)
{
if(!value.isNull()) {
StringList::Iterator it = d->fieldListMap[key].begin();
while(it != d->fieldListMap[key].end()) {
if(value == *it)
it = d->fieldListMap[key].erase(it);
else
it++;
}
}
if(!value.isNull())
removeFields(key, value);
else
d->fieldListMap.erase(key);
removeFields(key);
}
void Ogg::XiphComment::removeFields(const String &key)
{
d->fieldListMap.erase(key.upper());
}
void Ogg::XiphComment::removeFields(const String &key, const String &value)
{
StringList &fields = d->fieldListMap[key.upper()];
for(StringList::Iterator it = fields.begin(); it != fields.end(); ) {
if(*it == value)
it = fields.erase(it);
else
++it;
}
}
void Ogg::XiphComment::removeAllFields()
{
d->fieldListMap.clear();
}
bool Ogg::XiphComment::contains(const String &key) const
{
return d->fieldListMap.contains(key) && !d->fieldListMap[key].isEmpty();
return !d->fieldListMap[key.upper()].isEmpty();
}
ByteVector Ogg::XiphComment::render() const

View File

@ -181,9 +181,33 @@ namespace TagLib {
/*!
* Remove the field specified by \a key with the data \a value. If
* \a value is null, all of the fields with the given key will be removed.
*
* \deprecated Using this method may lead to a linkage error.
*/
// BIC: remove and merge with below
void removeField(const String &key, const String &value = String::null);
/*!
* Remove all the fields specified by \a key.
*
* \see removeAllFields()
*/
void removeFields(const String &key);
/*!
* Remove all the fields specified by \a key with the data \a value.
*
* \see removeAllFields()
*/
void removeFields(const String &key, const String &value);
/*!
* Remove all the fields in the comment.
*
* \see removeFields()
*/
void removeAllFields();
/*!
* Returns true if the field is contained within the comment.
*

View File

@ -1,7 +1,7 @@
#include <string>
#include <stdio.h>
#include <flacfile.h>
#include <xiphcomment.h>
#include <vorbisfile.h>
#include <tpropertymap.h>
#include <tdebug.h>
#include <cppunit/extensions/HelperMacros.h>
@ -19,6 +19,7 @@ class TestXiphComment : public CppUnit::TestFixture
CPPUNIT_TEST(testSetTrack);
CPPUNIT_TEST(testInvalidKeys);
CPPUNIT_TEST(testClearComment);
CPPUNIT_TEST(testRemoveFields);
CPPUNIT_TEST_SUITE_END();
public:
@ -78,20 +79,46 @@ public:
void testClearComment()
{
ScopedFileCopy copy("no-tags", ".flac");
ScopedFileCopy copy("empty", ".ogg");
{
FLAC::File f(copy.fileName().c_str());
f.xiphComment()->addField("COMMENT", "Comment1");
Ogg::Vorbis::File f(copy.fileName().c_str());
f.tag()->addField("COMMENT", "Comment1");
f.save();
}
{
FLAC::File f(copy.fileName().c_str());
f.xiphComment()->setComment("");
CPPUNIT_ASSERT_EQUAL(String(""), f.xiphComment()->comment());
Ogg::Vorbis::File f(copy.fileName().c_str());
f.tag()->setComment("");
CPPUNIT_ASSERT_EQUAL(String(""), f.tag()->comment());
}
}
void testRemoveFields()
{
Ogg::Vorbis::File f(TEST_FILE_PATH_C("empty.ogg"));
f.tag()->addField("title", "Title1");
f.tag()->addField("Title", "Title1", false);
f.tag()->addField("titlE", "Title2", false);
f.tag()->addField("TITLE", "Title3", false);
f.tag()->addField("artist", "Artist1");
f.tag()->addField("ARTIST", "Artist2", false);
CPPUNIT_ASSERT_EQUAL(String("Title1 Title1 Title2 Title3"), f.tag()->title());
CPPUNIT_ASSERT_EQUAL(String("Artist1 Artist2"), f.tag()->artist());
f.tag()->removeFields("title", "Title1");
CPPUNIT_ASSERT_EQUAL(String("Title2 Title3"), f.tag()->title());
CPPUNIT_ASSERT_EQUAL(String("Artist1 Artist2"), f.tag()->artist());
f.tag()->removeFields("Artist");
CPPUNIT_ASSERT_EQUAL(String("Title2 Title3"), f.tag()->title());
CPPUNIT_ASSERT(f.tag()->artist().isEmpty());
f.tag()->removeAllFields();
CPPUNIT_ASSERT(f.tag()->title().isEmpty());
CPPUNIT_ASSERT(f.tag()->artist().isEmpty());
CPPUNIT_ASSERT_EQUAL(String("Xiph.Org libVorbis I 20050304"), f.tag()->vendorID());
}
};
CPPUNIT_TEST_SUITE_REGISTRATION(TestXiphComment);