aboutsummaryrefslogtreecommitdiffstats
path: root/src/headerField.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/headerField.cpp')
-rw-r--r--src/headerField.cpp381
1 files changed, 0 insertions, 381 deletions
diff --git a/src/headerField.cpp b/src/headerField.cpp
deleted file mode 100644
index f4c6187e..00000000
--- a/src/headerField.cpp
+++ /dev/null
@@ -1,381 +0,0 @@
-//
-// VMime library (http://www.vmime.org)
-// Copyright (C) 2002-2013 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 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/headerField.hpp"
-#include "vmime/headerFieldFactory.hpp"
-
-#include "vmime/parserHelpers.hpp"
-
-#include "vmime/exception.hpp"
-
-
-namespace vmime
-{
-
-
-headerField::headerField()
- : m_name("X-Undefined")
-{
-}
-
-
-headerField::headerField(const string& fieldName)
- : m_name(fieldName)
-{
-}
-
-
-headerField::~headerField()
-{
-}
-
-
-shared_ptr <component> headerField::clone() const
-{
- shared_ptr <headerField> field = headerFieldFactory::getInstance()->create(m_name);
-
- field->copyFrom(*this);
-
- return (field);
-}
-
-
-void headerField::copyFrom(const component& other)
-{
- const headerField& hf = dynamic_cast <const headerField&>(other);
-
- m_value->copyFrom(*hf.m_value);
-}
-
-
-headerField& headerField::operator=(const headerField& other)
-{
- copyFrom(other);
- return (*this);
-}
-
-
-shared_ptr <headerField> headerField::parseNext
- (const parsingContext& ctx, const string& buffer, const size_t position,
- const size_t end, size_t* newPosition)
-{
- size_t pos = position;
-
- while (pos < end)
- {
- char_t c = buffer[pos];
-
- // Check for end of headers (empty line): although RFC-822 recommends
- // to use CRLF for header/body separator (see 4.1 SYNTAX), here, we
- // also check for LF for compatibility with broken implementations...
- if (c == '\n')
- {
- if (newPosition)
- *newPosition = pos + 1; // LF: illegal
-
- return null;
- }
- else if (c == '\r' && pos + 1 < end && buffer[pos + 1] == '\n')
- {
- if (newPosition)
- *newPosition = pos + 2; // CR+LF
-
- return null;
- }
-
- // This line may be a field description
- if (!parserHelpers::isSpace(c))
- {
- const size_t nameStart = pos; // remember the start position of the line
-
- while (pos < end && (buffer[pos] != ':' && !parserHelpers::isSpace(buffer[pos])))
- ++pos;
-
- const size_t nameEnd = pos;
-
- while (pos < end && (buffer[pos] == ' ' || buffer[pos] == '\t'))
- ++pos;
-
- if (buffer[pos] != ':')
- {
- // Humm...does not seem to be a valid header line.
- // Skip this error and advance to the next line
- pos = nameStart;
-
- while (pos < end && buffer[pos] != '\n')
- ++pos;
-
- if (pos < end && buffer[pos] == '\n')
- ++pos;
- }
- else
- {
- // Extract the field name
- const string name(buffer.begin() + nameStart,
- buffer.begin() + nameEnd);
-
- // Skip ':' character
- ++pos;
-
- // Skip spaces between ':' and the field contents
- while (pos < end && (buffer[pos] == ' ' || buffer[pos] == '\t'))
- ++pos;
-
- const size_t contentsStart = pos;
- size_t contentsEnd = 0;
-
- // Extract the field value
- while (pos < end)
- {
- c = buffer[pos];
-
- // Check for folded line
- if (c == '\r' && pos + 2 < end && buffer[pos + 1] == '\n' &&
- (buffer[pos + 2] == ' ' || buffer[pos + 2] == '\t'))
- {
- pos += 3;
- }
- // Check for end of contents
- if (c == '\r' && pos + 1 < end && buffer[pos + 1] == '\n')
- {
- contentsEnd = pos;
- pos += 2;
- break;
- }
- else if (c == '\n')
- {
- contentsEnd = pos;
- ++pos;
- break;
- }
-
- while (pos < end)
- {
- c = buffer[pos];
-
- // Check for end of line
- if (c == '\r' && pos + 1 < end && buffer[pos + 1] == '\n')
- {
- contentsEnd = pos;
- pos += 2;
- break;
- }
- else if (c == '\n')
- {
- contentsEnd = pos;
- ++pos;
- break;
- }
-
- ++pos;
- }
-
- // Handle the case of folded lines
- if (buffer[pos] == ' ' || buffer[pos] == '\t')
- {
- // This is a folding white-space: we keep it as is and
- // we continue with contents parsing...
-
- // If the line contains only space characters, we assume it is
- // the end of the headers. This is not strictly standard-compliant
- // but, hey, we can't fail when parsing some malformed mails...
- while (pos < end && (buffer[pos] == ' ' || buffer[pos] == '\t'))
- ++pos;
-
- if ((pos < end && buffer[pos] == '\n') ||
- (pos + 1 < end && buffer[pos] == '\r' && buffer[pos + 1] == '\n'))
- {
- break;
- }
- }
- else
- {
- // End of this field
- break;
- }
- }
-
- if (pos == end && contentsEnd == 0)
- {
- // End of data, and no CRLF was found at the end
- contentsEnd = end;
- }
-
- // Strip spaces from end of header lines
- while (contentsEnd > contentsStart &&
- (buffer[contentsEnd - 1] == ' ' || buffer[contentsEnd - 1] == '\t' ||
- buffer[contentsEnd - 1] == '\r' || buffer[contentsEnd - 1] == '\n'))
- {
- contentsEnd--;
- }
-
- // Return a new field
- shared_ptr <headerField> field = headerFieldFactory::getInstance()->create(name);
-
- field->parse(ctx, buffer, contentsStart, contentsEnd, NULL);
- field->setParsedBounds(nameStart, pos);
-
- if (newPosition)
- *newPosition = pos;
-
- return (field);
- }
- }
- else
- {
- // If the line contains only space characters, we assume it is
- // the end of the headers.
- while (pos < end && (buffer[pos] == ' ' || buffer[pos] == '\t'))
- ++pos;
-
- if (pos < end && buffer[pos] == '\n')
- {
- if (newPosition)
- *newPosition = pos + 1; // LF: illegal
-
- return null;
- }
- else if (pos + 1 < end && buffer[pos] == '\r' && buffer[pos + 1] == '\n')
- {
- if (newPosition)
- *newPosition = pos + 2; // CR+LF
-
- return null;
- }
-
- // Skip this error and advance to the next line
- while (pos < end && buffer[pos] != '\n')
- ++pos;
-
- if (buffer[pos] == '\n')
- ++pos;
- }
- }
-
- if (newPosition)
- *newPosition = pos;
-
- return null;
-}
-
-
-void headerField::parseImpl
- (const parsingContext& ctx, const string& buffer, const size_t position,
- const size_t end, size_t* newPosition)
-{
- m_value->parse(ctx, buffer, position, end, newPosition);
-}
-
-
-void headerField::generateImpl
- (const generationContext& ctx, utility::outputStream& os,
- const size_t curLinePos, size_t* newLinePos) const
-{
- os << m_name + ": ";
-
- m_value->generate(ctx, os, curLinePos + m_name.length() + 2, newLinePos);
-}
-
-
-size_t headerField::getGeneratedSize(const generationContext& ctx)
-{
- return m_name.length() + 2 /* ": " */ + m_value->getGeneratedSize(ctx);
-}
-
-
-const string headerField::getName() const
-{
- return m_name;
-}
-
-
-void headerField::setName(const string& name)
-{
- m_name = name;
-}
-
-
-bool headerField::isCustom() const
-{
- return (m_name.length() > 2 && m_name[0] == 'X' && m_name[1] == '-');
-}
-
-
-const std::vector <shared_ptr <component> > headerField::getChildComponents()
-{
- std::vector <shared_ptr <component> > list;
-
- if (m_value)
- list.push_back(m_value);
-
- return (list);
-}
-
-
-shared_ptr <const headerFieldValue> headerField::getValue() const
-{
- return m_value;
-}
-
-
-shared_ptr <headerFieldValue> headerField::getValue()
-{
- return m_value;
-}
-
-
-void headerField::setValue(shared_ptr <headerFieldValue> value)
-{
- if (!headerFieldFactory::getInstance()->isValueTypeValid(*this, *value))
- throw exceptions::bad_field_value_type(getName());
-
- if (value != NULL)
- m_value = value;
-}
-
-
-void headerField::setValueConst(shared_ptr <const headerFieldValue> value)
-{
- if (!headerFieldFactory::getInstance()->isValueTypeValid(*this, *value))
- throw exceptions::bad_field_value_type(getName());
-
- m_value = vmime::clone(value);
-}
-
-
-void headerField::setValue(const headerFieldValue& value)
-{
- if (!headerFieldFactory::getInstance()->isValueTypeValid(*this, value))
- throw exceptions::bad_field_value_type(getName());
-
- m_value = vmime::clone(value);
-}
-
-
-void headerField::setValue(const string& value)
-{
- parse(value);
-}
-
-
-} // vmime