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

List:       kde-commits
Subject:    [kdepim/KDE/4.14] libkdepim/addressline: Fix Bug 336163 - autocompletion shows multiple entries for 
From:       Montel Laurent <montel () kde ! org>
Date:       2015-02-04 8:34:32
Message-ID: E1YIvPs-0003Z3-9k () scm ! kde ! org
[Download RAW message or body]

Git commit 84a0945c2e0c00de317de50e7f0c9e0156d08071 by Montel Laurent.
Committed on 04/02/2015 at 08:33.
Pushed by mlaurent into branch 'KDE/4.14'.

Fix Bug 336163 - autocompletion shows multiple entries for one contact with different \
quotes

Adapt patch from Sandro Knauß to new baloocompletionemail class
+ unittest
etc.

BUG: 336163
FIXED-IN: 14.12.3

M  +1    -1    libkdepim/addressline/autotests/CMakeLists.txt
M  +10   -0    libkdepim/addressline/autotests/baloocompletionemailtest.cpp
M  +1    -0    libkdepim/addressline/autotests/baloocompletionemailtest.h
M  +40   -3    libkdepim/addressline/baloocompletionemail.cpp
M  +2    -1    libkdepim/addressline/baloocompletionemail.h

http://commits.kde.org/kdepim/84a0945c2e0c00de317de50e7f0c9e0156d08071

diff --git a/libkdepim/addressline/autotests/CMakeLists.txt \
b/libkdepim/addressline/autotests/CMakeLists.txt index de9a0ca..14eb76e 100644
--- a/libkdepim/addressline/autotests/CMakeLists.txt
+++ b/libkdepim/addressline/autotests/CMakeLists.txt
@@ -6,5 +6,5 @@ include_directories(
 
 set( libkdepim_baloocompletionemailtest_SRCS baloocompletionemailtest.cpp \
../baloocompletionemail.cpp)  kde4_add_unit_test( libkdepim_baloocompletionemailtest \
                ${libkdepim_baloocompletionemailtest_SRCS})
-target_link_libraries( libkdepim_baloocompletionemailtest ${QT_QTTEST_LIBRARY} \
${KDE4_KDEUI_LIBS}) +target_link_libraries( libkdepim_baloocompletionemailtest \
${QT_QTTEST_LIBRARY} ${KDE4_KDEUI_LIBS} ${KDEPIMLIBS_KPIMUTILS_LIBS})  
diff --git a/libkdepim/addressline/autotests/baloocompletionemailtest.cpp \
b/libkdepim/addressline/autotests/baloocompletionemailtest.cpp index 95c00e3..bc7aa9b \
                100644
--- a/libkdepim/addressline/autotests/baloocompletionemailtest.cpp
+++ b/libkdepim/addressline/autotests/baloocompletionemailtest.cpp
@@ -160,7 +160,17 @@ void \
BalooCompletionEmailTest::shouldDontDuplicateEmailWhenUseCase()  caseEmailList << \
QLatin1String("FOo3");  completion.setEmailList((QStringList() << \
emailList<<caseEmailList));  QCOMPARE(completion.cleanupEmailList(), emailList);
+}
 
+void BalooCompletionEmailTest::shouldExcludeDuplicateEntryWithDisplayName()
+{
+    KPIM::BalooCompletionEmail completion;
+    QStringList emailList;
+    emailList << QLatin1String("John Doe <doe@example.com>");
+    emailList << QLatin1String("\"John Doe\" <doe@example.com>");
+    emailList << QLatin1String("\"\'John Doe\'\" <doe@example.com>");
+    completion.setEmailList(emailList);
+    QCOMPARE(completion.cleanupEmailList().count(), 1);
 }
 
 QTEST_KDEMAIN(BalooCompletionEmailTest, NoGUI)
diff --git a/libkdepim/addressline/autotests/baloocompletionemailtest.h \
b/libkdepim/addressline/autotests/baloocompletionemailtest.h index f49fd25..2e456a7 \
                100644
--- a/libkdepim/addressline/autotests/baloocompletionemailtest.h
+++ b/libkdepim/addressline/autotests/baloocompletionemailtest.h
@@ -39,6 +39,7 @@ private Q_SLOTS:
     void shouldExcludeDomain();
     void shouldReturnEmailListWhenDomainListIsNotNull();
     void shouldDontDuplicateEmailWhenUseCase();
+    void shouldExcludeDuplicateEntryWithDisplayName();
 };
 
 #endif // BALOOCOMPLETIONEMAILTEST_H
diff --git a/libkdepim/addressline/baloocompletionemail.cpp \
b/libkdepim/addressline/baloocompletionemail.cpp index e922863..df81099 100644
--- a/libkdepim/addressline/baloocompletionemail.cpp
+++ b/libkdepim/addressline/baloocompletionemail.cpp
@@ -20,6 +20,7 @@
 
 #include "baloocompletionemail.h"
 #include <QMap>
+#include <KPIMUtils/Email>
 #include <QDebug>
 using namespace KPIM;
 
@@ -43,17 +44,22 @@ void BalooCompletionEmail::setBlackList(const QStringList &lst)
     mBlackList = lst;
 }
 
-QStringList BalooCompletionEmail::cleanupEmailList() const
+QStringList BalooCompletionEmail::cleanupEmailList()
 {
     if (mListEmail.isEmpty())
         return mListEmail;
     QMap<QString, QString> hashEmail;
-    Q_FOREACH (const QString &email, mListEmail) {
+    Q_FOREACH (QString email, mListEmail) {
         if (!mBlackList.contains(email)) {
+            QString address;
+            email = stripEmail(email, address);
+            if (address.isEmpty()) {
+                address = email;
+            }
             bool excludeMail = false;
             Q_FOREACH(const QString &excludeDomain, mExcludeDomain) {
                 if (!excludeDomain.isEmpty()) {
-                    if (email.endsWith(excludeDomain)) {
+                    if (address.endsWith(excludeDomain)) {
                         excludeMail = true;
                         continue;
                     }
@@ -66,3 +72,34 @@ QStringList BalooCompletionEmail::cleanupEmailList() const
     }
     return hashEmail.values();
 }
+
+
+/* stips the name of an email address email
+ *
+ * 'a' <a@example.com> -> a <a@example.com>
+ * "a" <a@example.com> -> a <a@example.com>
+ * "\"'a'\"" <a@example.com> -> a <a@example.com>
+ *
+ * but "\"'a" <a@example.com> -> "\"'a" <a@example.com>
+ * cause the start and end is not the same.
+ */
+QString BalooCompletionEmail::stripEmail(const QString &email, QString &address)
+{
+    QString displayName, addrSpec, comment;
+    if ( KPIMUtils::AddressOk == KPIMUtils::splitAddress( email, displayName, \
addrSpec, comment )) { +        address = addrSpec;
+        while ((displayName.startsWith(QLatin1Char('\'')) && \
displayName.endsWith(QLatin1Char('\''))) || +                    \
(displayName.startsWith(QLatin1Char('"')) && displayName.endsWith(QLatin1Char('"'))) \
|| +                    (displayName.startsWith(QLatin1String("\\\"")) && \
displayName.endsWith(QLatin1String("\\\""))) ) { +            if \
(displayName.startsWith(QLatin1String("\\\""))) { +                displayName = \
displayName.mid(2, displayName.length()-4).trimmed(); +            } else {
+                displayName = displayName.mid(1, displayName.length()-2).trimmed();
+            }
+        }
+        return KPIMUtils::normalizedAddress(displayName, addrSpec, comment);
+    } else {
+        return email;
+    }
+}
+
diff --git a/libkdepim/addressline/baloocompletionemail.h \
b/libkdepim/addressline/baloocompletionemail.h index c4bde3b..786a952 100644
--- a/libkdepim/addressline/baloocompletionemail.h
+++ b/libkdepim/addressline/baloocompletionemail.h
@@ -32,8 +32,9 @@ public:
 
     void setBlackList(const QStringList &lst);
 
-    QStringList cleanupEmailList() const;
+    QStringList cleanupEmailList();
 private:
+    QString stripEmail(const QString &email, QString &address);
     QStringList mListEmail;
     QStringList mExcludeDomain;
     QStringList mBlackList;


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

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