summaryrefslogtreecommitdiffstats
path: root/tdeioslaves/imap4/mailaddress.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tdeioslaves/imap4/mailaddress.cc')
-rw-r--r--tdeioslaves/imap4/mailaddress.cc323
1 files changed, 323 insertions, 0 deletions
diff --git a/tdeioslaves/imap4/mailaddress.cc b/tdeioslaves/imap4/mailaddress.cc
new file mode 100644
index 00000000..0ddd2ff0
--- /dev/null
+++ b/tdeioslaves/imap4/mailaddress.cc
@@ -0,0 +1,323 @@
+/**********************************************************************
+ *
+ * mailaddress.cc - mail address parser
+ * Copyright (C) 2000 Sven Carstens
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Send comments and bug fixes to
+ *
+ *********************************************************************/
+
+
+#include "mailaddress.h"
+#include "rfcdecoder.h"
+#include "mimehdrline.h"
+#include <kmime_util.h>
+
+mailAddress::mailAddress ()
+{
+}
+
+mailAddress::mailAddress (const mailAddress & lr):
+user (lr.user),
+host (lr.host),
+rawFullName (lr.rawFullName),
+rawComment (lr.rawComment)
+{
+// kdDebug(7116) << "mailAddress::mailAddress - " << getStr() << endl;
+}
+
+mailAddress & mailAddress::operator = (const mailAddress & lr)
+{
+ // Avoid a = a.
+ if (this == &lr)
+ return *this;
+
+ user = lr.user;
+ host = lr.host;
+ rawFullName = lr.rawFullName;
+ rawComment = lr.rawComment;
+
+// kdDebug(7116) << "mailAddress::operator= - " << getStr() << endl;
+
+ return *this;
+}
+
+
+
+
+mailAddress::~mailAddress ()
+{
+}
+
+mailAddress::mailAddress (char *aCStr)
+{
+ parseAddress (aCStr);
+}
+
+int
+mailAddress::parseAddress (char *aCStr)
+{
+ int retVal = 0;
+ int skip;
+ uint len;
+ int pt;
+
+ if (aCStr)
+ {
+ //skip leading white space
+ skip = mimeHdrLine::skipWS ((const char *) aCStr);
+ if (skip > 0)
+ {
+ aCStr += skip;
+ retVal += skip;
+ }
+ while (*aCStr)
+ {
+ int advance;
+
+ switch (*aCStr)
+ {
+ case '"':
+ advance = mimeHdrLine::parseQuoted ('"', '"', aCStr);
+ rawFullName += TQCString (aCStr, advance + 1);
+ break;
+ case '(':
+ advance = mimeHdrLine::parseQuoted ('(', ')', aCStr);
+ rawComment += TQCString (aCStr, advance + 1);
+ break;
+ case '<':
+ advance = mimeHdrLine::parseQuoted ('<', '>', aCStr);
+ user = TQCString (aCStr, advance + 1); // copy it
+ len = advance;
+ user = user.mid (1, len - 2); // strip <>
+ len -= 2;
+ pt = user.find('@');
+ host = user.right (len - pt - 1); // split it into host
+ user.truncate(pt); // and user
+ break;
+ default:
+ advance = mimeHdrLine::parseWord ((const char *) aCStr);
+ //if we've seen a FQ mailname the rest must be quoted or is just junk
+ if (user.isEmpty ())
+ {
+ if (*aCStr != ',')
+ {
+ rawFullName += TQCString (aCStr, advance + 1);
+ if (mimeHdrLine::skipWS ((const char *) &aCStr[advance]) > 0)
+ {
+ rawFullName += ' ';
+ }
+ }
+ }
+ break;
+ }
+ if (advance)
+ {
+ retVal += advance;
+ aCStr += advance;
+ }
+ else
+ break;
+ advance = mimeHdrLine::skipWS ((const char *) aCStr);
+ if (advance > 0)
+ {
+ retVal += advance;
+ aCStr += advance;
+ }
+ //reached end of current address
+ if (*aCStr == ',')
+ {
+ advance++;
+ break;
+ }
+ }
+ //let's see what we've got
+ if (rawFullName.isEmpty ())
+ {
+ if (user.isEmpty ())
+ retVal = 0;
+ else
+ {
+ if (host.isEmpty ())
+ {
+ rawFullName = user;
+ user.truncate(0);
+ }
+ }
+ }
+ else if (user.isEmpty ())
+ {
+ pt = rawFullName.find ('@');
+ if (pt >= 0)
+ {
+ user = rawFullName;
+ host = user.right (user.length () - pt - 1);
+ user.truncate(pt);
+ rawFullName.truncate(0);
+ }
+ }
+
+#if 0
+// dead
+ if (!rawFullName.isEmpty ())
+ {
+// if(fullName[0] == '"')
+// fullName = fullName.mid(1,fullName.length()-2);
+// fullName = fullName.simplifyWhiteSpace().stripWhiteSpace();
+// fullName = rfcDecoder::decodeRFC2047String(fullName.ascii());
+ }
+#endif
+ if (!rawComment.isEmpty ())
+ {
+ if (rawComment[0] == '(')
+ rawComment = rawComment.mid (1, rawComment.length () - 2);
+ rawComment = rawComment.stripWhiteSpace ();
+// comment = rfcDecoder::decodeRFC2047String(comment.ascii());
+ }
+ }
+ else
+ {
+ //debug();
+ }
+ return retVal;
+}
+
+const TQCString
+mailAddress::getStr ()
+{
+ TQCString retVal(128); // Should be generally big enough
+
+ if (!rawFullName.isEmpty ())
+ {
+ KMime::addQuotes( rawFullName, false );
+ retVal = rawFullName + " ";
+ }
+ if (!user.isEmpty ())
+ {
+ retVal += '<';
+ retVal += user;
+ if (!host.isEmpty ()) {
+ retVal += '@';
+ retVal += host;
+ }
+ retVal += '>';
+ }
+ if (!rawComment.isEmpty ())
+ {
+ retVal = '(' + rawComment + ')';
+ }
+// kdDebug(7116) << "mailAddress::getStr - '" << retVal << "'" << endl;
+ return retVal;
+}
+
+bool
+mailAddress::isEmpty () const
+{
+ return user.isEmpty ();
+}
+
+void
+mailAddress::setFullName (const TQString & _str)
+{
+ rawFullName = rfcDecoder::encodeRFC2047String (_str).latin1 ();
+}
+const TQString
+mailAddress::getFullName () const
+{
+ return rfcDecoder::decodeRFC2047String (rawFullName);
+}
+
+void
+mailAddress::setCommentRaw (const TQCString & _str)
+{
+ rawComment = _str;
+}
+
+void
+mailAddress::setComment (const TQString & _str)
+{
+ rawComment = rfcDecoder::encodeRFC2047String (_str).latin1 ();
+}
+const TQString
+mailAddress::getComment () const
+{
+ return rfcDecoder::decodeRFC2047String (rawComment);
+}
+
+const TQCString &
+mailAddress::getCommentRaw () const
+{
+ return rawComment;
+}
+
+TQString
+mailAddress::emailAddrAsAnchor (const mailAddress & adr, bool shortAdr)
+{
+ TQString retVal;
+ if (!adr.getFullName ().isEmpty ())
+ {
+ // should do some umlaut escaping
+ retVal += adr.getFullName () + " ";
+ }
+ if (!adr.getUser ().isEmpty () && !shortAdr)
+ {
+ retVal += "&lt;" + adr.getUser ();
+ if (!adr.getHost ().isEmpty ())
+ retVal += "@" + adr.getHost ();
+ retVal += "&gt; ";
+ }
+ if (!adr.getComment ().isEmpty ())
+ {
+ // should do some umlaut escaping
+ retVal = '(' + adr.getComment () + ')';
+ }
+
+ if (!adr.getUser ().isEmpty ())
+ {
+ TQString mail;
+ mail = adr.getUser ();
+ if (!mail.isEmpty () && !adr.getHost ().isEmpty ())
+ mail += "@" + adr.getHost ();
+ if (!mail.isEmpty ())
+ retVal = "<A HREF=\"mailto:" + mail + "\">" + retVal + "</A>";
+ }
+ return retVal;
+}
+
+TQString
+mailAddress::emailAddrAsAnchor (const TQPtrList < mailAddress > &list, bool value)
+{
+ TQString retVal;
+ TQPtrListIterator < mailAddress > it (list);
+
+ while (it.current ())
+ {
+ retVal += emailAddrAsAnchor ((*it.current ()), value) + "<BR></BR>\n";
+ ++it;
+ }
+
+ return retVal;
+}
+
+
+void mailAddress::clear() {
+ user.truncate(0);
+ host.truncate(0);
+ rawFullName.truncate(0);
+ rawComment.truncate(0);
+}
+