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