vmime/src/headerField.cpp

267 lines
5.9 KiB
C++
Raw Normal View History

2004-10-05 10:28:21 +00:00
//
// VMime library (http://vmime.sourceforge.net)
// Copyright (C) 2002-2004 Vincent Richard <vincent@vincent-richard.net>
//
// 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 "headerField.hpp"
#include "headerFieldFactory.hpp"
namespace vmime
{
headerField::headerField()
: m_type(Custom), m_name("Undefined")
{
}
headerField::headerField(const string& fieldName)
: m_type(Custom), m_name(fieldName)
{
}
headerField::~headerField()
{
}
headerField* headerField::clone() const
{
headerField* field = NULL;
if (m_type == Custom)
field = headerFieldFactory::getInstance()->create(m_name);
else
field = headerFieldFactory::getInstance()->create(m_type);
field->copyFrom(*this);
return (field);
}
const bool headerField::operator<(const headerField& field) const
{
return (m_type < field.m_type);
}
headerField& headerField::operator=(const headerField& field)
{
copyFrom(field);
return (*this);
}
void headerField::copyFrom(const headerField& field)
{
m_type = field.m_type;
m_name = field.m_name;
}
void headerField::generate(utility::outputStream& os, const string::size_type /* maxLineLength */,
const string::size_type curLinePos, string::size_type* newLinePos) const
{
if (m_type == Custom)
{
os << m_name + ": ";
if (newLinePos)
*newLinePos = curLinePos + m_name.length() + 2;
}
else
{
const string name = typeToName(m_type);
os << name + ": ";
if (newLinePos)
*newLinePos = curLinePos + name.length() + 2;
}
}
/** Return the field type corresponding to the specified name.
*
* @param name field name
* @return field type (see headerField::Types) or headerField::custom
* if this is a custom field
*/
const headerField::Types headerField::nameToType(const string& name)
{
switch (name[0])
{
case 'B':
case 'b':
{
if (isStringEqualNoCase(name, "bcc", 3)) return (Bcc);
break;
}
case 'C':
case 'c':
{
if (isStringEqualNoCase(name, "cc", 2)) return (Cc);
else if (isStringEqualNoCase(name, "content-type", 12)) return (ContentType);
else if (isStringEqualNoCase(name, "content-transfer-encoding", 25)) return (ContentTransferEncoding);
else if (isStringEqualNoCase(name, "content-description", 19)) return (ContentDescription);
else if (isStringEqualNoCase(name, "content-disposition", 19)) return (ContentDisposition);
else if (isStringEqualNoCase(name, "content-id", 10)) return (ContentId);
else if (isStringEqualNoCase(name, "content-location", 16)) return (ContentLocation);
break;
}
case 'd':
case 'D':
{
if (isStringEqualNoCase(name, "date", 4)) return (Date);
else if (isStringEqualNoCase(name, "delivered-to", 12)) return (DeliveredTo);
break;
}
case 'f':
case 'F':
{
if (isStringEqualNoCase(name, "from", 4)) return (From);
break;
}
case 'm':
case 'M':
{
if (isStringEqualNoCase(name, "mime-version", 12)) return (MimeVersion);
else if (isStringEqualNoCase(name, "message-id", 10)) return (MessageId);
break;
}
case 'o':
case 'O':
{
if (isStringEqualNoCase(name, "organization", 12)) return (Organization);
break;
}
case 'r':
case 'R':
{
if (isStringEqualNoCase(name, "received", 8)) return (Received);
else if (isStringEqualNoCase(name, "reply-to", 8)) return (ReplyTo);
else if (isStringEqualNoCase(name, "return-path", 11)) return (ReturnPath);
break;
}
case 's':
case 'S':
{
if (isStringEqualNoCase(name, "sender", 6)) return (Sender);
else if (isStringEqualNoCase(name, "subject", 7)) return (Subject);
break;
}
case 't':
case 'T':
{
if (isStringEqualNoCase(name, "to", 2)) return (To);
break;
}
case 'u':
case 'U':
{
if (isStringEqualNoCase(name, "user-agent", 10)) return (UserAgent);
break;
}
}
return (Custom);
}
/** Return the name for the specified field type.
* Eg: returns "From" for headerField::From.
*
* @param type field type
* @return name for the specified field type
*/
const string headerField::typeToName(const Types type)
{
switch (type)
{
case From: return "From";
case Sender: return "Sender";
case To: return "To";
case Cc: return "Cc";
case Bcc: return "Bcc";
case Date: return "Date";
case Received: return "Received";
case Subject: return "Subject";
case ReplyTo: return "Reply-To";
case Organization: return "Organization";
case DeliveredTo: return "Delivered-To";
case UserAgent: return "User-Agent";
case ReturnPath: return "Return-Path";
case ContentType: return "Content-Type";
case ContentTransferEncoding: return "Content-Transfer-Encoding";
case ContentDescription: return "Content-Description";
case MimeVersion: return "Mime-Version";
case ContentDisposition: return "Content-Disposition";
case ContentId: return "Content-Id";
case MessageId: return "Message-Id";
case ContentLocation: return "Content-Location";
case Custom:
case Last:
return "?";
};
return "?";
}
/** Return the type of this field.
*
* @return field type (see headerField::Types)
*/
const headerField::Types headerField::type() const
{
return (m_type);
}
/** Return the name of this field.
*
* @return field name
*/
const string headerField::name() const
{
return ((m_type == Custom) ? m_name : typeToName(m_type));
}
/** Check whether this field is a custom field.
*
* @return true if the field is a custom field, false otherwise
*/
const bool headerField::isCustom() const
{
return (m_type == Custom);
}
} // vmime