email.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
00025
00026
00027
00028
00029
00030
00031 #include "email.h"
00032 #include <kdebug.h>
00033
00034
00035 QStringList KPIM::splitEmailAddrList(const QString& aStr)
00036 {
00037
00038
00039
00040
00041
00042
00043
00044
00045 QStringList list;
00046
00047 if (aStr.isEmpty())
00048 return list;
00049
00050 QString addr;
00051 uint addrstart = 0;
00052 int commentlevel = 0;
00053 bool insidequote = false;
00054
00055 for (uint index=0; index<aStr.length(); index++) {
00056
00057
00058 switch (aStr[index].latin1()) {
00059 case '"' :
00060 if (commentlevel == 0)
00061 insidequote = !insidequote;
00062 break;
00063 case '(' :
00064 if (!insidequote)
00065 commentlevel++;
00066 break;
00067 case ')' :
00068 if (!insidequote) {
00069 if (commentlevel > 0)
00070 commentlevel--;
00071 else {
00072 kdDebug(5300) << "Error in address splitting: Unmatched ')'"
00073 << endl;
00074 return list;
00075 }
00076 }
00077 break;
00078 case '\\' :
00079 index++;
00080 break;
00081 case ',' :
00082 if (!insidequote && (commentlevel == 0)) {
00083 addr = aStr.mid(addrstart, index-addrstart);
00084 if (!addr.isEmpty())
00085 list += addr.simplifyWhiteSpace();
00086 addrstart = index+1;
00087 }
00088 break;
00089 }
00090 }
00091
00092 if (!insidequote && (commentlevel == 0)) {
00093 addr = aStr.mid(addrstart, aStr.length()-addrstart);
00094 if (!addr.isEmpty())
00095 list += addr.simplifyWhiteSpace();
00096 }
00097 else
00098 kdDebug(5300) << "Error in address splitting: "
00099 << "Unexpected end of address list"
00100 << endl;
00101
00102 return list;
00103 }
00104
00105
00106 QCString KPIM::getEmailAddr(const QString& aStr)
00107 {
00108 int a, i, j, len, found = 0;
00109 QChar c;
00110
00111 a = aStr.find('@');
00112 if (a<0) return aStr.latin1();
00113
00114 for (i = a - 1; i >= 0; i--) {
00115 c = aStr[i];
00116 if (c == '<' || c == '(' || c == ' ') found = 1;
00117 if (found) break;
00118 }
00119
00120 found = 0;
00121
00122 for (j = a + 1; j < (int)aStr.length(); j++) {
00123 c = aStr[j];
00124 if (c == '>' || c == ')' || c == ' ') found = 1;
00125 if (found) break;
00126 }
00127
00128 len = j - (i + 1);
00129 return aStr.mid(i+1,len).latin1();
00130 }
00131
00132 bool KPIM::getNameAndMail(const QString& aStr, QString& name, QString& mail)
00133 {
00134 name = QString::null;
00135 mail = QString::null;
00136
00137 const int len=aStr.length();
00138 const char cQuotes = '"';
00139
00140 bool bInComment, bInQuotesOutsideOfEmail;
00141 int i=0, iAd=0, iMailStart=0, iMailEnd=0;
00142 QChar c;
00143
00144
00145
00146 bInComment = false;
00147 while( i < len ){
00148 c = aStr[i];
00149 if( !bInComment ){
00150 if( '(' == c ){
00151 bInComment = true;
00152 }else{
00153 if( '@' == c ){
00154 iAd = i;
00155 break;
00156 }
00157 }
00158 }else{
00159 if( ')' == c ){
00160 bInComment = false;
00161 }
00162 }
00163 ++i;
00164 }
00165
00166 if( !iAd ){
00167
00168
00169
00170 for( i = 0; len > i; ++i ) {
00171 c = aStr[i];
00172 if( '<' != c )
00173 name.append( c );
00174 else
00175 break;
00176 }
00177 mail = aStr.mid( i+1 );
00178 if ( mail.endsWith( ">" ) )
00179 mail.truncate( mail.length() - 1 );
00180
00181 }else{
00182
00183
00184
00185
00186 bInComment = false;
00187 bInQuotesOutsideOfEmail = false;
00188 for( i = iAd-1; 0 <= i; --i ) {
00189 c = aStr[i];
00190 if( bInComment ){
00191 if( '(' == c ){
00192 if( !name.isEmpty() )
00193 name.prepend( ' ' );
00194 bInComment = false;
00195 }else{
00196 name.prepend( c );
00197 }
00198 }else if( bInQuotesOutsideOfEmail ){
00199 if( cQuotes == c )
00200 bInQuotesOutsideOfEmail = false;
00201 else
00202 name.prepend( c );
00203 }else{
00204
00205 if( ',' == c )
00206 break;
00207
00208 if( iMailStart ){
00209 if( cQuotes == c )
00210 bInQuotesOutsideOfEmail = true;
00211 else
00212 name.prepend( c );
00213 }else{
00214 switch( c ){
00215 case '<':
00216 iMailStart = i;
00217 break;
00218 case ')':
00219 if( !name.isEmpty() )
00220 name.prepend( ' ' );
00221 bInComment = true;
00222 break;
00223 default:
00224 if( ' ' != c )
00225 mail.prepend( c );
00226 }
00227 }
00228 }
00229 }
00230
00231 name = name.simplifyWhiteSpace();
00232 mail = mail.simplifyWhiteSpace();
00233
00234 if( mail.isEmpty() )
00235 return false;
00236
00237 mail.append('@');
00238
00239
00240
00241
00242 bInComment = false;
00243 bInQuotesOutsideOfEmail = false;
00244 for( i = iAd+1; len > i; ++i ) {
00245 c = aStr[i];
00246 if( bInComment ){
00247 if( ')' == c ){
00248 if( !name.isEmpty() )
00249 name.append( ' ' );
00250 bInComment = false;
00251 }else{
00252 name.append( c );
00253 }
00254 }else if( bInQuotesOutsideOfEmail ){
00255 if( cQuotes == c )
00256 bInQuotesOutsideOfEmail = false;
00257 else
00258 name.append( c );
00259 }else{
00260
00261 if( ',' == c )
00262 break;
00263
00264 if( iMailEnd ){
00265 if( cQuotes == c )
00266 bInQuotesOutsideOfEmail = true;
00267 else
00268 name.append( c );
00269 }else{
00270 switch( c ){
00271 case '>':
00272 iMailEnd = i;
00273 break;
00274 case '(':
00275 if( !name.isEmpty() )
00276 name.append( ' ' );
00277 bInComment = true;
00278 break;
00279 default:
00280 if( ' ' != c )
00281 mail.append( c );
00282 }
00283 }
00284 }
00285 }
00286 }
00287
00288 name = name.simplifyWhiteSpace();
00289 mail = mail.simplifyWhiteSpace();
00290
00291 return ! (name.isEmpty() || mail.isEmpty());
00292 }
00293
00294 bool KPIM::compareEmail( const QString& email1, const QString& email2,
00295 bool matchName )
00296 {
00297 QString e1Name, e1Email, e2Name, e2Email;
00298
00299 getNameAndMail( email1, e1Name, e1Email );
00300 getNameAndMail( email2, e2Name, e2Email );
00301
00302 return e1Email == e2Email &&
00303 ( !matchName || ( e1Name == e2Name ) );
00304 }
This file is part of the documentation for libkdepim Library Version 3.3.2.