Branch 'kolab/integration/4.13.0' - 2 commits - libkdepim/addressline libksieve/ksieveui

Christian Mollekopf mollekopf at kolabsys.com
Sat Jan 24 20:53:27 CET 2015


 libkdepim/addressline/addresseelineedit.cpp             |   36 ++++++++++++++--
 libksieve/ksieveui/vacation/vacation.cpp                |    5 +-
 libksieve/ksieveui/vacation/vacationdialog.cpp          |   10 ++++
 libksieve/ksieveui/vacation/vacationdialog.h            |    3 +
 libksieve/ksieveui/vacation/vacationeditwidget.cpp      |   26 +++++++++++
 libksieve/ksieveui/vacation/vacationeditwidget.h        |    4 +
 libksieve/ksieveui/vacation/vacationpagewidget.cpp      |    5 +-
 libksieve/ksieveui/vacation/vacationscriptextractor.cpp |    6 ++
 libksieve/ksieveui/vacation/vacationscriptextractor.h   |    8 +++
 libksieve/ksieveui/vacation/vacationutils.cpp           |   22 +++++++++
 libksieve/ksieveui/vacation/vacationutils.h             |    4 +
 11 files changed, 121 insertions(+), 8 deletions(-)

New commits:
commit adc523c16c94ddebfd5f8afe3699bfac61f2d952
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Thu Jan 15 15:44:24 2015 +0100

    VacationDialog: Add subject
    
    You often wants to set also the subject of the vacation messages.
    
    KOLAB: 4226

diff --git a/libksieve/ksieveui/vacation/vacation.cpp b/libksieve/ksieveui/vacation/vacation.cpp
index 5dc81cc..96689fa 100644
--- a/libksieve/ksieveui/vacation/vacation.cpp
+++ b/libksieve/ksieveui/vacation/vacation.cpp
@@ -108,6 +108,7 @@ void Vacation::slotGetResult( KManageSieve::SieveJob * job, bool success,
         mDialog = new VacationDialog( i18n("Configure \"Out of Office\" Replies"), 0, false );
 
     QString messageText = VacationUtils::defaultMessageText();
+    QString subject = VacationUtils::defaultSubject();
     int notificationInterval = VacationUtils::defaultNotificationInterval();
     QStringList aliases = VacationUtils::defaultMailAliases();
     bool sendForSpam = VacationUtils::defaultSendForSpam();
@@ -116,7 +117,7 @@ void Vacation::slotGetResult( KManageSieve::SieveJob * job, bool success,
     QDate endDate = VacationUtils::defaultEndDate();
     if ( !success ) active = false; // default to inactive
 
-    if ( !mCheckOnly && ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, notificationInterval, aliases, sendForSpam, domainName, startDate, endDate ) ) )
+    if ( !mCheckOnly && ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, subject, notificationInterval, aliases, sendForSpam, domainName, startDate, endDate ) ) )
         KMessageBox::information( 0, i18n("Someone (probably you) changed the "
                                           "vacation script on the server.\n"
                                           "KMail is no longer able to determine "
@@ -126,6 +127,7 @@ void Vacation::slotGetResult( KManageSieve::SieveJob * job, bool success,
     mWasActive = active;
     if ( mDialog ) {
         mDialog->setActivateVacation( active );
+        mDialog->setSubject(subject);
         mDialog->setMessageText( messageText );
         mDialog->setNotificationInterval( notificationInterval );
         mDialog->setMailAliases( aliases.join(QLatin1String(", ")) );
@@ -160,6 +162,7 @@ void Vacation::slotDialogOk() {
     kDebug();
     // compose a new script:
     const QString script = VacationUtils::composeScript( mDialog->messageText(),
+                                          mDialog->subject(),
                                           mDialog->notificationInterval(),
                                           mDialog->mailAliases(),
                                           mDialog->sendForSpam(),
diff --git a/libksieve/ksieveui/vacation/vacationdialog.cpp b/libksieve/ksieveui/vacation/vacationdialog.cpp
index 39c5a18..951f663 100644
--- a/libksieve/ksieveui/vacation/vacationdialog.cpp
+++ b/libksieve/ksieveui/vacation/vacationdialog.cpp
@@ -99,6 +99,16 @@ void VacationDialog::setMessageText( const QString &text )
     mVacationEditWidget->setMessageText(text);
 }
 
+QString VacationDialog::subject() const
+{
+    return mVacationEditWidget->subject();
+}
+
+void VacationDialog::setSubject(const QString &subject)
+{
+    return mVacationEditWidget->setSubject(subject);
+}
+
 int VacationDialog::notificationInterval() const
 {
     return mVacationEditWidget->notificationInterval();
diff --git a/libksieve/ksieveui/vacation/vacationdialog.h b/libksieve/ksieveui/vacation/vacationdialog.h
index d43d0aa..02fb0fa 100644
--- a/libksieve/ksieveui/vacation/vacationdialog.h
+++ b/libksieve/ksieveui/vacation/vacationdialog.h
@@ -49,6 +49,9 @@ public:
     QString messageText() const;
     void setMessageText( const QString &text );
 
+    QString subject() const;
+    void setSubject( const QString &subject );
+
     int notificationInterval() const;
     void setNotificationInterval( int days );
 
diff --git a/libksieve/ksieveui/vacation/vacationeditwidget.cpp b/libksieve/ksieveui/vacation/vacationeditwidget.cpp
index ede991f..642f1f2 100644
--- a/libksieve/ksieveui/vacation/vacationeditwidget.cpp
+++ b/libksieve/ksieveui/vacation/vacationeditwidget.cpp
@@ -72,6 +72,16 @@ VacationEditWidget::VacationEditWidget(QWidget *parent)
     mTextEdit->setAcceptRichText( false );
     glay->addWidget( mTextEdit, row, 0, 1, 2 );
 
+    // Subject
+    ++row;
+    mSubject = new KLineEdit(this);
+    mSubject->setObjectName(QLatin1String("mSubject"));
+    mSubject->setClearButtonShown(true);
+    QLabel *tmpLabel = new QLabel(i18n("&Subject of the vacation mail:"), this);
+    tmpLabel->setBuddy(mSubject);
+    glay->addWidget(tmpLabel, row, 0);
+    glay->addWidget(mSubject, row, 1);
+
     // From date
     ++row;
     mStartDate = new KDateComboBox( this );
@@ -111,7 +121,7 @@ VacationEditWidget::VacationEditWidget(QWidget *parent)
     mMailAliasesEdit = new KLineEdit( this );
     mMailAliasesEdit->setObjectName( QLatin1String("mMailAliasesEdit") );
     mMailAliasesEdit->setClearButtonShown( true );
-    QLabel *tmpLabel = new QLabel( i18n("&Send responses for these addresses:"), this );
+    tmpLabel = new QLabel( i18n("&Send responses for these addresses:"), this );
     tmpLabel->setBuddy( mMailAliasesEdit );
     glay->addWidget( tmpLabel, row, 0 );
     glay->addWidget( mMailAliasesEdit, row, 1 );
@@ -273,6 +283,19 @@ void VacationEditWidget::setStartDate( const QDate &startDate )
     mStartDate->setDate( startDate );
 }
 
+void VacationEditWidget::setSubject(const QString &subject)
+{
+    mSubject->setText(subject);
+}
+
+QString VacationEditWidget::subject() const
+{
+    if (mSubject->isEnabled()) {
+        return mSubject->text();
+    } else {
+        return QString();
+    }
+}
 
 void VacationEditWidget::enableDates( bool enable )
 {
@@ -291,6 +314,7 @@ void VacationEditWidget::setDefault()
 {
     setActivateVacation( true );
     setMessageText( VacationUtils::defaultMessageText() );
+    setSubject(VacationUtils::defaultSubject());
     setNotificationInterval( VacationUtils::defaultNotificationInterval() );
     setMailAliases( VacationUtils::defaultMailAliases().join(QLatin1String(", ")) );
     setSendForSpam( VacationUtils::defaultSendForSpam() );
diff --git a/libksieve/ksieveui/vacation/vacationeditwidget.h b/libksieve/ksieveui/vacation/vacationeditwidget.h
index e476eb1..df70d73 100644
--- a/libksieve/ksieveui/vacation/vacationeditwidget.h
+++ b/libksieve/ksieveui/vacation/vacationeditwidget.h
@@ -70,6 +70,9 @@ public:
     QString domainName() const;
     void setDomainName( const QString &domain );
 
+    QString subject() const;
+    void setSubject(const QString &subject);
+
     bool sendForSpam() const;
     void setSendForSpam( bool enable );
 
@@ -92,6 +95,7 @@ protected:
     QCheckBox *mSpamCheck;
     QCheckBox *mDomainCheck;
     KLineEdit *mDomainEdit;
+    KLineEdit *mSubject;
     KDateComboBox *mStartDate;
     KDateComboBox *mEndDate;
 };
diff --git a/libksieve/ksieveui/vacation/vacationpagewidget.cpp b/libksieve/ksieveui/vacation/vacationpagewidget.cpp
index 96bd86e..dbc42ae 100644
--- a/libksieve/ksieveui/vacation/vacationpagewidget.cpp
+++ b/libksieve/ksieveui/vacation/vacationpagewidget.cpp
@@ -117,6 +117,7 @@ void VacationPageWidget::slotGetResult( KManageSieve::SieveJob * job, bool succe
 
     mVacationEditWidget->setEnabled(true);
     QString messageText = VacationUtils::defaultMessageText();
+    QString subject = VacationUtils::defaultSubject();
     int notificationInterval = VacationUtils::defaultNotificationInterval();
     QStringList aliases = VacationUtils::defaultMailAliases();
     bool sendForSpam = VacationUtils::defaultSendForSpam();
@@ -126,12 +127,13 @@ void VacationPageWidget::slotGetResult( KManageSieve::SieveJob * job, bool succe
     if ( !success )
         active = false; // default to inactive
 
-    if ( ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, notificationInterval, aliases, sendForSpam, domainName, startDate, endDate ) ) )
+    if ( ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, subject, notificationInterval, aliases, sendForSpam, domainName, startDate, endDate ) ) )
         mVacationWarningWidget->setVisible(true);
 
     mWasActive = active;
     mVacationEditWidget->setActivateVacation( active );
     mVacationEditWidget->setMessageText( messageText );
+    mVacationEditWidget->setSubject( subject );
     mVacationEditWidget->setNotificationInterval( notificationInterval );
     mVacationEditWidget->setMailAliases( aliases.join(QLatin1String(", ")) );
     mVacationEditWidget->setSendForSpam( sendForSpam );
@@ -154,6 +156,7 @@ KSieveUi::VacationCreateScriptJob *VacationPageWidget::writeScript()
         createJob->setServerUrl(mUrl);
         createJob->setServerName(mServerName);
         const QString script = VacationUtils::composeScript( mVacationEditWidget->messageText(),
+                                                             mVacationEditWidget->subject(),
                                                              mVacationEditWidget->notificationInterval(),
                                                              mVacationEditWidget->mailAliases(),
                                                              mVacationEditWidget->sendForSpam(),
diff --git a/libksieve/ksieveui/vacation/vacationscriptextractor.cpp b/libksieve/ksieveui/vacation/vacationscriptextractor.cpp
index 77a787e..42b5c6d 100644
--- a/libksieve/ksieveui/vacation/vacationscriptextractor.cpp
+++ b/libksieve/ksieveui/vacation/vacationscriptextractor.cpp
@@ -63,6 +63,9 @@ void VacationDataExtractor::taggedArgument( const QString & tag )
         mContext = Days;
     else if ( tag == QLatin1String("addresses") )
         mContext = Addresses;
+    else if (tag == QLatin1String("subject")) {
+        mContext = Subject;
+    }
 }
 
 void VacationDataExtractor::stringArgument( const QString & string, bool, const QString & )
@@ -71,6 +74,9 @@ void VacationDataExtractor::stringArgument( const QString & string, bool, const
     if ( mContext == Addresses ) {
         mAliases.push_back( string );
         mContext = VacationCommand;
+    } else if (mContext == Subject) {
+        mSubject = string;
+        mContext = VacationCommand;
     } else if ( mContext == VacationCommand ) {
         mMessageText = string;
         mContext = VacationCommand;
diff --git a/libksieve/ksieveui/vacation/vacationscriptextractor.h b/libksieve/ksieveui/vacation/vacationscriptextractor.h
index 72f8977..fc03e05 100644
--- a/libksieve/ksieveui/vacation/vacationscriptextractor.h
+++ b/libksieve/ksieveui/vacation/vacationscriptextractor.h
@@ -387,7 +387,7 @@ class VacationDataExtractor : public KSieve::ScriptBuilder {
         // command itself:
         VacationCommand,
         // tagged args:
-        Days, Addresses
+        Days, Addresses, Subject
     };
 public:
     VacationDataExtractor();
@@ -397,6 +397,11 @@ public:
     const QString & messageText() const { return mMessageText; }
     const QStringList & aliases() const { return mAliases; }
 
+    const QString &subject() const
+    {
+        return mSubject;
+    }
+
 private:
     void commandStart( const QString & identifier );
 
@@ -428,6 +433,7 @@ private:
     Context mContext;
     int mNotificationInterval;
     QString mMessageText;
+    QString mSubject;
     QStringList mAliases;
 
     void reset();
diff --git a/libksieve/ksieveui/vacation/vacationutils.cpp b/libksieve/ksieveui/vacation/vacationutils.cpp
index 21dfcf0..5428508 100644
--- a/libksieve/ksieveui/vacation/vacationutils.cpp
+++ b/libksieve/ksieveui/vacation/vacationutils.cpp
@@ -35,6 +35,17 @@ static inline QString dotstuff( QString s ) { // krazy:exclude=passbyvalue
         return s.replace( QLatin1String("\n."), QLatin1String("\n..") );
 }
 
+static inline QString stringReplace(QString s)
+{
+    s = s.replace(QRegExp(QLatin1String("[\n\t]+")),QLatin1String(" "));
+    return s.replace(QLatin1Char('\"'),QLatin1String("\\\""));
+}
+
+QString KSieveUi::VacationUtils::defaultSubject()
+{
+  return i18n("Out of office till %1", QLocale().toString(QDate::currentDate().addDays(1)));
+}
+
 QString KSieveUi::VacationUtils::defaultMessageText() {
     return i18n( "I am out of office till %1.\n"
                  "\n"
@@ -88,12 +99,14 @@ QDate KSieveUi::VacationUtils::defaultEndDate()
 
 
 bool KSieveUi::VacationUtils::parseScript( const QString &script, QString &messageText,
+                            QString &subject,
                             int & notificationInterval, QStringList &aliases,
                             bool & sendForSpam, QString &domainName,
                             QDate & startDate, QDate & endDate )
 {
     if ( script.trimmed().isEmpty() ) {
         messageText = VacationUtils::defaultMessageText();
+        subject = VacationUtils::defaultSubject();
         notificationInterval = VacationUtils::defaultNotificationInterval();
         aliases = VacationUtils::defaultMailAliases();
         sendForSpam = VacationUtils::defaultSendForSpam();
@@ -117,6 +130,9 @@ bool KSieveUi::VacationUtils::parseScript( const QString &script, QString &messa
     if ( !parser.parse() )
         return false;
     messageText = vdx.messageText().trimmed();
+    if (!vdx.subject().isEmpty()) {
+        subject = vdx.subject().trimmed();
+    }
     notificationInterval = vdx.notificationInterval();
     aliases = vdx.aliases();
     if ( !VacationSettings::allowOutOfOfficeUploadButNoSettings() ) {
@@ -129,6 +145,7 @@ bool KSieveUi::VacationUtils::parseScript( const QString &script, QString &messa
 }
 
 QString KSieveUi::VacationUtils::composeScript( const QString & messageText,
+                                 const QString &subject,
                                  int notificationInterval,
                                  const AddrSpecList & addrSpecs,
                                  bool sendForSpam, const QString & domain,
@@ -171,6 +188,11 @@ QString KSieveUi::VacationUtils::composeScript( const QString & messageText,
     script += addressesArgument;
     if ( notificationInterval > 0 )
         script += QString::fromLatin1(":days %1 ").arg( notificationInterval );
+
+    if (!subject.trimmed().isEmpty()) {
+        script += QString::fromLatin1(":subject \"%1\" ").arg(stringReplace(subject).trimmed());
+    }
+
     script += QString::fromLatin1("text:\n");
     script += dotstuff( messageText.isEmpty() ? VacationUtils::defaultMessageText() : messageText );
     script += QString::fromLatin1( "\n.\n;\n" );
diff --git a/libksieve/ksieveui/vacation/vacationutils.h b/libksieve/ksieveui/vacation/vacationutils.h
index f4a6193..1e151ef 100644
--- a/libksieve/ksieveui/vacation/vacationutils.h
+++ b/libksieve/ksieveui/vacation/vacationutils.h
@@ -32,6 +32,7 @@ class QDate;
 namespace KSieveUi {
 namespace VacationUtils {
 QString defaultMessageText();
+QString defaultSubject();
 int defaultNotificationInterval();
 QStringList defaultMailAliases();
 bool defaultSendForSpam();
@@ -39,12 +40,13 @@ QString defaultDomainName();
 QDate defaultStartDate();
 QDate defaultEndDate();
 
-QString composeScript( const QString & messageText,
+QString composeScript( const QString & messageText, const QString &subject,
                        int notificationInterval,
                        const KMime::Types::AddrSpecList & aliases,
                        bool sendForSpam, const QString & excludeDomain,
                        const QDate & startDate, const QDate & endDate );
 bool parseScript( const QString & script, QString & messageText,
+                  QString &subject,
                   int & notificationInterval, QStringList & aliases,
                   bool & sendForSpam, QString & domainName,
                   QDate & startDate, QDate & endDate );


commit 2f9cf3fcd3cb55037a9ec610ca234009ac6f9bf1
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Mon Jan 12 19:53:31 2015 +0100

    autocompletion show same entry with different quotes
    
    When typing a name you can get multiple results, that only differ in the
    quoutes they have:
    John Doe <doe at example.com>
    "John Doe" <doe at example.com>
    "'John Doe'" <doe at example.com>
    
    these should be joined into one:
    John Doe <doe at example.com>
    
    KOLAB: 3138
    BUG: 336163

diff --git a/libkdepim/addressline/addresseelineedit.cpp b/libkdepim/addressline/addresseelineedit.cpp
index e83c0b0..1c2671e 100644
--- a/libkdepim/addressline/addresseelineedit.cpp
+++ b/libkdepim/addressline/addresseelineedit.cpp
@@ -247,6 +247,17 @@ public:
     void akonadiHandlePending();
     void doCompletion( bool ctrlT );
 
+    /* stips the name of an email address email
+     *
+     * 'a' <a at example.com> -> a <a at example.com>
+     * "a" <a at example.com> -> a <a at example.com>
+     * "\"'a'\"" <a at example.com> -> a <a at example.com>
+     *
+     * but "\"'a" <a at example.com> -> "\"'a" <a at example.com>
+     * cause the start and end is not the same.
+     */
+    QString stripEmail(const QString &email);
+
     void slotCompletion();
     void slotPopupCompletion( const QString & );
     void slotReturnPressed( const QString & );
@@ -375,12 +386,31 @@ QStringList AddresseeLineEdit::Private::cleanupBalooContact(const QStringList &l
     return hashEmail.keys();
 }
 
+QString AddresseeLineEdit::Private::stripEmail(const QString &email)
+{
+    QString displayName, addrSpec, comment;
+    if ( KPIMUtils::AddressOk == KPIMUtils::splitAddress( email, displayName, addrSpec, comment )) {
+        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;
+    }
+}
+
 void AddresseeLineEdit::Private::searchInBaloo()
 {
     Baloo::PIM::ContactCompleter com(m_searchString.trimmed(), 20);
     const QStringList listEmail = cleanupBalooContact(com.complete());
     Q_FOREACH (const QString& email, listEmail) {
-        addCompletionItem(email, 1, s_static->balooCompletionSource);
+        addCompletionItem(stripEmail(email), 1, s_static->balooCompletionSource);
     }
     doCompletion( m_lastSearchMode );
     //  if ( q->hasFocus() || q->completionBox()->hasFocus() ) {
@@ -1291,7 +1321,7 @@ void AddresseeLineEdit::addContact( const KABC::Addressee &addr, int weight, int
         const QString givenName = addr.givenName();
         const QString familyName= addr.familyName();
         const QString nickName  = addr.nickName();
-        QString fullEmail       = addr.fullEmail( email );
+        QString fullEmail       = d->stripEmail(addr.fullEmail( email ));
 
         QString appendix;
 
@@ -1312,7 +1342,7 @@ void AddresseeLineEdit::addContact( const KABC::Addressee &addr, int weight, int
 
         // Finally, we can add the completion items
         if (!fullName.isEmpty()) {
-            const QString address = KPIMUtils::normalizedAddress(fullName, email, QString());
+            const QString address = d->stripEmail(KPIMUtils::normalizedAddress(fullName, email, QString()));
             if (fullEmail != address) {
                 // This happens when fullEmail contains a middle name, while our own fullName+email only has "first last".
                 // Let's offer both, the fullEmail with 3 parts, looks a tad formal.




More information about the commits mailing list