• Skip to content
  • Skip to link menu
KDE 4.8 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • KDE Home
  • Contact Us
 

kioslave/imap4

mailaddress.cpp
00001 /**********************************************************************
00002  *
00003  *   mailaddress.cc  - mail address parser
00004  *   Copyright (C) 2000 Sven Carstens <s.carstens@gmx.de>
00005  *
00006  *   This program is free software; you can redistribute it and/or modify
00007  *   it under the terms of the GNU General Public License as published by
00008  *   the Free Software Foundation; either version 2 of the License, or
00009  *   (at your option) any later version.
00010  *
00011  *   This program is distributed in the hope that it will be useful,
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *   GNU General Public License for more details.
00015  *
00016  *   You should have received a copy of the GNU General Public License
00017  *   along with this program; if not, write to the Free Software
00018  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  *   Send comments and bug fixes to
00021  *
00022  *********************************************************************/
00023 
00024 #include "mailaddress.h"
00025 #include "mimehdrline.h"
00026 #include <kimap/rfccodecs.h>
00027 #include <kmime/kmime_util.h>
00028 #include <QByteArray>
00029 
00030 using namespace KIMAP;
00031 
00032 mailAddress::mailAddress ()
00033 {
00034 }
00035 
00036 mailAddress::mailAddress (const mailAddress & lr):
00037 user (lr.user),
00038 host (lr.host),
00039 rawFullName (lr.rawFullName),
00040 rawComment (lr.rawComment)
00041 {
00042 //  kDebug(7116) <<"mailAddress::mailAddress -" << getStr();
00043 }
00044 
00045 mailAddress & mailAddress::operator = (const mailAddress & lr)
00046 {
00047   // Avoid a = a.
00048   if (this == &lr)
00049     return *this;
00050 
00051   user = lr.user;
00052   host = lr.host;
00053   rawFullName = lr.rawFullName;
00054   rawComment = lr.rawComment;
00055 
00056 //  kDebug(7116) <<"mailAddress::operator= -" << getStr();
00057 
00058   return *this;
00059 }
00060 
00061 
00062 
00063 
00064 mailAddress::~mailAddress ()
00065 {
00066 }
00067 
00068 mailAddress::mailAddress (char *aCStr)
00069 {
00070   parseAddress (aCStr);
00071 }
00072 
00073 int mailAddress::parseAddress (const char *aCStr)
00074 {
00075   int retVal = 0;
00076   int skip;
00077   uint len;
00078   int pt;
00079 
00080   if (aCStr)
00081   {
00082     //skip leading white space
00083     skip = mimeHdrLine::skipWS (aCStr);
00084     if (skip > 0)
00085     {
00086       aCStr += skip;
00087       retVal += skip;
00088     }
00089     while (*aCStr)
00090     {
00091       int advance;
00092 
00093       switch (*aCStr)
00094       {
00095       case '"':
00096         advance = mimeHdrLine::parseQuoted ('"', '"', aCStr);
00097         rawFullName += QByteArray (aCStr, advance);
00098         break;
00099       case '(':
00100         advance = mimeHdrLine::parseQuoted ('(', ')', aCStr);
00101         rawComment += QByteArray (aCStr, advance);
00102         break;
00103       case '<':
00104         advance = mimeHdrLine::parseQuoted ('<', '>', aCStr);
00105         user = QByteArray (aCStr, advance); // copy it
00106         len = advance;
00107         user = user.mid (1, len - 2);  // strip <>
00108         len -= 2;
00109         pt = user.indexOf('@');
00110         host = user.right (len - pt - 1); // split it into host
00111         user.truncate(pt); // and user
00112         break;
00113       default:
00114         advance = mimeHdrLine::parseWord (aCStr);
00115         //if we've seen a FQ mailname the rest must be quoted or is just junk
00116         if (user.isEmpty ())
00117         {
00118           if (*aCStr != ',')
00119           {
00120             rawFullName += aCStr;
00121             if (mimeHdrLine::skipWS (aCStr+advance) > 0)
00122             {
00123               rawFullName += ' ';
00124             }
00125           }
00126         }
00127         break;
00128       }
00129       if (advance)
00130       {
00131         retVal += advance;
00132         aCStr += advance;
00133       }
00134       else
00135         break;
00136       advance = mimeHdrLine::skipWS (aCStr);
00137       if (advance > 0)
00138       {
00139         retVal += advance;
00140         aCStr += advance;
00141       }
00142       //reached end of current address
00143       if (*aCStr == ',')
00144       {
00145         advance++;
00146         break;
00147       }
00148     }
00149     //let's see what we've got
00150     if (rawFullName.isEmpty ())
00151     {
00152       if (user.isEmpty ())
00153         retVal = 0;
00154       else
00155       {
00156         if (host.isEmpty ())
00157         {
00158           rawFullName = user;
00159           user.truncate(0);
00160         }
00161       }
00162     }
00163     else if (user.isEmpty ())
00164     {
00165       pt = rawFullName.indexOf ('@');
00166       if (pt >= 0)
00167       {
00168         user = rawFullName;
00169         host = user.right (user.length () - pt - 1);
00170         user.truncate(pt);
00171         rawFullName.truncate(0);
00172       }
00173     }
00174     
00175 #if 0
00176 // dead
00177     if (!rawFullName.isEmpty ())
00178     {
00179 //      if(fullName[0] == '"')
00180 //        fullName = fullName.mid(1,fullName.length()-2);
00181 //      fullName = fullName.simplified().trimmed();
00182 //      fullName = KIMAP::decodeRFC2047String(fullName.ascii());
00183     }
00184 #endif
00185     if (!rawComment.isEmpty ())
00186     {
00187       if (rawComment[0] == '(')
00188         rawComment = rawComment.mid (1, rawComment.length () - 2);
00189       rawComment = rawComment.trimmed ();
00190 //      comment = KIMAP::decodeRFC2047String(comment.ascii());
00191     }
00192   }
00193   else
00194   {
00195     //debug();
00196   }
00197   return retVal;
00198 }
00199 
00200 const QByteArray mailAddress::getStr () const
00201 {
00202   QByteArray retVal;
00203   retVal.reserve(128); // Should be generally big enough
00204 
00205   if (!rawFullName.isEmpty ())
00206   {
00207     QByteArray tmpName( rawFullName );
00208     KMime::addQuotes( tmpName, false );
00209     retVal = tmpName + ' ';
00210   }
00211   if (!user.isEmpty ())
00212   {
00213     retVal += '<';
00214     retVal += user;
00215     if (!host.isEmpty ()) {
00216       retVal += '@';
00217       retVal += host;
00218     }
00219     retVal += '>';
00220   }
00221   if (!rawComment.isEmpty ())
00222   {
00223     retVal += " (" + rawComment + ')';
00224   }
00225   //kDebug() << retVal;
00226   return retVal;
00227 }
00228 
00229 bool mailAddress::isEmpty () const
00230 {
00231   return user.isEmpty ();
00232 }
00233 
00234 void mailAddress::setFullName (const QString & _str)
00235 {
00236   rawFullName = KIMAP::encodeRFC2047String (_str).toLatin1 ();
00237 }
00238 
00239 const QString mailAddress::getFullName () const
00240 {
00241   return KIMAP::decodeRFC2047String (rawFullName);
00242 }
00243 
00244 void mailAddress::setCommentRaw (const QByteArray & _str)
00245 {
00246   rawComment = _str;
00247 }
00248 
00249 void mailAddress::setComment (const QString & _str)
00250 {
00251   rawComment = KIMAP::encodeRFC2047String (_str).toLatin1 ();
00252 }
00253 
00254 const QString mailAddress::getComment () const
00255 {
00256   return KIMAP::decodeRFC2047String (rawComment);
00257 }
00258 
00259 const QByteArray & mailAddress::getCommentRaw () const
00260 {
00261   return rawComment;
00262 }
00263 
00264 QString mailAddress::emailAddrAsAnchor (const mailAddress & adr, bool shortAdr)
00265 {
00266   QString retVal;
00267   if (!adr.getFullName ().isEmpty ())
00268   {
00269     // should do some umlaut escaping
00270     retVal += adr.getFullName () + ' ';
00271   }
00272   if (!adr.getUser ().isEmpty () && !shortAdr)
00273   {
00274     retVal += "&lt;" + adr.getUser ();
00275     if (!adr.getHost ().isEmpty ())
00276       retVal += '@' + adr.getHost ();
00277     retVal += "&gt; ";
00278   }
00279   if (!adr.getComment ().isEmpty ())
00280   {
00281     // should do some umlaut escaping
00282     retVal = '(' + adr.getComment () + ')';
00283   }
00284 
00285   if (!adr.getUser ().isEmpty ())
00286   {
00287     QString mail;
00288     mail = adr.getUser ();
00289     if (!mail.isEmpty () && !adr.getHost ().isEmpty ())
00290       mail += '@' + adr.getHost ();
00291     if (!mail.isEmpty ())
00292       retVal = "<A HREF=\"mailto:" + mail + "\">" + retVal + "</A>";
00293   }
00294   return retVal;
00295 }
00296 
00297 QString mailAddress::emailAddrAsAnchor (const QList < mailAddress *> &list, bool value)
00298 {
00299   QString retVal;
00300   QListIterator < mailAddress *> it (list);
00301 
00302   while (it.hasNext())
00303   {
00304     retVal += emailAddrAsAnchor ((*it.next()), value) + "<BR></BR>\n";
00305   }
00306 
00307   return retVal;
00308 }
00309 
00310 
00311 void mailAddress::clear() {
00312   user.truncate(0);
00313   host.truncate(0);
00314   rawFullName.truncate(0);
00315   rawComment.truncate(0);
00316 }
00317 

kioslave/imap4

Skip menu "kioslave/imap4"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Related Pages

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.7.6.1
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal