// // VMime library (http://www.vmime.org) // Copyright (C) 2002 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 "vmime/addressList.hpp" #include "vmime/parserHelpers.hpp" #include "vmime/exception.hpp" #include "vmime/mailboxList.hpp" #include "vmime/mailboxGroup.hpp" namespace vmime { addressList::addressList() { } addressList::addressList(const addressList& addrList) : headerFieldValue() { copyFrom(addrList); } addressList::~addressList() { removeAllAddresses(); } void addressList::parseImpl( const parsingContext& ctx, const string& buffer, const size_t position, const size_t end, size_t* newPosition ) { removeAllAddresses(); size_t pos = position; while (pos < end) { shared_ptr
parsedAddress = address::parseNext(ctx, buffer, pos, end, &pos, NULL); if (parsedAddress) { m_list.push_back(parsedAddress); } } setParsedBounds(position, end); if (newPosition) { *newPosition = end; } } void addressList::generateImpl( const generationContext& ctx, utility::outputStream& os, const size_t curLinePos, size_t* newLinePos ) const { size_t pos = curLinePos; generationContext tmpCtx(ctx); tmpCtx.setMaxLineLength(tmpCtx.getMaxLineLength() - 2); if (!m_list.empty()) { for (std::vector >::const_iterator i = m_list.begin() ; ; ) { (*i)->generate(ctx, os, 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(vmime::clone(*it)); } } addressList& addressList::operator=(const addressList& other) { copyFrom(other); return *this; } addressList& addressList::operator=(const mailboxList& other) { removeAllAddresses(); for (size_t i = 0 ; i < other.getMailboxCount() ; ++i) { m_list.push_back(dynamicCast
(other.getMailboxAt(i)->clone())); } return *this; } shared_ptr addressList::clone() const { return make_shared (*this); } void addressList::appendAddress(const shared_ptr
&addr) { m_list.push_back(addr); } void addressList::insertAddressBefore(const shared_ptr
& beforeAddress, const shared_ptr
& addr) { const std::vector >::iterator it = std::find( m_list.begin(), m_list.end(), beforeAddress ); if (it == m_list.end()) { throw std::out_of_range("Invalid position"); } m_list.insert(it, addr); } void addressList::insertAddressBefore(const size_t pos, const shared_ptr
& addr) { if (pos >= m_list.size()) { throw std::out_of_range("Invalid position"); } m_list.insert(m_list.begin() + pos, addr); } void addressList::insertAddressAfter( const shared_ptr
& afterAddress, const shared_ptr
& addr ) { const std::vector >::iterator it = std::find( m_list.begin(), m_list.end(), afterAddress ); if (it == m_list.end()) { throw std::out_of_range("Invalid position"); } m_list.insert(it + 1, addr); } void addressList::insertAddressAfter(const size_t pos, const shared_ptr
& addr) { if (pos >= m_list.size()) { throw std::out_of_range("Invalid position"); } m_list.insert(m_list.begin() + pos + 1, addr); } void addressList::removeAddress(const shared_ptr
& addr) { const std::vector >::iterator it = std::find( m_list.begin(), m_list.end(), addr ); if (it == m_list.end()) { throw std::out_of_range("Invalid position"); } m_list.erase(it); } void addressList::removeAddress(const size_t pos) { if (pos >= m_list.size()) { throw std::out_of_range("Invalid position"); } const std::vector >::iterator it = m_list.begin() + pos; m_list.erase(it); } void addressList::removeAllAddresses() { m_list.clear(); } size_t addressList::getAddressCount() const { return m_list.size(); } bool addressList::isEmpty() const { return m_list.empty(); } shared_ptr
addressList::getAddressAt(const size_t pos) { return m_list[pos]; } const shared_ptr addressList::getAddressAt(const size_t 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() { std::vector > list; copy_vector(m_list, list); return list; } shared_ptr addressList::toMailboxList() const { shared_ptr res = make_shared (); for (std::vector >::const_iterator it = m_list.begin() ; it != m_list.end() ; ++it) { shared_ptr addr = *it; if (addr->isGroup()) { const std::vector > mailboxes = dynamicCast (addr)->getMailboxList(); for (std::vector >::const_iterator jt = mailboxes.begin() ; jt != mailboxes.end() ; ++jt) { res->appendMailbox(vmime::clone(*jt)); } } else { res->appendMailbox(dynamicCast (addr->clone())); } } return res; } } // vmime