From 29954e5e50e5668a5f38f944573b9be6401ed433 Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Wed, 16 Oct 2013 19:47:24 +0200 Subject: [PATCH] Fixed group parsing in mailboxList. --- SConstruct | 1 + src/mailboxList.cpp | 32 ++++++++++++++++++++- tests/parser/mailboxListTest.cpp | 48 ++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 tests/parser/mailboxListTest.cpp diff --git a/SConstruct b/SConstruct index d1813bd1..9874e19a 100644 --- a/SConstruct +++ b/SConstruct @@ -386,6 +386,7 @@ libvmimetest_sources = [ 'tests/parser/headerFieldTest.cpp', 'tests/parser/htmlTextPartTest.cpp', 'tests/parser/mailboxGroupTest.cpp', + 'tests/parser/mailboxListTest.cpp', 'tests/parser/mailboxTest.cpp', 'tests/parser/mediaTypeTest.cpp', 'tests/parser/messageIdTest.cpp', diff --git a/src/mailboxList.cpp b/src/mailboxList.cpp index 03a225f8..f0f40ca8 100644 --- a/src/mailboxList.cpp +++ b/src/mailboxList.cpp @@ -22,6 +22,7 @@ // #include "vmime/mailboxList.hpp" +#include "vmime/mailboxGroup.hpp" #include "vmime/exception.hpp" @@ -200,7 +201,36 @@ void mailboxList::parseImpl (const parsingContext& ctx, const string& buffer, const string::size_type position, const string::size_type end, string::size_type* newPosition) { - m_list.parse(ctx, buffer, position, end, newPosition); + m_list.removeAllAddresses(); + + string::size_type pos = position; + + while (pos < end) + { + ref
parsedAddress = address::parseNext(ctx, buffer, pos, end, &pos, NULL); + + if (parsedAddress != NULL) + { + if (parsedAddress->isGroup()) + { + ref group = parsedAddress.staticCast (); + + for (size_t i = 0 ; i < group->getMailboxCount() ; ++i) + { + m_list.appendAddress(group->getMailboxAt(i)); + } + } + else + { + m_list.appendAddress(parsedAddress); + } + } + } + + setParsedBounds(position, end); + + if (newPosition) + *newPosition = end; } diff --git a/tests/parser/mailboxListTest.cpp b/tests/parser/mailboxListTest.cpp new file mode 100644 index 00000000..c921069e --- /dev/null +++ b/tests/parser/mailboxListTest.cpp @@ -0,0 +1,48 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2013 Vincent Richard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 3 of +// the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// Linking this library statically or dynamically with other modules is making +// a combined work based on this library. Thus, the terms and conditions of +// the GNU General Public License cover the whole combination. +// + +#include "tests/testUtils.hpp" + + +VMIME_TEST_SUITE_BEGIN(mailboxListTest) + + VMIME_TEST_LIST_BEGIN + VMIME_TEST(testParseGroup) + VMIME_TEST_LIST_END + + + // Disposition-Notification-To:: + void testParseGroup() + { + // Groups should be extracted to multiple mailboxes in mailbox lists + vmime::mailboxList mboxList; + mboxList.parse("email1@domain1.com, : , email3@domain3.com"); + + VASSERT_EQ("count", 3, mboxList.getMailboxCount()); + VASSERT_EQ("email", "email1@domain1.com", mboxList.getMailboxAt(0)->getEmail().generate()); + VASSERT_EQ("email", "email2@domain2.com", mboxList.getMailboxAt(1)->getEmail().generate()); + VASSERT_EQ("email", "email3@domain3.com", mboxList.getMailboxAt(2)->getEmail().generate()); + } + +VMIME_TEST_SUITE_END +