diff options
Diffstat (limited to 'src/mailboxGroup.cpp')
-rw-r--r-- | src/mailboxGroup.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/src/mailboxGroup.cpp b/src/mailboxGroup.cpp new file mode 100644 index 00000000..ff708313 --- /dev/null +++ b/src/mailboxGroup.cpp @@ -0,0 +1,237 @@ +// +// VMime library (http://vmime.sourceforge.net) +// Copyright (C) 2002-2004 Vincent Richard <[email protected]> +// +// 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include "mailboxGroup.hpp" +#include "parserHelpers.hpp" + + +namespace vmime +{ + + +mailboxGroup::mailboxGroup() +{ +} + + +mailboxGroup::mailboxGroup(const class mailboxGroup& mailboxGroup) + : address() +{ + copyFrom(mailboxGroup); +} + + +mailboxGroup::mailboxGroup(const text& name) + : m_name(name) +{ +} + + +mailboxGroup::~mailboxGroup() +{ + clear(); +} + + +void mailboxGroup::parse(const string& buffer, const string::size_type position, + const string::size_type end, string::size_type* newPosition) +{ + const string::value_type* const pend = buffer.data() + end; + const string::value_type* const pstart = buffer.data() + position; + const string::value_type* p = pstart; + + while (p < pend && isspace(*p)) + ++p; + + string name; + + while (p < pend && *p != ':') + { + name += *p; + ++p; + } + + if (p < pend && *p == ':') + ++p; + + + string::size_type pos = position + (p - pstart); + + while (pos < end) + { + address* parsedAddress = address::parseNext(buffer, pos, end, &pos); + + if (parsedAddress) + { + if (parsedAddress->isGroup()) + { + mailboxGroup* group = static_cast <mailboxGroup*>(parsedAddress); + + // Sub-groups are not allowed in mailbox groups: so, we add all + // the contents of the sub-group into this group... + for (mailboxGroup::const_iterator + it = group->begin() ; it != group->end() ; ++it) + { + m_list.push_back(static_cast <mailbox*>((*it).clone())); + } + + delete (parsedAddress); + } + else + { + m_list.push_back(static_cast <mailbox*>(parsedAddress)); + } + } + } + + decodeAndUnfoldText(name, m_name); + + if (newPosition) + *newPosition = end; +} + + +void mailboxGroup::generate(utility::outputStream& os, const string::size_type maxLineLength, + const string::size_type curLinePos, string::size_type* newLinePos) const +{ + // We have to encode the name: + // - if it contains characters in a charset different from "US-ASCII", + // - and/or if it contains one or more of these special chars: + // SPACE TAB " ; , < > ( ) @ / ? . = : + + // Check whether there are words that are not "US-ASCII" + // and/or contain the special chars. + bool forceEncode = false; + + for (text::const_iterator w = m_name.begin() ; !forceEncode && w != m_name.end() ; ++w) + { + if ((*w).charset() == charset(charsets::US_ASCII)) + { + const string& buffer = (*w).buffer(); + + for (string::const_iterator c = buffer.begin() ; + !forceEncode && c != buffer.end() ; ++c) + { + switch (*c) + { + case ' ': + case '\t': + case ';': + case ',': + case '<': case '>': + case '(': case ')': + case '@': + case '/': + case '?': + case '.': + case '=': + case ':': + + forceEncode = true; + break; + } + } + } + } + + string::size_type pos = curLinePos; + + encodeAndFoldText(os, m_name, maxLineLength - 2, pos, &pos, + forceEncode ? encodeAndFoldFlags::forceEncoding : encodeAndFoldFlags::none); + + os << ":"; + ++pos; + + for (const_iterator it = m_list.begin() ; it != m_list.end() ; ++it) + { + if (it != m_list.begin()) + { + os << ", "; + pos += 2; + } + else + { + os << " "; + ++pos; + } + + (*it).generate(os, maxLineLength - 2, pos, &pos); + } + + os << ";"; + pos++; + + if (newLinePos) + *newLinePos = pos; +} + + +address* mailboxGroup::clone() const +{ + return new mailboxGroup(*this); +} + + +// Mailbox insertion +void mailboxGroup::append(const mailbox& field) +{ + m_list.push_back(static_cast<mailbox*>(field.clone())); +} + + +void mailboxGroup::insert(const iterator it, const mailbox& field) +{ + m_list.insert(it.m_iterator, static_cast<mailbox*>(field.clone())); +} + + +// Mailbox removing +void mailboxGroup::erase(const iterator it) +{ + delete (*it.m_iterator); + m_list.erase(it.m_iterator); +} + + +void mailboxGroup::clear() +{ + free_container(m_list); +} + + +void mailboxGroup::copyFrom(const address& addr) +{ + const mailboxGroup& source = dynamic_cast<const mailboxGroup&>(addr); + + m_name = source.m_name; + + clear(); + + for (std::vector <mailbox*>::const_iterator i = source.m_list.begin() ; i != source.m_list.end() ; ++i) + m_list.push_back(static_cast<mailbox*>((*i)->clone())); +} + + +const bool mailboxGroup::isGroup() const +{ + return (true); +} + + +} // vmime |