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 += "<" + adr.getUser (); 00275 if (!adr.getHost ().isEmpty ()) 00276 retVal += '@' + adr.getHost (); 00277 retVal += "> "; 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
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon Aug 27 2012 22:08:21 by doxygen 1.7.5 written by Dimitri van Heesch, © 1997-2006
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon Aug 27 2012 22:08:21 by doxygen 1.7.5 written by Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.