kioslave/imap4
mailaddress.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
00043 }
00044
00045 mailAddress & mailAddress::operator = (const mailAddress & lr)
00046 {
00047
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
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
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);
00106 len = advance;
00107 user = user.mid (1, len - 2);
00108 len -= 2;
00109 pt = user.indexOf('@');
00110 host = user.right (len - pt - 1);
00111 user.truncate(pt);
00112 break;
00113 default:
00114 advance = mimeHdrLine::parseWord (aCStr);
00115
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
00143 if (*aCStr == ',')
00144 {
00145 advance++;
00146 break;
00147 }
00148 }
00149
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
00177 if (!rawFullName.isEmpty ())
00178 {
00179
00180
00181
00182
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
00191 }
00192 }
00193 else
00194 {
00195
00196 }
00197 return retVal;
00198 }
00199
00200 const QByteArray mailAddress::getStr () const
00201 {
00202 QByteArray retVal;
00203 retVal.reserve(128);
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
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
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
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