diff options
Diffstat (limited to 'libmail/headers.H')
| -rw-r--r-- | libmail/headers.H | 219 | 
1 files changed, 219 insertions, 0 deletions
| diff --git a/libmail/headers.H b/libmail/headers.H new file mode 100644 index 0000000..7a0a9e1 --- /dev/null +++ b/libmail/headers.H @@ -0,0 +1,219 @@ +/* +** Copyright 2004, Double Precision Inc. +** +** See COPYING for distribution information. +*/ +#ifndef libmail_header_H +#define libmail_header_H + +/////////////////////////////////////////////////////////////////////////// +// +// Helper classes for parsing headers. + +#include <list> +#include <string> +#include <vector> +#include "structure.H" +#include "rfcaddr.H" +#include "namespace.H" + +LIBMAIL_START + +class emailAddress; + +// +// Superclass of all headers +// + +class Header { + +protected: +	std::string wrap(std::string) const; + +	class listitem; +public: +	class plain; +	class encoded; +	class addresslist; +	class mime; +	class list; + +	std::string name;	// Header name, without the colon + +	Header(std::string nameArg) : name(nameArg) {} +	virtual ~Header(); + +	Header(const Header &); // UNDEFINED +	Header &operator=(const Header &); // UNDEFINED + +	virtual std::string toString() const=0; // Convert to string format. +	virtual Header *clone() const=0; // Clone myself +}; + +// +// An unstructured header, 7-bit only. +// + +class Header::plain : public Header { + +	std::string text; +public: +	plain(std::string name, std::string textArg) +		: Header(name), text(textArg) {} +	~plain(); + +	std::string toString() const; +	mail::Header *clone() const; +}; + +// +// An unstructured header, MIME-encoded. +// + +class Header::encoded : public Header::plain { + +	static std::string encode(std::string, std::string, std::string); +public: +	encoded(std::string name, +		std::string text, std::string charset, +		std::string lang=""); +	~encoded(); +}; + +// +// A header containing a list of addresses. +// + +class Header::addresslist : public Header { + +public: +	std::vector<mail::emailAddress> addresses; + +	addresslist(std::string name); +	addresslist(std::string name, +		    const std::vector<mail::emailAddress> &addressesArg); +	~addresslist(); + +#if 0 +	addresslist &operator()(std::string name, std::string addr) +	{ +		mail::emailAddress addr; + +		addr.setDisplayName(name); +		addr.setDisplayAddr(addr); + +		addresses.push_back(addr); +		return *this; +	} +#endif + +	addresslist &operator()(const mail::emailAddress &a) +	{ +		addresses.push_back(a); +		return *this; +	} + +	std::string toString() const; +	mail::Header *clone() const; +}; + +// +// A MIME header, such as Content-Type: or Content-Description: +// + +class Header::mime : public Header { + +public: +	std::string value; +	mimestruct::parameterList parameters; + +	typedef mimestruct::parameterList::iterator parameter_iterator; +	typedef mimestruct::parameterList::const_iterator const_parameter_iterator; + +	mime(std::string name); +	mime(std::string name, std::string value); + +	static mime fromString(std::string); +private: +	static void cb_type(const char *, void *); +	static void cb_param(const char *, const char *, void *); +public: + +	~mime(); +	std::string toString() const; + +	mime &operator()(std::string name, +			 std::string value) +	{ +		parameters.set_simple(name, value); +		return *this; +	} + +	mime &operator()(std::string name, +			 std::string value, +			 std::string charset, +			 std::string language="") +	{ +		parameters.set(name, value, charset, language); +		return *this; +	} + +	parameter_iterator begin() { return parameters.begin(); } +	parameter_iterator end() { return parameters.end(); } + +	const_parameter_iterator begin() const +	{ +		return parameters.begin(); +	} + +	const_parameter_iterator end() const +	{ +		return parameters.end(); +	} +	mail::Header *clone() const; +}; + +// +// Helper class for a list of headers.  Header::listitem wraps around a +// Header superclass, and pretends to be one. +// + +class Header::listitem { + +	Header *h; +public: +	listitem(const listitem &); +	listitem(const Header &); +	~listitem(); +	listitem &operator=(const Header &); + +	listitem &operator=(const listitem &); +	operator Header &() { return *h; } +	operator const Header &() const { return *h; } +}; + +// +// A list of headers is just a subclass of a list<Header::listitem> which +// defines a convenient string operator that returns the string representation +// of this list of headers +// + +class Header::list : public std::list<Header::listitem> { + +public: +	list(); +	~list(); + +	operator std::string() const; + +	Header::list &operator<<(const Header &h) +	{ +		push_back(h); +		return *this; +	} +}; + + +LIBMAIL_END + +#endif | 
