diff options
Diffstat (limited to 'vmime-master/src/vmime/header.hpp')
| -rw-r--r-- | vmime-master/src/vmime/header.hpp | 362 | 
1 files changed, 362 insertions, 0 deletions
| diff --git a/vmime-master/src/vmime/header.hpp b/vmime-master/src/vmime/header.hpp new file mode 100644 index 0000000..7b4a161 --- /dev/null +++ b/vmime-master/src/vmime/header.hpp @@ -0,0 +1,362 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002 Vincent Richard <vincent@vmime.org> +// +// 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. +// + +#ifndef VMIME_HEADER_HPP_INCLUDED +#define VMIME_HEADER_HPP_INCLUDED + + +#include "vmime/base.hpp" +#include "vmime/component.hpp" +#include "vmime/exception.hpp" + +#include "vmime/headerField.hpp" +#include "vmime/headerFieldFactory.hpp" + + +namespace vmime { + + +class bodyPart; + + +/** Header section of a MIME part. +  */ +class VMIME_EXPORT header : public component { + +	friend class bodyPart; +	friend class body; +	friend class message; + +public: + +	header(); +	~header(); + +#define FIELD_ACCESS(methodName, fieldName) \ +	shared_ptr <headerField> methodName() { return getField(fields::fieldName); } \ +	shared_ptr <const headerField> methodName() const { return findField(fields::fieldName); } + +	FIELD_ACCESS(From,                         FROM) +	FIELD_ACCESS(Sender,                       SENDER) +	FIELD_ACCESS(ReplyTo,                      REPLY_TO) +	FIELD_ACCESS(DeliveredTo,                  DELIVERED_TO) +	FIELD_ACCESS(InReplyTo,                    IN_REPLY_TO) +	FIELD_ACCESS(ReturnPath,                   RETURN_PATH) +	FIELD_ACCESS(References,                   REFERENCES) + +	FIELD_ACCESS(To,                           TO) +	FIELD_ACCESS(Cc,                           CC) +	FIELD_ACCESS(Bcc,                          BCC) +	FIELD_ACCESS(Date,                         DATE) +	FIELD_ACCESS(Subject,                      SUBJECT) +	FIELD_ACCESS(Organization,                 ORGANIZATION) +	FIELD_ACCESS(UserAgent,                    USER_AGENT) + +	FIELD_ACCESS(ContentType,                  CONTENT_TYPE) +	FIELD_ACCESS(ContentDescription,           CONTENT_DESCRIPTION) +	FIELD_ACCESS(ContentTransferEncoding,      CONTENT_TRANSFER_ENCODING) +	FIELD_ACCESS(MimeVersion,                  MIME_VERSION) +	FIELD_ACCESS(ContentDisposition,           CONTENT_DISPOSITION) +	FIELD_ACCESS(ContentId,                    CONTENT_ID) +	FIELD_ACCESS(MessageId,                    MESSAGE_ID) +	FIELD_ACCESS(ContentLocation,              CONTENT_LOCATION) + +	FIELD_ACCESS(OriginalMessageId,            ORIGINAL_MESSAGE_ID) +	FIELD_ACCESS(Disposition,                  DISPOSITION) +	FIELD_ACCESS(DispositionNotificationTo,    DISPOSITION_NOTIFICATION_TO) + +#undef FIELD_ACCESS + +	/** Checks whether (at least) one field with this name exists. +	  * Field name is case-insensitive. +	  * +	  * @return true if at least one field with the specified name +	  * exists, or false otherwise +	  */ +	bool hasField(const string& fieldName) const; + +	/** Find the first field that matches the specified name. +	  * Field name is case-insensitive. +	  * If no field is found, NULL is returned. +	  * +	  * @param fieldName name of field to return (eg: "X-Mailer" or "From", +	  * common field names are available in the vmime::fields namespace) +	  * @return first field with the specified name, or NULL if no field +	  * with this name was found +	  */ +	shared_ptr <headerField> findField(const string& fieldName) const; + +	/** Find the first field that matches the specified name, +	  * casted to the specified field type. Field name is case-insensitive. +	  * If no field is found, or the field is not of the specified type, +	  * NULL is returned. +	  * +	  * @param fieldName name of field whose value is to be returned +	  * (eg: "X-Mailer" or "From", common field names are available in +	  * the vmime::fields namespace) +	  * @return first field with the specified name, or NULL if no field +	  * with this name was found +	  */ +	template <typename T> +	shared_ptr <T> findField(const string& fieldName) const { + +		return dynamicCast <T>(findField(fieldName)); +	} + +	/** Find the value of the first field that matches the specified name, +	  * casted to the specified value type. Field name is case-insensitive. +	  * If no field is found, or the field value is not of the specified +	  * type, NULL is returned. +	  * +	  * @param fieldName name of field to return (eg: "X-Mailer" or "From", +	  * common field names are available in the vmime::fields namespace) +	  * @return value of the first field with the specified name, or NULL +	  * if no field with this name was found, or the value is not of the +	  * specified type +	  */ +	template <typename T> +	shared_ptr <T> findFieldValue(const string& fieldName) const { + +		shared_ptr <headerField> field = findField(fieldName); + +		if (field) { +			return dynamicCast <T>(field->getValue()); +		} else { +			return null; +		} +	} + +	/** Find all fields that match the specified name. +	  * If no field is found, an empty vector is returned. +	  * +	  * @param fieldName name of field to return (eg: "X-Mailer" or "From", +	  * common field names are available in the vmime::fields namespace) +	  * @return list of fields with the specified name +	  */ +	std::vector <shared_ptr <headerField> > findAllFields(const string& fieldName); + +	/** Find the first field that matches the specified name. +	  * If no field is found, one will be created and inserted into +	  * the header. +	  * +	  * @param fieldName name of field to return (eg: "X-Mailer" or "From", +	  * common field names are available in the vmime::fields namespace) +	  * @return first field with the specified name or a new field +	  * if no field is found +	  */ +	shared_ptr <headerField> getField(const string& fieldName); + +	/** Find the first field that matches the specified name, +	  * casted to the specified type. +	  * If no field is found, one will be created and inserted into +	  * the header. +	  * +	  * @return first field with the specified name or a new field +	  * if no field is found +	  */ +	template <typename T> +	shared_ptr <T> getField(const string& fieldName) { + +		return dynamicCast <T>(getField(fieldName)); +	} + +	/** Add a field at the end of the list. +	  * +	  * @param field field to append +	  */ +	void appendField(const shared_ptr <headerField>& field); + +	/** Insert a new field before the specified field. +	  * +	  * @param beforeField field before which the new field will be inserted +	  * @param field field to insert +	  * @throw exceptions::no_such_field if the field is not in the list +	  */ +	void insertFieldBefore( +		const shared_ptr <headerField>& beforeField, +		const shared_ptr <headerField>& field +	); + +	/** Insert a new field before the specified position. +	  * +	  * @param pos position at which to insert the new field (0 to insert at +	  * the beginning of the list) +	  * @param field field to insert +	  */ +	void insertFieldBefore( +		const size_t pos, +		const shared_ptr <headerField>& field +	); + +	/** Insert a new field after the specified field. +	  * +	  * @param afterField field after which the new field will be inserted +	  * @param field field to insert +	  * @throw exceptions::no_such_field if the field is not in the list +	  */ +	void insertFieldAfter( +		const shared_ptr <headerField>& afterField, +		const shared_ptr <headerField>& field +	); + +	/** Insert a new field after the specified position. +	  * +	  * @param pos position of the field before the new field +	  * @param field field to insert +	  */ +	void insertFieldAfter( +		const size_t pos, +		const shared_ptr <headerField>& field +	); + +	/** Remove the specified field from the list. +	  * +	  * @param field field to remove +	  * @throw exceptions::no_such_field if the field is not in the list +	  */ +	void removeField(const shared_ptr <headerField>& field); + +	/** Remove the field at the specified position. +	  * +	  * @param pos position of the field to remove +	  */ +	void removeField(const size_t pos); + +	/** Replaces a field with another field. +	  * +	  * @param field field to be replaced +	  * @param newField field to replace with +	  * @throw exceptions::no_such_field if the field is not in the list +	  */ +	void replaceField( +		const shared_ptr <headerField>& field, +		const shared_ptr <headerField>& newField +	); + +	/** Remove all fields from the list. +	  */ +	void removeAllFields(); + +	/** Remove all fields with the specified name. +	  */ +	void removeAllFields(const string& fieldName); + +	/** Return the number of fields in the list. +	  * +	  * @return number of fields +	  */ +	size_t getFieldCount() const; + +	/** Tests whether the list of fields is empty. +	  * +	  * @return true if there is no field, false otherwise +	  */ +	bool isEmpty() const; + +	/** Return the field at the specified position. +	  * +	  * @param pos position +	  * @return field at position 'pos' +	  */ +	const shared_ptr <headerField> getFieldAt(const size_t pos); + +	/** Return the field at the specified position. +	  * +	  * @param pos position +	  * @return field at position 'pos' +	  */ +	const shared_ptr <const headerField> getFieldAt(const size_t pos) const; + +	/** Return the field list. +	  * +	  * @return list of fields +	  */ +	const std::vector <shared_ptr <const headerField> > getFieldList() const; + +	/** Return the field list. +	  * +	  * @return list of fields +	  */ +	const std::vector <shared_ptr <headerField> > getFieldList(); + +	shared_ptr <component> clone() const; +	void copyFrom(const component& other); +	header& operator=(const header& other); + +	const std::vector <shared_ptr <component> > getChildComponents(); + +	size_t getGeneratedSize(const generationContext& ctx); + +private: + +	std::vector <shared_ptr <headerField> > m_fields; + + +	class fieldHasName { + +	public: + +		fieldHasName(const string& name); +		bool operator() (const shared_ptr <const headerField>& field); + +	private: + +		string m_name; +	}; + +	class fieldHasNotName { + +	public: + +		fieldHasNotName(const string& name); +		bool operator() (const shared_ptr <const headerField>& field); + +	private: + +		string m_name; +	}; + +protected: + +	// Component parsing & assembling +	void parseImpl( +		const parsingContext& ctx, +		const string& buffer, +		const size_t position, +		const size_t end, +		size_t* newPosition = NULL +	); + +	void generateImpl( +		const generationContext& ctx, +		utility::outputStream& os, +		const size_t curLinePos = 0, +		size_t* newLinePos = NULL +	) const; +}; + + +} // vmime + + +#endif // VMIME_HEADER_HPP_INCLUDED | 
