[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdepim/libkdepim
From:       Ingo Klöcker <kloecker () kde ! org>
Date:       2005-03-26 12:45:47
Message-ID: 20050326124547.E44B6627 () office ! kde ! org
[Download RAW message or body]

CVS commit by kloecker: 

- Implement the changes proposed by Dirk with regard to domain names in email addresses, i.e. a domain \
                names can only contain letters, numbers, hyphen and dot and has to contain at least one \
                dot.
- Short-circuit the "@ in local part" case.
- Short-circuit the "local part is empty" case.
- Short-circuit the "@ in domain name" case.
- Short-circuit the "domain part is empty" case.
- The above makes the isEmptyAddress method superfluous, so remove it.
- Coding style changes.


  M +32 -27    linklocator.cpp   1.7
  M +0 -1      linklocator.h   1.5


--- kdepim/libkdepim/linklocator.h  #1.4:1.5
@@ -152,5 +152,4 @@ private:
   bool atUrl() const;
   bool isEmptyUrl(const QString& url);
-  bool isEmptyAddress(const QString& address);
 
   /**

--- kdepim/libkdepim/linklocator.cpp  #1.6:1.7
@@ -32,4 +32,6 @@
 #include <qfile.h>
 
+#include <limits.h>
+
 QMap<QString, QString> *LinkLocator::s_smileyEmoticonNameMap = 0;
 QMap<QString, QString> *LinkLocator::s_smileyEmoticonHTMLCache = 0;
@@ -162,6 +164,5 @@ QString LinkLocator::getEmailAddress()
   QString address;
 
-  if(mText[mPos] == '@')
-  {
+  if ( mText[mPos] == '@' ) {
     // the following characters are allowed in a dot-atom (RFC 2822):
     // a-z A-Z 0-9 . ! # $ % & ' * + - / = ? ^ _ ` { | } ~
@@ -170,34 +171,45 @@ QString LinkLocator::getEmailAddress()
     // determine the local part of the email address
     int start = mPos - 1;
-    while (start >= 0 && mText[start].unicode() < 128 &&
-      (mText[start].isLetterOrNumber() ||
+    while ( start >= 0 && mText[start].unicode() < 128 &&
+            ( mText[start].isLetterOrNumber() ||
         mText[start] == '@' || // allow @ to find invalid email addresses
-        allowedSpecialChars.find(mText[start]) != -1))
-    {
+              allowedSpecialChars.find( mText[start] ) != -1 ) ) {
+      if ( mText[start] == '@' )
+        return QString(); // local part contains '@' -> no email address
       --start;
     }
     ++start;
     // we assume that an email address starts with a letter or a digit
-    while (allowedSpecialChars.find(mText[start]) != -1)
+    while ( ( start < mPos ) && !mText[start].isLetterOrNumber() )
       ++start;
+    if ( start == mPos )
+      return QString(); // local part is empty -> no email address
 
     // determine the domain part of the email address
+    int dotPos = INT_MAX;
     int end = mPos + 1;
-    while (end < (int)mText.length() &&
-      (mText[end].isLetterOrNumber() ||
+    while ( end < (int)mText.length() &&
+            ( mText[end].isLetterOrNumber() ||
         mText[end] == '@' || // allow @ to find invalid email addresses
-        allowedSpecialChars.find(mText[end]) != -1))
-    {
+              mText[end] == '.' ||
+              mText[end] == '-' ) ) {
+      if ( mText[end] == '@' )
+        return QString(); // domain part contains '@' -> no email address
+      if ( mText[end] == '.' )
+        dotPos = QMIN( dotPos, end ); // remember index of first dot in domain
       ++end;
     }
     // we assume that an email address ends with a letter or a digit
-    while (allowedSpecialChars.find(mText[end - 1]) != -1)
+    while ( ( end > mPos ) && !mText[end - 1].isLetterOrNumber() )
       --end;
+    if ( end == mPos )
+      return QString(); // domain part is empty -> no email address
+    if ( dotPos >= end )
+      return QString(); // domain part doesn't contain a dot
 
-    address = mText.mid(start, end - start);
-    if(isEmptyAddress(address) || end - start > maxAddressLen() || address.contains('@') != 1)
-      address = "";
+    if ( end - start > maxAddressLen() )
+      return QString(); // too long -> most likely no email address
+    address = mText.mid( start, end - start );
 
-    if(!address.isEmpty())
       mPos = end - 1;
   }
@@ -205,11 +217,4 @@ QString LinkLocator::getEmailAddress()
 }
 
-bool LinkLocator::isEmptyAddress(const QString& address)
-{
-  return address.isEmpty() ||
-         address[0] == '@' ||
-         address[address.length() - 1] == '@';
-}
-
 QString LinkLocator::convertToHtml(const QString& plainText, int flags,
   int maxUrlLen, int maxAddressLen)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic