libkdepim Library API Documentation

email.cpp

00001 /* -*- mode: C++; c-file-style: "gnu" -*- 00002 00003 This file is part of kdepim. 00004 Copyright (c) 2004 KDEPIM developers 00005 00006 KMail is free software; you can redistribute it and/or modify it 00007 under the terms of the GNU General Public License, version 2, as 00008 published by the Free Software Foundation. 00009 00010 KMail is distributed in the hope that it will be useful, but 00011 WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 00019 In addition, as a special exception, the copyright holders give 00020 permission to link the code of this program with any edition of 00021 the Qt library by Trolltech AS, Norway (or with modified versions 00022 of Qt that use the same license as Qt), and distribute linked 00023 combinations including the two. You must obey the GNU General 00024 Public License in all respects for all of the code used other than 00025 Qt. If you modify this file, you may extend this exception to 00026 your version of the file, but you are not obligated to do so. If 00027 you do not wish to do so, delete this exception statement from 00028 your version. 00029 */ 00030 00031 #include "email.h" 00032 #include <kdebug.h> 00033 00034 //----------------------------------------------------------------------------- 00035 QStringList KPIM::splitEmailAddrList(const QString& aStr) 00036 { 00037 // Features: 00038 // - always ignores quoted characters 00039 // - ignores everything (including parentheses and commas) 00040 // inside quoted strings 00041 // - supports nested comments 00042 // - ignores everything (including double quotes and commas) 00043 // inside comments 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 // the following conversion to latin1 is o.k. because 00057 // we can safely ignore all non-latin1 characters 00058 switch (aStr[index].latin1()) { 00059 case '"' : // start or end of quoted string 00060 if (commentlevel == 0) 00061 insidequote = !insidequote; 00062 break; 00063 case '(' : // start of comment 00064 if (!insidequote) 00065 commentlevel++; 00066 break; 00067 case ')' : // end of comment 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 '\\' : // quoted character 00079 index++; // ignore the quoted character 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 // append the last address to the list 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 // Find the '@' in the email address: 00111 a = aStr.find('@'); 00112 if (a<0) return aStr.latin1(); 00113 // Loop backwards until we find '<', '(', ' ', or beginning of string. 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 // Reset found for next loop. 00120 found = 0; 00121 // Loop forwards until we find '>', ')', ' ', or end of string. 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 // Calculate the length and return the result. 00128 len = j - (i + 1); 00129 return aStr.mid(i+1,len).latin1(); 00130 } 00131 00132 //static: 00133 bool KPIM::getNameAndMail(const QString& aStr, QString& name, QString& mail) 00134 { 00135 name = QString::null; 00136 mail = QString::null; 00137 00138 const int len=aStr.length(); 00139 const char cQuotes = '"'; 00140 00141 bool bInComment, bInQuotesOutsideOfEmail; 00142 int i=0, iAd=0, iMailStart=0, iMailEnd=0; 00143 QChar c; 00144 00145 // Find the '@' of the email address 00146 // skipping all '@' inside "(...)" comments: 00147 bInComment = false; 00148 while( i < len ){ 00149 c = aStr[i]; 00150 if( !bInComment ){ 00151 if( '(' == c ){ 00152 bInComment = true; 00153 }else{ 00154 if( '@' == c ){ 00155 iAd = i; 00156 break; // found it 00157 } 00158 } 00159 }else{ 00160 if( ')' == c ){ 00161 bInComment = false; 00162 } 00163 } 00164 ++i; 00165 } 00166 00167 if( !iAd ){ 00168 // We suppose the user is typing the string manually and just 00169 // has not finished typing the mail address part. 00170 // So we take everything that's left of the '<' as name and the rest as mail 00171 for( i = 0; len > i; ++i ) { 00172 c = aStr[i]; 00173 if( '<' != c ) 00174 name.append( c ); 00175 else 00176 break; 00177 } 00178 mail = aStr.mid( i+1 ); 00179 00180 }else{ 00181 00182 // Loop backwards until we find the start of the string 00183 // or a ',' that is outside of a comment 00184 // and outside of quoted text before the leading '<'. 00185 bInComment = false; 00186 bInQuotesOutsideOfEmail = false; 00187 for( i = iAd-1; 0 <= i; --i ) { 00188 c = aStr[i]; 00189 if( bInComment ){ 00190 if( '(' == c ){ 00191 if( !name.isEmpty() ) 00192 name.prepend( ' ' ); 00193 bInComment = false; 00194 }else{ 00195 name.prepend( c ); // all comment stuff is part of the name 00196 } 00197 }else if( bInQuotesOutsideOfEmail ){ 00198 if( cQuotes == c ) 00199 bInQuotesOutsideOfEmail = false; 00200 name.prepend( c ); 00201 }else{ 00202 // found the start of this addressee ? 00203 if( ',' == c ) 00204 break; 00205 // stuff is before the leading '<' ? 00206 if( iMailStart ){ 00207 if( cQuotes == c ) 00208 bInQuotesOutsideOfEmail = true; // end of quoted text found 00209 name.prepend( c ); 00210 }else{ 00211 switch( c ){ 00212 case '<': 00213 iMailStart = i; 00214 break; 00215 case ')': 00216 if( !name.isEmpty() ) 00217 name.prepend( ' ' ); 00218 bInComment = true; 00219 break; 00220 default: 00221 if( ' ' != c ) 00222 mail.prepend( c ); 00223 } 00224 } 00225 } 00226 } 00227 00228 name = name.simplifyWhiteSpace(); 00229 mail = mail.simplifyWhiteSpace(); 00230 00231 if( mail.isEmpty() ) 00232 return false; 00233 00234 mail.append('@'); 00235 00236 // Loop forward until we find the end of the string 00237 // or a ',' that is outside of a comment 00238 // and outside of quoted text behind the trailing '>'. 00239 bInComment = false; 00240 bInQuotesOutsideOfEmail = false; 00241 for( i = iAd+1; len > i; ++i ) { 00242 c = aStr[i]; 00243 if( bInComment ){ 00244 if( ')' == c ){ 00245 if( !name.isEmpty() ) 00246 name.append( ' ' ); 00247 bInComment = false; 00248 }else{ 00249 name.append( c ); // all comment stuff is part of the name 00250 } 00251 }else if( bInQuotesOutsideOfEmail ){ 00252 if( cQuotes == c ) 00253 bInQuotesOutsideOfEmail = false; 00254 name.append( c ); 00255 }else{ 00256 // found the end of this addressee ? 00257 if( ',' == c ) 00258 break; 00259 // stuff is behind the trailing '>' ? 00260 if( iMailEnd ){ 00261 if( cQuotes == c ) 00262 bInQuotesOutsideOfEmail = true; // start of quoted text found 00263 name.append( c ); 00264 }else{ 00265 switch( c ){ 00266 case '>': 00267 iMailEnd = i; 00268 break; 00269 case '(': 00270 if( !name.isEmpty() ) 00271 name.append( ' ' ); 00272 bInComment = true; 00273 break; 00274 default: 00275 if( ' ' != c ) 00276 mail.append( c ); 00277 } 00278 } 00279 } 00280 } 00281 } 00282 00283 name = name.simplifyWhiteSpace(); 00284 mail = mail.simplifyWhiteSpace(); 00285 00286 return ! (name.isEmpty() || mail.isEmpty()); 00287 }
KDE Logo
This file is part of the documentation for libkdepim Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Aug 27 12:50:24 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003