Branch 'kolab/integration/4.13.0' - 4 commits - incidenceeditor-ng/tests libksieve/ksieveui pimcommon/util

Christian Mollekopf mollekopf at kolabsys.com
Fri Oct 10 12:42:41 CEST 2014


 incidenceeditor-ng/tests/CMakeLists.txt                 |    4 
 libksieve/ksieveui/util/util.cpp                        |    2 
 libksieve/ksieveui/vacation/multiimapvacationdialog.cpp |    1 
 libksieve/ksieveui/vacation/vacation.cpp                |   16 ++
 libksieve/ksieveui/vacation/vacationdialog.cpp          |   26 ++++
 libksieve/ksieveui/vacation/vacationdialog.h            |   11 +
 libksieve/ksieveui/vacation/vacationeditwidget.cpp      |   63 ++++++++++-
 libksieve/ksieveui/vacation/vacationeditwidget.h        |   13 ++
 libksieve/ksieveui/vacation/vacationpagewidget.cpp      |   18 ++-
 libksieve/ksieveui/vacation/vacationscriptextractor.h   |   91 +++++++++++++++-
 libksieve/ksieveui/vacation/vacationutils.cpp           |   38 +++++-
 libksieve/ksieveui/vacation/vacationutils.h             |   16 +-
 pimcommon/util/pimutil.h                                |    1 
 13 files changed, 281 insertions(+), 19 deletions(-)

New commits:
commit 9bb2db89c964878967d3acf15675f87fe86970ce
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Oct 10 12:42:29 2014 +0200

    IncidenceEditorNG: Fixed tests build.
    
    The library has been moved to libkdepim so we need to link against it.

diff --git a/incidenceeditor-ng/tests/CMakeLists.txt b/incidenceeditor-ng/tests/CMakeLists.txt
index edf9f35..e41871a 100644
--- a/incidenceeditor-ng/tests/CMakeLists.txt
+++ b/incidenceeditor-ng/tests/CMakeLists.txt
@@ -7,14 +7,14 @@ include_directories(
 MACRO(IE_UNIT_TESTS)
   FOREACH(_testname ${ARGN})
     kde4_add_unit_test(${_testname} NOGUI ${_testname}.cpp modeltest.cpp)
-    target_link_libraries(${_testname} ${QT_QTTEST_LIBRARY} ${QT_QTGUI_LIBRARY} ${KDE4_KDEUI_LIBS} ${KDEPIMLIBS_AKONADI_LIBS}  kdgantt2 ${KDEPIMLIBS_KCALUTILS_LIBS} ${KDEPIMLIBS_KCALCORE_LIBS} incidenceeditorsng kdepimdbusinterfaces)
+    target_link_libraries(${_testname} ${QT_QTTEST_LIBRARY} ${QT_QTGUI_LIBRARY} ${KDE4_KDEUI_LIBS} ${KDEPIMLIBS_AKONADI_LIBS}  kdgantt2 ${KDEPIMLIBS_KCALUTILS_LIBS} ${KDEPIMLIBS_KCALCORE_LIBS} incidenceeditorsng kdepim kdepimdbusinterfaces)
   ENDFOREACH(_testname)
 ENDMACRO(IE_UNIT_TESTS)
 
 MACRO(IE_EXECUTABLE_TESTS)
   FOREACH(_testname ${ARGN})
     kde4_add_executable(${_testname} NOGUI TEST ${_testname}.cpp modeltest.cpp)
-    target_link_libraries(${_testname} ${KDEPIMLIBS_KCALCORE_LIBS} ${QT_QTTEST_LIBRARY} ${QT_QTCORE_LIBRARY} ${KDE4_KDECORE_LIBS} incidenceeditorsng)
+    target_link_libraries(${_testname} ${KDEPIMLIBS_KCALCORE_LIBS} ${QT_QTTEST_LIBRARY} ${QT_QTCORE_LIBRARY} ${KDE4_KDECORE_LIBS} incidenceeditorsng kdepim)
   ENDFOREACH(_testname)
 ENDMACRO(IE_EXECUTABLE_TESTS)
 


commit 873834c0990c900919c7201c5dd4563b8fe53330
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Oct 2 17:47:04 2014 +0200

    Out of office replies: allow configuring dates when OOO should be active
    
    When Sieve server supports the "date" extension, users will be able to
    specify date range in which the out-of-office auto reply sieve script is
    supposed to be active.

diff --git a/libksieve/ksieveui/vacation/vacation.cpp b/libksieve/ksieveui/vacation/vacation.cpp
index 173ee0a..5dc81cc 100644
--- a/libksieve/ksieveui/vacation/vacation.cpp
+++ b/libksieve/ksieveui/vacation/vacation.cpp
@@ -102,6 +102,8 @@ void Vacation::slotGetResult( KManageSieve::SieveJob * job, bool success,
         return;
     }
 
+    const bool supportsDate = job->sieveCapabilities().contains(QLatin1String("date"));
+
     if ( !mDialog && !mCheckOnly )
         mDialog = new VacationDialog( i18n("Configure \"Out of Office\" Replies"), 0, false );
 
@@ -110,9 +112,11 @@ void Vacation::slotGetResult( KManageSieve::SieveJob * job, bool success,
     QStringList aliases = VacationUtils::defaultMailAliases();
     bool sendForSpam = VacationUtils::defaultSendForSpam();
     QString domainName = VacationUtils::defaultDomainName();
+    QDate startDate = VacationUtils::defaultStartDate();
+    QDate endDate = VacationUtils::defaultEndDate();
     if ( !success ) active = false; // default to inactive
 
-    if ( !mCheckOnly && ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, notificationInterval, aliases, sendForSpam, domainName ) ) )
+    if ( !mCheckOnly && ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, 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 "
@@ -129,6 +133,12 @@ void Vacation::slotGetResult( KManageSieve::SieveJob * job, bool success,
         mDialog->setDomainName( domainName );
         mDialog->enableDomainAndSendForSpam( !VacationSettings::allowOutOfOfficeUploadButNoSettings() );
 
+        if (supportsDate) {
+            mDialog->enableDates( supportsDate );
+            mDialog->setStartDate( startDate );
+            mDialog->setEndDate( endDate );
+        }
+
         connect( mDialog, SIGNAL(okClicked()), SLOT(slotDialogOk()) );
         connect( mDialog, SIGNAL(cancelClicked()), SLOT(slotDialogCancel()) );
         mDialog->show();
@@ -153,7 +163,9 @@ void Vacation::slotDialogOk() {
                                           mDialog->notificationInterval(),
                                           mDialog->mailAliases(),
                                           mDialog->sendForSpam(),
-                                          mDialog->domainName() );
+                                          mDialog->domainName(),
+                                          mDialog->startDate(),
+                                          mDialog->endDate() );
     const bool active = mDialog->activateVacation();
     emit scriptActive( active, mServerName);
 
diff --git a/libksieve/ksieveui/vacation/vacationdialog.cpp b/libksieve/ksieveui/vacation/vacationdialog.cpp
index 425a974..39c5a18 100644
--- a/libksieve/ksieveui/vacation/vacationdialog.cpp
+++ b/libksieve/ksieveui/vacation/vacationdialog.cpp
@@ -22,6 +22,7 @@
 #include <kmime/kmime_header_parsing.h>
 #include <kwindowsystem.h>
 #include <KSeparator>
+#include <KDateTime>
 
 #include <QApplication>
 #include <QVBoxLayout>
@@ -162,3 +163,28 @@ void VacationDialog::slotDialogDefaults()
 {
     mVacationEditWidget->setDefault();
 }
+
+void VacationDialog::enableDates(bool enable)
+{
+    mVacationEditWidget->enableDates(enable);
+}
+
+QDate VacationDialog::endDate() const
+{
+    return mVacationEditWidget->endDate();
+}
+
+void VacationDialog::setEndDate( const QDate &endDate )
+{
+    mVacationEditWidget->setEndDate( endDate );
+}
+
+QDate VacationDialog::startDate() const
+{
+    return mVacationEditWidget->startDate();
+}
+
+void VacationDialog::setStartDate( const QDate &startDate )
+{
+    mVacationEditWidget->setStartDate( startDate );
+}
diff --git a/libksieve/ksieveui/vacation/vacationdialog.h b/libksieve/ksieveui/vacation/vacationdialog.h
index b0ad838..d43d0aa 100644
--- a/libksieve/ksieveui/vacation/vacationdialog.h
+++ b/libksieve/ksieveui/vacation/vacationdialog.h
@@ -18,6 +18,8 @@
 
 template <typename T> class QList;
 
+class KDateTime;
+
 namespace KMime {
 namespace Types {
 struct AddrSpec;
@@ -60,6 +62,15 @@ public:
     bool sendForSpam() const;
     void setSendForSpam( bool enable );
 
+    void enableDates( bool enable = true );
+
+    QDate startDate() const;
+    void setStartDate( const QDate &startDate );
+
+    QDate endDate() const;
+    void setEndDate( const QDate &endDate );
+
+
 private slots:
     void slotDialogDefaults();
 
diff --git a/libksieve/ksieveui/vacation/vacationeditwidget.cpp b/libksieve/ksieveui/vacation/vacationeditwidget.cpp
index a537f54..ede991f 100644
--- a/libksieve/ksieveui/vacation/vacationeditwidget.cpp
+++ b/libksieve/ksieveui/vacation/vacationeditwidget.cpp
@@ -21,6 +21,9 @@
 #include <KLocalizedString>
 #include <KIntSpinBox>
 #include <KLineEdit>
+#include <KDateTime>
+
+#include <KDebug>
 
 #include <pimcommon/texteditor/richtexteditor/richtexteditorwidget.h>
 
@@ -30,6 +33,7 @@
 #include <QCheckBox>
 #include <QGridLayout>
 #include <QLabel>
+#include <KDateComboBox>
 #include <kdialog.h>
 
 using KMime::Types::AddrSpecList;
@@ -68,6 +72,28 @@ VacationEditWidget::VacationEditWidget(QWidget *parent)
     mTextEdit->setAcceptRichText( false );
     glay->addWidget( mTextEdit, row, 0, 1, 2 );
 
+    // From date
+    ++row;
+    mStartDate = new KDateComboBox( this );
+    mStartDate->setObjectName( QLatin1String( "mStartDate" ) );
+    mStartDate->setOptions( KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::DateKeywords | KDateComboBox::WarnOnInvalid );
+    mStartDate->setEnabled( false ); // Disable by default - we need an extension to support this
+    QLabel *label = new QLabel( i18n("&Start:"), this );
+    label->setBuddy( mStartDate );
+    glay->addWidget( label, row, 0 );
+    glay->addWidget( mStartDate, row, 1 );
+
+    // End date
+    ++row;
+    mEndDate = new KDateComboBox( this );
+    mEndDate->setObjectName( QLatin1String( "mEndDate" ) );
+    mEndDate->setOptions( KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::DateKeywords | KDateComboBox::WarnOnInvalid );
+    mEndDate->setEnabled( false ); // Disable by default - we need an extension to support this
+    label = new QLabel( i18n("&End:"), this );
+    label->setBuddy( mEndDate );
+    glay->addWidget( label, row, 0 );
+    glay->addWidget( mEndDate, row, 1 );
+
     // "Resent only after" spinbox and label:
     ++row;
     int defDayInterval = 7; //default day interval
@@ -75,7 +101,7 @@ VacationEditWidget::VacationEditWidget(QWidget *parent)
     mIntervalSpin->setObjectName( QLatin1String("mIntervalSpin") );
     mIntervalSpin->setSuffix( i18np(" day", " days", defDayInterval) );
     connect(mIntervalSpin, SIGNAL(valueChanged(int)), SLOT(slotIntervalSpinChanged(int)) );
-    QLabel *label = new QLabel( i18n("&Resend notification only after:"), this );
+    label = new QLabel( i18n("&Resend notification only after:"), this );
     label->setBuddy( mIntervalSpin );
     glay->addWidget( label, row, 0 );
     glay->addWidget( mIntervalSpin, row, 1 );
@@ -219,6 +245,41 @@ void VacationEditWidget::setSendForSpam( bool enable )
     mSpamCheck->setChecked( !enable );
 }
 
+QDate VacationEditWidget::endDate()
+{
+    if ( mEndDate->isEnabled() ) {
+        return mEndDate->date();
+    } else {
+        return QDate();
+    }
+}
+
+void VacationEditWidget::setEndDate( const QDate &endDate )
+{
+    mEndDate->setDate( endDate );
+}
+
+QDate VacationEditWidget::startDate() const
+{
+    if ( mStartDate->isEnabled() ) {
+        return mStartDate->date();
+    } else {
+        return QDate();
+    }
+}
+
+void VacationEditWidget::setStartDate( const QDate &startDate )
+{
+    mStartDate->setDate( startDate );
+}
+
+
+void VacationEditWidget::enableDates( bool enable )
+{
+    mStartDate->setEnabled( enable );
+    mEndDate->setEnabled( enable );
+}
+
 void VacationEditWidget::enableDomainAndSendForSpam( bool enable )
 {
     mDomainCheck->setEnabled( enable );
diff --git a/libksieve/ksieveui/vacation/vacationeditwidget.h b/libksieve/ksieveui/vacation/vacationeditwidget.h
index b2c4421..e476eb1 100644
--- a/libksieve/ksieveui/vacation/vacationeditwidget.h
+++ b/libksieve/ksieveui/vacation/vacationeditwidget.h
@@ -21,6 +21,9 @@
 #include <QWidget>
 class KIntSpinBox;
 class KLineEdit;
+class KDateComboBox;
+
+class QDate;
 
 namespace PimCommon {
 class RichTextEditorWidget;
@@ -44,6 +47,8 @@ public:
     explicit VacationEditWidget(QWidget *parent=0);
     ~VacationEditWidget();
 
+    void enableDates( bool enable = true );
+
     void enableDomainAndSendForSpam( bool enable = true );
 
     bool activateVacation() const;
@@ -68,6 +73,12 @@ public:
     bool sendForSpam() const;
     void setSendForSpam( bool enable );
 
+    QDate startDate() const;
+    void setStartDate( const QDate &startDate );
+
+    QDate endDate();
+    void setEndDate( const QDate &endDate );
+
     void setDefault();
 
 private Q_SLOTS:
@@ -81,6 +92,8 @@ protected:
     QCheckBox *mSpamCheck;
     QCheckBox *mDomainCheck;
     KLineEdit *mDomainEdit;
+    KDateComboBox *mStartDate;
+    KDateComboBox *mEndDate;
 };
 }
 
diff --git a/libksieve/ksieveui/vacation/vacationpagewidget.cpp b/libksieve/ksieveui/vacation/vacationpagewidget.cpp
index 56834e0..96bd86e 100644
--- a/libksieve/ksieveui/vacation/vacationpagewidget.cpp
+++ b/libksieve/ksieveui/vacation/vacationpagewidget.cpp
@@ -111,16 +111,22 @@ void VacationPageWidget::slotGetResult( KManageSieve::SieveJob * job, bool succe
         mStackWidget->setCurrentIndex(ScriptNotSupported);
         return;
     }
+
+    // Whether the server supports the "date" extension
+    const bool supportsSieveDate = mUrl.protocol() == QLatin1String("sieve") && job->sieveCapabilities().contains(QLatin1String("date"));
+
     mVacationEditWidget->setEnabled(true);
     QString messageText = VacationUtils::defaultMessageText();
     int notificationInterval = VacationUtils::defaultNotificationInterval();
     QStringList aliases = VacationUtils::defaultMailAliases();
     bool sendForSpam = VacationUtils::defaultSendForSpam();
     QString domainName = VacationUtils::defaultDomainName();
+    QDate startDate = VacationUtils::defaultStartDate();
+    QDate endDate = VacationUtils::defaultEndDate();
     if ( !success )
         active = false; // default to inactive
 
-    if ( ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, notificationInterval, aliases, sendForSpam, domainName ) ) )
+    if ( ( !success || !KSieveUi::VacationUtils::parseScript( script, messageText, notificationInterval, aliases, sendForSpam, domainName, startDate, endDate ) ) )
         mVacationWarningWidget->setVisible(true);
 
     mWasActive = active;
@@ -132,6 +138,12 @@ void VacationPageWidget::slotGetResult( KManageSieve::SieveJob * job, bool succe
     mVacationEditWidget->setDomainName( domainName );
     mVacationEditWidget->enableDomainAndSendForSpam( !VacationSettings::allowOutOfOfficeUploadButNoSettings() );
 
+    mVacationEditWidget->enableDates( supportsSieveDate );
+    if ( supportsSieveDate ) {
+        mVacationEditWidget->setStartDate( startDate );
+        mVacationEditWidget->setEndDate( endDate );
+    }
+
     //emit scriptActive( mWasActive, mServerName );
 }
 
@@ -145,7 +157,9 @@ KSieveUi::VacationCreateScriptJob *VacationPageWidget::writeScript()
                                                              mVacationEditWidget->notificationInterval(),
                                                              mVacationEditWidget->mailAliases(),
                                                              mVacationEditWidget->sendForSpam(),
-                                                             mVacationEditWidget->domainName() );
+                                                             mVacationEditWidget->domainName(),
+                                                             mVacationEditWidget->startDate(),
+                                                             mVacationEditWidget->endDate() );
         const bool active = mVacationEditWidget->activateVacation();
         createJob->setStatus(active, mWasActive);
         //Q_EMIT scriptActive( active, mServerName);
diff --git a/libksieve/ksieveui/vacation/vacationscriptextractor.h b/libksieve/ksieveui/vacation/vacationscriptextractor.h
index d5ee490..72f8977 100644
--- a/libksieve/ksieveui/vacation/vacationscriptextractor.h
+++ b/libksieve/ksieveui/vacation/vacationscriptextractor.h
@@ -62,6 +62,18 @@ public:
         mBuilders[2] = sb3;
         assert( sb1 ); assert( sb2 ); assert( sb3 );
     }
+    MultiScriptBuilder( KSieve::ScriptBuilder * sb1,
+                        KSieve::ScriptBuilder * sb2,
+                        KSieve::ScriptBuilder * sb3,
+                        KSieve::ScriptBuilder * sb4 )
+        : KSieve::ScriptBuilder(), mBuilders( 4 )
+    {
+        mBuilders[0] = sb1;
+        mBuilders[1] = sb2;
+        mBuilders[2] = sb3;
+        mBuilders[3] = sb4;
+        assert( sb1 ); assert( sb2 ); assert( sb3 ); assert( sb4 );
+    }
     ~MultiScriptBuilder() {}
 private:
 #ifdef FOREACH
@@ -138,10 +150,11 @@ public:
     const std::map<QString,QString> & results() const { return mResults; }
 
 private:
-    void process( BuilderMethod method, const QString & string=QString() ) {
+    virtual void process( BuilderMethod method, const QString & string=QString() ) {
         doProcess( method, string );
         mRecursionGuard.clear();
     }
+
     void doProcess( BuilderMethod method, const QString & string ) {
         mRecursionGuard.insert( mState );
         bool found = true;
@@ -159,8 +172,10 @@ private:
         mState = found ? expected.if_found : expected.if_not_found ;
         assert( mState < mNodes.size() );
         if ( found )
-            if ( const char * save_tag = expected.save_tag )
+            if ( const char * save_tag = expected.save_tag ) {
+                kDebug() << "stored tag" << save_tag << ":" << string;
                 mResults[QString::fromLatin1(save_tag)] = string;
+            }
         if ( !found && !mRecursionGuard.count( mState ) ) {
             doProcess( method, string );
         }
@@ -294,6 +309,78 @@ public:
     }
 };
 
+// if not allof (currentdate :value "ge" date "YYYY-MM-DD",
+//               currentfate :value "le" date "YYYY-MM-DD) { keep; stop; }
+static const GenericInformationExtractor::StateNode datesNodes[] = {
+    { 0, GIE::CommandStart, "if", 1, 0, 0 },            // 0
+    { 0,   GIE::TestStart, "not", 2, 0, 0 },            // 1
+    { 0,     GIE::TestStart, "allof", 3, 0, 0 },        // 2
+
+    // handle startDate and endDate in arbitrary order
+    { 0,       GIE::TestListStart, 0, 4, 0, 0 },                 // 3
+    { 0,         GIE::TestStart, "currentdate", 5, 0, 0 },         // 4
+    { 0,           GIE::TaggedArgument, "value", 6, 0, 0 },          // 5
+    { 0,           GIE::StringArgument, "ge", 7, 9, 0 },             // 6
+    { 0,           GIE::StringArgument, "date", 8, 0, 0 },           // 7
+    { 0,           GIE::StringArgument, 0, 12, 0, "startDate" },      // 8
+    { 0,           GIE::StringArgument, "le", 10, 0, 0 },             // 9
+    { 0,           GIE::StringArgument, "date", 11, 0, 0 },          // 10
+    { 0,           GIE::StringArgument, 0, 12, 0, "endDate" },       // 11
+    { 0,         GIE::TestEnd, 0, 13, 0, 0 },                      // 12
+
+    { 0,         GIE::TestStart, "currentdate", 14, 0, 0 },        // 13
+    { 0,           GIE::TaggedArgument, "value", 15, 0, 0 },         // 14
+    { 0,           GIE::StringArgument, "le", 16, 18, 0 },           // 15
+    { 0,           GIE::StringArgument, "date", 17, 0, 0 },          // 16
+    { 0,           GIE::StringArgument, 0, 21, 0, "endDate" },       // 17
+    { 0,           GIE::StringArgument, "ge", 19, 0, 0 },            // 18
+    { 0,           GIE::StringArgument, "date", 20, 0, 0 },          // 19
+    { 0,           GIE::StringArgument, 0, 21, 0, "startDate" },     // 20
+    { 0,         GIE::TestEnd, 0, 22, 0, 0 },                      // 21
+    { 0,      GIE::TestListEnd, 0, 23, 0, 0 },                   // 22
+
+    { 0,     GIE::TestEnd, 0, 24, 0, 0 },               // 23
+    { 0,   GIE::TestEnd, 0, 25, 0, 0 },                 // 24
+
+    // block of commands, find "stop", take nested if's into account:
+    { 0,   GIE::BlockStart, 0, 26, 0, 0 },                 // 25
+    { 1,     GIE::CommandStart, "stop", 29, 28, "stop" },  // 26
+    { -1,    GIE::Any, 0, 26, 0, 0 },                      // 27
+    { 0,   GIE::BlockEnd, 0, 0, 27, 0 },                   // 28
+
+    { -1, GIE::Any, 0, 27, 27, 0 }                      // 29 end state
+};
+
+static const unsigned int numDatesNodes = sizeof datesNodes / sizeof *datesNodes;
+
+class DateExtractor : public GenericInformationExtractor {
+public:
+  DateExtractor()
+      : GenericInformationExtractor( std::vector<StateNode>( datesNodes, datesNodes+numDatesNodes ) )
+  {
+  }
+
+  QDate endDate()
+  {
+      return date( QLatin1String( "endDate" ) );
+  }
+
+  QDate startDate()
+  {
+      return date( QLatin1String( "startDate" ) );
+  }
+
+private:
+  QDate date(const QString &name ) {
+      if (mResults.count( name ) == 0) {
+          return QDate();
+      } else {
+          return QDate::fromString( mResults[name], Qt::ISODate );
+      }
+  }
+};
+
+
 class VacationDataExtractor : public KSieve::ScriptBuilder {
     enum Context {
         None = 0,
diff --git a/libksieve/ksieveui/vacation/vacationutils.cpp b/libksieve/ksieveui/vacation/vacationutils.cpp
index 15a5c96..21dfcf0 100644
--- a/libksieve/ksieveui/vacation/vacationutils.cpp
+++ b/libksieve/ksieveui/vacation/vacationutils.cpp
@@ -75,9 +75,22 @@ QString KSieveUi::VacationUtils::defaultDomainName() {
     return VacationSettings::outOfOfficeDomain();
 }
 
+QDate KSieveUi::VacationUtils::defaultStartDate()
+{
+    return QDate::currentDate();
+}
+
+
+QDate KSieveUi::VacationUtils::defaultEndDate()
+{
+    return defaultStartDate().addDays(7);
+}
+
+
 bool KSieveUi::VacationUtils::parseScript( const QString &script, QString &messageText,
                             int & notificationInterval, QStringList &aliases,
-                            bool & sendForSpam, QString &domainName )
+                            bool & sendForSpam, QString &domainName,
+                            QDate & startDate, QDate & endDate )
 {
     if ( script.trimmed().isEmpty() ) {
         messageText = VacationUtils::defaultMessageText();
@@ -98,7 +111,8 @@ bool KSieveUi::VacationUtils::parseScript( const QString &script, QString &messa
     VacationDataExtractor vdx;
     SpamDataExtractor sdx;
     DomainRestrictionDataExtractor drdx;
-    KSieveExt::MultiScriptBuilder tsb( &vdx, &sdx, &drdx );
+    DateExtractor dx;
+    KSieveExt::MultiScriptBuilder tsb( &vdx, &sdx, &drdx, &dx );
     parser.setScriptBuilder( &tsb );
     if ( !parser.parse() )
         return false;
@@ -109,13 +123,16 @@ bool KSieveUi::VacationUtils::parseScript( const QString &script, QString &messa
         sendForSpam = !sdx.found();
         domainName = drdx.domainName();
     }
+    startDate = dx.startDate();
+    endDate = dx.endDate();
     return true;
 }
 
 QString KSieveUi::VacationUtils::composeScript( const QString & messageText,
                                  int notificationInterval,
                                  const AddrSpecList & addrSpecs,
-                                 bool sendForSpam, const QString & domain )
+                                 bool sendForSpam, const QString & domain,
+                                 const QDate & startDate, const QDate & endDate )
 {
     QString addressesArgument;
     QStringList aliases;
@@ -129,7 +146,13 @@ QString KSieveUi::VacationUtils::composeScript( const QString & messageText,
         }
         addressesArgument += sl.join( QLatin1String(", ") ) + QLatin1String(" ] ");
     }
-    QString script = QString::fromLatin1("require \"vacation\";\n\n" );
+    QString script;
+
+    if ( startDate.isValid() && endDate.isValid() ) {
+        script = QString::fromLatin1("require [\"vacation\", \"relational\", \"date\"];\n\n" );
+    } else {
+        script = QString::fromLatin1("require \"vacation\";\n\n" );
+    }
     if ( !sendForSpam )
         script += QString::fromLatin1( "if header :contains \"X-Spam-Flag\" \"YES\""
                                        " { keep; stop; }\n" ); // FIXME?
@@ -137,6 +160,13 @@ QString KSieveUi::VacationUtils::composeScript( const QString & messageText,
     if ( !domain.isEmpty() ) // FIXME
         script += QString::fromLatin1( "if not address :domain :contains \"from\" \"%1\" { keep; stop; }\n" ).arg( domain );
 
+    if ( startDate.isValid() && endDate.isValid() ) {
+        script += QString::fromLatin1( "if not allof(currentdate :value \"ge\" \"date\" \"%1\","
+                                       " currentdate :value \"le\" \"date\" \"%2\")"
+                                       " { keep; stop; }\n" ).arg( startDate.toString(Qt::ISODate),
+                                                                   endDate.toString(Qt::ISODate) );
+    }
+
     script += QLatin1String("vacation ");
     script += addressesArgument;
     if ( notificationInterval > 0 )
diff --git a/libksieve/ksieveui/vacation/vacationutils.h b/libksieve/ksieveui/vacation/vacationutils.h
index 8e1360a..f4a6193 100644
--- a/libksieve/ksieveui/vacation/vacationutils.h
+++ b/libksieve/ksieveui/vacation/vacationutils.h
@@ -27,6 +27,8 @@ typedef QList<AddrSpec> AddrSpecList;
 }
 }
 
+class QDate;
+
 namespace KSieveUi {
 namespace VacationUtils {
 QString defaultMessageText();
@@ -34,14 +36,18 @@ int defaultNotificationInterval();
 QStringList defaultMailAliases();
 bool defaultSendForSpam();
 QString defaultDomainName();
+QDate defaultStartDate();
+QDate defaultEndDate();
 
 QString composeScript( const QString & messageText,
-                              int notificationInterval,
-                              const KMime::Types::AddrSpecList & aliases,
-                              bool sendForSpam, const QString & excludeDomain );
+                       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,
-                         int & notificationInterval, QStringList & aliases,
-                         bool & sendForSpam, QString & domainName );
+                  int & notificationInterval, QStringList & aliases,
+                  bool & sendForSpam, QString & domainName,
+                  QDate & startDate, QDate & endDate );
 
 }
 }


commit b41de4b7120b79a02f1200a9c83cc12c1f64fdf8
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Oct 2 16:39:42 2014 +0200

    Enable word-wrap in the "no-IMAP resource available" error message in Sieve

diff --git a/libksieve/ksieveui/vacation/multiimapvacationdialog.cpp b/libksieve/ksieveui/vacation/multiimapvacationdialog.cpp
index 81ec5d0..7afe53e 100644
--- a/libksieve/ksieveui/vacation/multiimapvacationdialog.cpp
+++ b/libksieve/ksieveui/vacation/multiimapvacationdialog.cpp
@@ -53,6 +53,7 @@ MultiImapVacationDialog::MultiImapVacationDialog(QWidget *parent)
                                   "IMAP server for this. "
                                   "You can do this on the \"Filtering\" tab of the IMAP "
                                   "account configuration."));
+    lab->setWordWrap(true);
     vbox->addWidget(lab);
     vbox->addStretch();
     mStackedWidget->addWidget(w);


commit da9086a0a253a932f44ba82b4c0685c2b1f4fa34
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Oct 2 16:39:05 2014 +0200

    KSieveUI: Don't disable Sieve when only Kolab resource is available
    
    The code was checking for presence of at least one akonadi_imap_resource,
    which fails of course when there's only akonadi_kolab_resource available

diff --git a/libksieve/ksieveui/util/util.cpp b/libksieve/ksieveui/util/util.cpp
index 542f586..30c620f 100644
--- a/libksieve/ksieveui/util/util.cpp
+++ b/libksieve/ksieveui/util/util.cpp
@@ -150,7 +150,7 @@ Akonadi::AgentInstance::List KSieveUi::Util::imapAgentInstances()
              instance.type().capabilities().contains( QLatin1String("Resource") ) &&
              !instance.type().capabilities().contains( QLatin1String("Virtual") ) ) {
 
-            if ( instance.identifier().contains( IMAP_RESOURCE_IDENTIFIER ) )
+            if ( instance.identifier().contains( IMAP_RESOURCE_IDENTIFIER ) || instance.identifier().contains( KOLAB_RESOURCE_IDENTIFIER ) )
                 relevantInstances << instance;
         }
     }
diff --git a/pimcommon/util/pimutil.h b/pimcommon/util/pimutil.h
index 21b33ec..90fa305 100644
--- a/pimcommon/util/pimutil.h
+++ b/pimcommon/util/pimutil.h
@@ -45,6 +45,7 @@ class OrgKdeAkonadiImapSettingsInterface;
 class QWidget;
 
 #define IMAP_RESOURCE_IDENTIFIER QLatin1String("akonadi_imap_resource")
+#define KOLAB_RESOURCE_IDENTIFIER QLatin1String("akonadi_kolab_resource")
 
 namespace PimCommon {
 




More information about the commits mailing list