summaryrefslogtreecommitdiffstats
path: root/libmail/rfcaddr.H
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/rfcaddr.H')
-rw-r--r--libmail/rfcaddr.H154
1 files changed, 154 insertions, 0 deletions
diff --git a/libmail/rfcaddr.H b/libmail/rfcaddr.H
new file mode 100644
index 0000000..45e2a45
--- /dev/null
+++ b/libmail/rfcaddr.H
@@ -0,0 +1,154 @@
+/*
+** Copyright 2002-20011, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+#ifndef libmail_rfcaddr_h
+#define libmail_rfcaddr_h
+
+#include "libmail_config.h"
+#include "unicode/unicode.h"
+#include "namespace.H"
+
+#include <stdlib.h>
+#include <vector>
+#include <string>
+
+//
+// An RFC 2822 address, a name and user@domain.
+//
+
+LIBMAIL_START
+
+class address {
+
+protected:
+ std::string name;
+ std::string addr;
+public:
+
+ std::string getName() const { return name; }
+ std::string getAddr() const { return addr; }
+
+ virtual void setName(std::string s);
+ virtual void setAddr(std::string a);
+
+ // If addr.size() == 0 this is the obsolete rfc 822
+ // group list notation, and name is either ";" or "name:"
+
+ address(std::string n, std::string a);
+
+ virtual ~address();
+
+ // Convert myself to "name" <addr> format.
+
+ std::string toString() const;
+
+ //
+ // Create an RFC 2822 address header, from a vector of addresss.
+ //
+
+ template<class T>
+ static std::string toString(std::string hdr, // Name:
+ const std::vector<T> &h,
+ size_t w=76); // Max length of lines.
+
+ //
+ // Create a vector of addresses from a string
+ //
+
+ template<class T> static bool fromString(std::string addresses,
+ std::vector<T> &h,
+ size_t &errIndex);
+
+ // Addresses are appended to h
+ // Returns false if memory allocation failed or addresses is
+ // syntactically invalid. errIndex points where in addresses the
+ // syntax error is (or is string::npos if memory allocation failed)
+
+ std::string getCanonAddress() const;
+ // Return addr with domain portion converted to lowercase
+
+ bool operator==(const address &) const;
+ // Compare the addr portions only, ignoring domain case
+
+ bool operator!=(const address &a) const
+ {
+ return !operator==(a);
+ }
+
+};
+
+// INPROGRESS: slowly migrate to automatic MIME encoding of names.
+//
+// A subclass of address that MIME-decodes the name portion of the address,
+// and IDN-decodes the hostname portion of the address (if libidn is available).
+//
+// emailAddress transparently casts to mail::address, importing/exporting
+// the name and address in its decoded form.
+
+class emailAddress : public address {
+
+ // The name field as unicode characters
+
+ std::vector<unicode_char> decodedName;
+
+ //! The address field, with the hostname portion decoded
+
+ std::vector<unicode_char> decodedAddr;
+
+ void decode();
+public:
+ emailAddress();
+ emailAddress(const address &);
+ virtual ~emailAddress();
+
+ std::string getDisplayName(const std::string &charset,
+ bool &errflag) const
+ {
+ return mail::iconvert::convert(decodedName, charset, errflag);
+ }
+
+ std::string getDisplayAddr(const std::string &charset,
+ bool &errflag) const
+ {
+ return mail::iconvert::convert(decodedAddr, charset, errflag);
+ }
+
+ std::string getDisplayName(const std::string &charset) const
+ {
+ bool dummy;
+
+ return getDisplayName(charset, dummy);
+ }
+
+ std::string getDisplayAddr(const std::string &charset) const
+ {
+ bool dummy;
+
+ return getDisplayAddr(charset, dummy);
+ }
+
+ std::string setDisplayName(const std::string &s,
+ const std::string &charset);
+ std::string setDisplayAddr(const std::string &a,
+ const std::string &charset);
+
+ virtual void setName(std::string s);
+ virtual void setAddr(std::string s);
+
+ bool operator==(const address &a) const
+ {
+ return mail::address::operator==(a);
+ }
+
+ bool operator!=(const address &a) const
+ {
+ return !operator==(a);
+ }
+
+};
+
+LIBMAIL_END
+
+#endif