• Skip to content
  • Skip to link menu
KDE 4.0 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • 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 ()
00201 {
00202   QByteArray retVal(128, '\0' ); // Should be generally big enough
00203 
00204   if (!rawFullName.isEmpty ())
00205   {
00206     KMime::addQuotes( rawFullName, false );
00207     retVal = rawFullName + ' ';
00208   }
00209   if (!user.isEmpty ())
00210   {
00211     retVal += '<';
00212     retVal += user;
00213     if (!host.isEmpty ()) {
00214       retVal += '@';
00215       retVal += host;
00216     }
00217     retVal += '>';
00218   }
00219   if (!rawComment.isEmpty ())
00220   {
00221     retVal = '(' + rawComment + ')';
00222   }
00223 //  kDebug(7116) <<"mailAddress::getStr - '" << retVal <<"'";
00224   return retVal;
00225 }
00226 
00227 bool mailAddress::isEmpty () const
00228 {
00229   return user.isEmpty ();
00230 }
00231 
00232 void mailAddress::setFullName (const QString & _str)
00233 {
00234   rawFullName = KIMAP::encodeRFC2047String (_str).toLatin1 ();
00235 }
00236 
00237 const QString mailAddress::getFullName () const
00238 {
00239   return KIMAP::decodeRFC2047String (rawFullName);
00240 }
00241 
00242 void mailAddress::setCommentRaw (const QByteArray & _str)
00243 {
00244   rawComment = _str;
00245 }
00246 
00247 void mailAddress::setComment (const QString & _str)
00248 {
00249   rawComment = KIMAP::encodeRFC2047String (_str).toLatin1 ();
00250 }
00251 
00252 const QString mailAddress::getComment () const
00253 {
00254   return KIMAP::decodeRFC2047String (rawComment);
00255 }
00256 
00257 const QByteArray & mailAddress::getCommentRaw () const
00258 {
00259   return rawComment;
00260 }
00261 
00262 QString mailAddress::emailAddrAsAnchor (const mailAddress & adr, bool shortAdr)
00263 {
00264   QString retVal;
00265   if (!adr.getFullName ().isEmpty ())
00266   {
00267     // should do some umlaut escaping
00268     retVal += adr.getFullName () + ' ';
00269   }
00270   if (!adr.getUser ().isEmpty () && !shortAdr)
00271   {
00272     retVal += "&lt;" + adr.getUser ();
00273     if (!adr.getHost ().isEmpty ())
00274       retVal += '@' + adr.getHost ();
00275     retVal += "&gt; ";
00276   }
00277   if (!adr.getComment ().isEmpty ())
00278   {
00279     // should do some umlaut escaping
00280     retVal = '(' + adr.getComment () + ')';
00281   }
00282 
00283   if (!adr.getUser ().isEmpty ())
00284   {
00285     QString mail;
00286     mail = adr.getUser ();
00287     if (!mail.isEmpty () && !adr.getHost ().isEmpty ())
00288       mail += '@' + adr.getHost ();
00289     if (!mail.isEmpty ())
00290       retVal = "<A HREF=\"mailto:" + mail + "\">" + retVal + "</A>";
00291   }
00292   return retVal;
00293 }
00294 
00295 QString mailAddress::emailAddrAsAnchor (const QList < mailAddress *> &list, bool value)
00296 {
00297   QString retVal;
00298   QListIterator < mailAddress *> it (list);
00299 
00300   while (it.hasNext())
00301   {
00302     retVal += emailAddrAsAnchor ((*it.next()), value) + "<BR></BR>\n";
00303   }
00304 
00305   return retVal;
00306 }
00307 
00308 
00309 void mailAddress::clear() {
00310   user.truncate(0);
00311   host.truncate(0);
00312   rawFullName.truncate(0);
00313   rawComment.truncate(0);
00314 }
00315 

kioslave/imap4

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

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • kabc
  • kblog
  • kcal
  • kimap
  • kioslave
  •   imap4
  •   mbox
  • kldap
  • kmime
  • kpimidentities
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.5.5
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