// // VMime library (http://www.vmime.org) // Copyright (C) 2002-2006 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 2 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 "vmime/addressList.hpp" #include "vmime/parserHelpers.hpp" #include "vmime/exception.hpp" #include "vmime/mailboxList.hpp" namespace vmime { addressList::addressList() { } addressList::addressList(const addressList& addrList) : headerFieldValue() { copyFrom(addrList); } addressList::~addressList() { removeAllAddresses(); } void addressList::parse(const string& buffer, const string::size_type position, const string::size_type end, string::size_type* newPosition) { removeAllAddresses(); string::size_type pos = position; while (pos < end) { ref
parsedAddress = address::parseNext(buffer, pos, end, &pos); if (parsedAddress != NULL) m_list.push_back(parsedAddress); } setParsedBounds(position, end); if (newPosition) *newPosition = end; } void addressList::generate(utility::outputStream& os, const string::size_type maxLineLength, const string::size_type curLinePos, string::size_type* newLinePos) const { string::size_type pos = curLinePos; if (!m_list.empty()) { for (std::vector >::const_iterator i = m_list.begin() ; ; ) { (*i)->generate(os, maxLineLength - 2, pos, &pos); if (++i == m_list.end()) break; os << ", "; pos += 2; } } if (newLinePos) *newLinePos = pos; } void addressList::copyFrom(const component& other) { const addressList& addrList = dynamic_cast (other); removeAllAddresses(); for (std::vector >::const_iterator it = addrList.m_list.begin() ; it != addrList.m_list.end() ; ++it) { m_list.push_back((*it)->clone().dynamicCast
()); } } addressList& addressList::operator=(const addressList& other) { copyFrom(other); return (*this); } addressList& addressList::operator=(const mailboxList& other) { removeAllAddresses(); for (int i = 0 ; i < other.getMailboxCount() ; ++i) m_list.push_back(other.getMailboxAt(i)->clone().dynamicCast
()); return (*this); } ref addressList::clone() const { return vmime::create (*this); } void addressList::appendAddress(ref
addr) { m_list.push_back(addr); } void addressList::insertAddressBefore(ref
beforeAddress, ref
addr) { const std::vector >::iterator it = std::find (m_list.begin(), m_list.end(), beforeAddress); if (it == m_list.end()) throw exceptions::no_such_address(); m_list.insert(it, addr); } void addressList::insertAddressBefore(const int pos, ref
addr) { m_list.insert(m_list.begin() + pos, addr); } void addressList::insertAddressAfter(ref
afterAddress, ref
addr) { const std::vector >::iterator it = std::find (m_list.begin(), m_list.end(), afterAddress); if (it == m_list.end()) throw exceptions::no_such_address(); m_list.insert(it + 1, addr); } void addressList::insertAddressAfter(const int pos, ref
addr) { m_list.insert(m_list.begin() + pos + 1, addr); } void addressList::removeAddress(ref
addr) { const std::vector >::iterator it = std::find (m_list.begin(), m_list.end(), addr); if (it == m_list.end()) throw exceptions::no_such_address(); m_list.erase(it); } void addressList::removeAddress(const int pos) { const std::vector >::iterator it = m_list.begin() + pos; m_list.erase(it); } void addressList::removeAllAddresses() { m_list.clear(); } const int addressList::getAddressCount() const { return (m_list.size()); } const bool addressList::isEmpty() const { return (m_list.empty()); } ref
addressList::getAddressAt(const int pos) { return (m_list[pos]); } const ref addressList::getAddressAt(const int pos) const { return (m_list[pos]); } const std::vector > addressList::getAddressList() const { std::vector > list; list.reserve(m_list.size()); for (std::vector >::const_iterator it = m_list.begin() ; it != m_list.end() ; ++it) { list.push_back(*it); } return (list); } const std::vector > addressList::getAddressList() { return (m_list); } const std::vector > addressList::getChildComponents() const { std::vector > list; copy_vector(m_list, list); return (list); } } // vmime