diff --git a/agents/sendlateragent/CMakeLists.txt b/agents/sendlateragent/CMakeLists.txt --- a/agents/sendlateragent/CMakeLists.txt +++ b/agents/sendlateragent/CMakeLists.txt @@ -18,42 +18,49 @@ sendlaterconfigurewidget.cpp ) -set(sendlateragent_SRCS +set(libsendlateragent_SRCS ${sendlateragentconfig_SRCS} ${sendlater_common_SRCS} - sendlateragent.cpp sendlatermanager.cpp sendlaterjob.cpp sendlaterremovemessagejob.cpp + sendlaterutil.cpp ) +set(sendlateragent_SRCS + sendlateragent.cpp + ) qt5_add_dbus_adaptor(sendlateragent_SRCS org.freedesktop.Akonadi.SendLaterAgent.xml sendlateragent.h SendLaterAgent) -ki18n_wrap_ui(sendlateragent_SRCS ui/sendlaterconfigurewidget.ui) - -add_executable(akonadi_sendlater_agent ${sendlateragent_SRCS}) -target_link_libraries(akonadi_sendlater_agent - KF5::SendLater +ki18n_wrap_ui(libsendlateragent_SRCS ui/sendlaterconfigurewidget.ui) +kconfig_add_kcfg_files(libsendlateragent_SRCS sendlateragentsettings.kcfgc) +add_library(sendlateragent STATIC ${libsendlateragent_SRCS}) +target_link_libraries(sendlateragent KF5::AkonadiCore KF5::AkonadiMime KF5::MailTransportAkonadi KF5::Mime KF5::MessageComposer KF5::MessageCore KF5::PimCommon - KF5::AkonadiAgentBase KF5::DBusAddons KF5::WindowSystem KF5::XmlGui KF5::Notifications KF5::I18n ) + +add_executable(akonadi_sendlater_agent ${sendlateragent_SRCS}) +target_link_libraries(akonadi_sendlater_agent + sendlateragent + KF5::AkonadiAgentBase + ) + if( APPLE ) set_target_properties(akonadi_sendlater_agent PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${kmail_SOURCE_DIR}/agents/Info.plist.template) - set_target_properties(akonadi_sendlater_agent PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "org.kde.Akonadi.KF5::SendLater") set_target_properties(akonadi_sendlater_agent PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "KDE Akonadi Send Later") endif () diff --git a/agents/sendlateragent/autotests/CMakeLists.txt b/agents/sendlateragent/autotests/CMakeLists.txt --- a/agents/sendlateragent/autotests/CMakeLists.txt +++ b/agents/sendlateragent/autotests/CMakeLists.txt @@ -1,16 +1,13 @@ # Convenience macro to add unit tests. macro(add_sendlater_agent_test _source ) - set(_test ${_source} ../sendlaterconfiguredialog.cpp ../sendlaterconfigurewidget.cpp) - ki18n_wrap_ui(_test ../ui/sendlaterconfigurewidget.ui) get_filename_component(_name ${_source} NAME_WE) - ecm_add_test(${_test} + ecm_add_test(${_source} TEST_NAME ${_name} NAME_PREFIX "sendlateragent-" - LINK_LIBRARIES Qt5::Test KF5::XmlGui KF5::AkonadiCore KF5::SendLater KF5::PimCommon KF5::I18n + LINK_LIBRARIES sendlateragent Qt5::Test ) endmacro() -add_sendlater_agent_test(sendlaterinfotest.cpp) +add_sendlater_agent_test(sendlaterutiltest.cpp) add_sendlater_agent_test(sendlaterconfiguredialogtest.cpp) add_sendlater_agent_test(sendlaterconfigtest.cpp) -add_sendlater_agent_test(sendlaterdialogtest.cpp) diff --git a/agents/sendlateragent/autotests/sendlaterconfigtest.cpp b/agents/sendlateragent/autotests/sendlaterconfigtest.cpp --- a/agents/sendlateragent/autotests/sendlaterconfigtest.cpp +++ b/agents/sendlateragent/autotests/sendlaterconfigtest.cpp @@ -18,18 +18,18 @@ */ #include "sendlaterconfigtest.h" -#include "sendlaterinfo.h" #include "sendlaterutil.h" + +#include + #include SendLaterConfigTest::SendLaterConfigTest(QObject *parent) : QObject(parent) { } -SendLaterConfigTest::~SendLaterConfigTest() -{ -} +SendLaterConfigTest::~SendLaterConfigTest() = default; void SendLaterConfigTest::init() { @@ -62,14 +62,14 @@ void SendLaterConfigTest::shouldAddAnItem() { - SendLater::SendLaterInfo info; + MessageComposer::SendLaterInfo info; const QString to = QStringLiteral("kde.org"); info.setTo(to); info.setItemId(Akonadi::Item::Id(42)); info.setSubject(QStringLiteral("Subject")); info.setRecurrence(true); info.setRecurrenceEachValue(5); - info.setRecurrenceUnit(SendLater::SendLaterInfo::Years); + info.setRecurrenceUnit(MessageComposer::SendLaterInfo::Years); const QDate date(2014, 1, 1); #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) info.setDateTime(QDateTime(date)); @@ -79,17 +79,17 @@ info.setLastDateTimeSend(QDateTime(date.startOfDay())); #endif - SendLater::SendLaterUtil::writeSendLaterInfo(mConfig, &info, false); + SendLaterUtil::writeSendLaterInfo(mConfig, &info); const QStringList itemList = mConfig->groupList().filter(mSendlaterRegExpFilter); QCOMPARE(itemList.isEmpty(), false); QCOMPARE(itemList.count(), 1); } void SendLaterConfigTest::shouldNotAddInvalidItem() { - SendLater::SendLaterInfo info; - SendLater::SendLaterUtil::writeSendLaterInfo(mConfig, &info, false); + MessageComposer::SendLaterInfo info; + SendLaterUtil::writeSendLaterInfo(mConfig, &info); const QStringList itemList = mConfig->groupList().filter(mSendlaterRegExpFilter); QCOMPARE(itemList.isEmpty(), true); diff --git a/agents/sendlateragent/autotests/sendlaterdialogtest.cpp b/agents/sendlateragent/autotests/sendlaterdialogtest.cpp deleted file mode 100644 --- a/agents/sendlateragent/autotests/sendlaterdialogtest.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - Copyright (C) 2015-2020 Laurent Montel - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "sendlaterdialogtest.h" -#include "sendlaterdialog.h" -#include -#include -#include -#include -#include -#include -SendLaterDialogTest::SendLaterDialogTest(QObject *parent) - : QObject(parent) -{ -} - -SendLaterDialogTest::~SendLaterDialogTest() -{ -} - -void SendLaterDialogTest::initTestCase() -{ - QStandardPaths::setTestModeEnabled(true); -} - -void SendLaterDialogTest::shouldHaveDefaultValue() -{ - SendLater::SendLaterDialog dlg(nullptr); - KTimeComboBox *timeCombo = dlg.findChild(QStringLiteral("time_sendlater")); - QVERIFY(timeCombo); - KDateComboBox *dateCombo = dlg.findChild(QStringLiteral("date_sendlater")); - QVERIFY(dateCombo); - QVERIFY(dateCombo->date().isValid()); - QPushButton *okButton = dlg.findChild(QStringLiteral("okbutton")); - QVERIFY(okButton); - QVERIFY(okButton->isEnabled()); - dateCombo->lineEdit()->clear(); - QVERIFY(!dateCombo->date().isValid()); - QVERIFY(!okButton->isEnabled()); -} - -QTEST_MAIN(SendLaterDialogTest) diff --git a/agents/sendlateragent/autotests/sendlaterinfotest.cpp b/agents/sendlateragent/autotests/sendlaterinfotest.cpp deleted file mode 100644 --- a/agents/sendlateragent/autotests/sendlaterinfotest.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - Copyright (C) 2014-2020 Laurent Montel - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "sendlaterinfotest.h" -#include "sendlaterinfo.h" -#include -#include -#include -#include -#include - -SendLaterInfoTest::SendLaterInfoTest(QObject *parent) - : QObject(parent) -{ - QStandardPaths::setTestModeEnabled(true); -} - -void SendLaterInfoTest::shouldHaveDefaultValue() -{ - SendLater::SendLaterInfo info; - QCOMPARE(info.itemId(), Akonadi::Item::Id(-1)); - QCOMPARE(info.isRecurrence(), false); - QVERIFY(!info.dateTime().isValid()); - QVERIFY(!info.lastDateTimeSend().isValid()); - QCOMPARE(info.to(), QString()); - QCOMPARE(info.subject(), QString()); - QVERIFY(!info.isValid()); - QCOMPARE(info.recurrenceUnit(), SendLater::SendLaterInfo::Days); - QCOMPARE(info.recurrenceEachValue(), 1); -} - -void SendLaterInfoTest::shouldRestoreFromSettings() -{ - SendLater::SendLaterInfo info; - const QString to = QStringLiteral("kde.org"); - info.setTo(to); - info.setItemId(Akonadi::Item::Id(42)); - info.setSubject(QStringLiteral("Subject")); - info.setRecurrence(true); - info.setRecurrenceEachValue(5); - info.setRecurrenceUnit(SendLater::SendLaterInfo::Years); - const QDate date(2014, 1, 1); -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) - info.setDateTime(QDateTime(date)); - info.setLastDateTimeSend(QDateTime(date)); -#else - info.setDateTime(QDateTime(date.startOfDay())); - info.setLastDateTimeSend(QDateTime(date.startOfDay())); -#endif - KConfigGroup grp(KSharedConfig::openConfig(), "testsettings"); - info.writeConfig(grp); - - SendLater::SendLaterInfo restoreInfo(grp); - QCOMPARE(info, restoreInfo); -} - -void SendLaterInfoTest::shouldNotValidIfIdIsNotValid() -{ - SendLater::SendLaterInfo info; - const QString to = QStringLiteral("kde.org"); - info.setTo(to); - info.setSubject(QStringLiteral("Subject")); - info.setRecurrence(true); - info.setRecurrenceEachValue(5); - info.setRecurrenceUnit(SendLater::SendLaterInfo::Years); - const QDate date(2014, 1, 1); -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) - info.setDateTime(QDateTime(date)); - info.setLastDateTimeSend(QDateTime(date)); -#else - info.setDateTime(QDateTime(date.startOfDay())); - info.setLastDateTimeSend(QDateTime(date.startOfDay())); -#endif - QVERIFY(!info.isValid()); -} - -void SendLaterInfoTest::shouldNotValidIfDateIsNotValid() -{ - SendLater::SendLaterInfo info; - const QString to = QStringLiteral("kde.org"); - info.setTo(to); - info.setItemId(Akonadi::Item::Id(42)); - info.setSubject(QStringLiteral("Subject")); - info.setRecurrence(true); - info.setRecurrenceEachValue(5); - info.setRecurrenceUnit(SendLater::SendLaterInfo::Years); - const QDate date(2014, 1, 1); -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) - info.setLastDateTimeSend(QDateTime(date)); -#else - info.setLastDateTimeSend(QDateTime(date.startOfDay())); -#endif - QVERIFY(!info.isValid()); -} - -void SendLaterInfoTest::shouldCopyInfo() -{ - SendLater::SendLaterInfo info; - const QString to = QStringLiteral("kde.org"); - info.setTo(to); - info.setItemId(Akonadi::Item::Id(42)); - info.setSubject(QStringLiteral("Subject")); - info.setRecurrence(true); - info.setRecurrenceEachValue(5); - info.setRecurrenceUnit(SendLater::SendLaterInfo::Years); - const QDate date(2014, 1, 1); -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) - info.setDateTime(QDateTime(date)); - info.setLastDateTimeSend(QDateTime(date)); -#else - info.setDateTime(QDateTime(date.startOfDay())); - info.setLastDateTimeSend(QDateTime(date.startOfDay())); -#endif - SendLater::SendLaterInfo copyInfo(info); - QCOMPARE(info, copyInfo); -} - -QTEST_MAIN(SendLaterInfoTest) diff --git a/agents/sendlateragent/autotests/sendlaterinfotest.h b/agents/sendlateragent/autotests/sendlaterutiltest.h rename from agents/sendlateragent/autotests/sendlaterinfotest.h rename to agents/sendlateragent/autotests/sendlaterutiltest.h --- a/agents/sendlateragent/autotests/sendlaterinfotest.h +++ b/agents/sendlateragent/autotests/sendlaterutiltest.h @@ -17,23 +17,19 @@ Boston, MA 02110-1301, USA. */ -#ifndef SENDLATERINFOTEST_H -#define SENDLATERINFOTEST_H +#ifndef SENDLATERUTILTEST_H +#define SENDLATERUTILTEST_H #include -class SendLaterInfoTest : public QObject +class SendLaterUtilTest : public QObject { Q_OBJECT public: - explicit SendLaterInfoTest(QObject *parent = nullptr); + explicit SendLaterUtilTest(QObject *parent = nullptr); private Q_SLOTS: - void shouldHaveDefaultValue(); void shouldRestoreFromSettings(); - void shouldNotValidIfIdIsNotValid(); - void shouldNotValidIfDateIsNotValid(); - void shouldCopyInfo(); }; -#endif // SENDLATERINFOTEST_H +#endif // SENDLATERUTILTEST_H diff --git a/agents/sendlateragent/autotests/sendlaterutiltest.cpp b/agents/sendlateragent/autotests/sendlaterutiltest.cpp new file mode 100644 --- /dev/null +++ b/agents/sendlateragent/autotests/sendlaterutiltest.cpp @@ -0,0 +1,62 @@ +/* + Copyright (C) 2014-2020 Laurent Montel + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "sendlaterutiltest.h" +#include "sendlaterutil.h" + +#include + +#include +#include +#include +#include +#include +#include + +SendLaterUtilTest::SendLaterUtilTest(QObject *parent) + : QObject(parent) +{ + QStandardPaths::setTestModeEnabled(true); +} +void SendLaterUtilTest::shouldRestoreFromSettings() +{ + MessageComposer::SendLaterInfo info; + const QString to = QStringLiteral("kde.org"); + info.setTo(to); + info.setItemId(Akonadi::Item::Id(42)); + info.setSubject(QStringLiteral("Subject")); + info.setRecurrence(true); + info.setRecurrenceEachValue(5); + info.setRecurrenceUnit(MessageComposer::SendLaterInfo::Years); + const QDate date(2014, 1, 1); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + info.setDateTime(QDateTime(date)); + info.setLastDateTimeSend(QDateTime(date)); +#else + info.setDateTime(QDateTime(date.startOfDay())); + info.setLastDateTimeSend(QDateTime(date.startOfDay())); +#endif + SendLaterUtil::writeSendLaterInfo(KSharedConfig::openConfig(), &info); + + KConfigGroup grp(KSharedConfig::openConfig(), SendLaterUtil::sendLaterPattern().arg(42)); + std::unique_ptr restoreInfo{SendLaterUtil::readSendLaterInfo(grp)}; + QCOMPARE(info, *restoreInfo); +} + +QTEST_MAIN(SendLaterUtilTest) diff --git a/agents/sendlateragent/org.freedesktop.Akonadi.SendLaterAgent.xml b/agents/sendlateragent/org.freedesktop.Akonadi.SendLaterAgent.xml --- a/agents/sendlateragent/org.freedesktop.Akonadi.SendLaterAgent.xml +++ b/agents/sendlateragent/org.freedesktop.Akonadi.SendLaterAgent.xml @@ -14,5 +14,15 @@ + + + + + + + + + + diff --git a/agents/sendlateragent/sendlateragent.h b/agents/sendlateragent/sendlateragent.h --- a/agents/sendlateragent/sendlateragent.h +++ b/agents/sendlateragent/sendlateragent.h @@ -21,7 +21,10 @@ #define SENDLATERAGENT_H #include + #include "sendlaterdialog.h" +#include +#include class SendLaterManager; @@ -44,6 +47,8 @@ void reload(); void configure(WId windowId) override; void removeItem(qint64 item); + void addItem(qint64 timestamp, bool recurrence, int recurrenceValue, int recurrenceUnit, + Akonadi::Item::Id itemId, const QString &subject, const QString &to); protected: void itemsRemoved(const Akonadi::Item::List &item) override; diff --git a/agents/sendlateragent/sendlateragent.cpp b/agents/sendlateragent/sendlateragent.cpp --- a/agents/sendlateragent/sendlateragent.cpp +++ b/agents/sendlateragent/sendlateragent.cpp @@ -42,6 +42,7 @@ #include #include +#include //#define DEBUG_SENDLATERAGENT 1 @@ -162,6 +163,22 @@ } } +void SendLaterAgent::addItem(qint64 timestamp, bool recurrence, int recurrenceValue, int recurrenceUnit, + Akonadi::Item::Id id, const QString &subject, const QString &to) +{ + auto info = new MessageComposer::SendLaterInfo; + info->setDateTime(QDateTime::fromSecsSinceEpoch(timestamp)); + info->setRecurrence(recurrence); + info->setRecurrenceEachValue(recurrenceValue); + info->setRecurrenceUnit(static_cast(recurrenceUnit)); + info->setItemId(id); + info->setSubject(subject); + info->setTo(to); + + SendLaterUtil::writeSendLaterInfo(SendLaterUtil::defaultConfig(), info); + reload(); +} + void SendLaterAgent::slotSendNow(Akonadi::Item::Id id) { mManager->sendNow(id); diff --git a/agents/sendlateragent/sendlateragentsettings.kcfg b/agents/sendlateragent/sendlateragentsettings.kcfg new file mode 100644 --- /dev/null +++ b/agents/sendlateragent/sendlateragentsettings.kcfg @@ -0,0 +1,12 @@ + + + + + + true + + + diff --git a/agents/sendlateragent/sendlateragentsettings.kcfgc b/agents/sendlateragent/sendlateragentsettings.kcfgc new file mode 100644 --- /dev/null +++ b/agents/sendlateragent/sendlateragentsettings.kcfgc @@ -0,0 +1,5 @@ +# Code generation options for kconfig_compiler +File=sendlateragentsettings.kcfg +ClassName=SendLaterAgentSettings +Singleton=true +Mutators=true diff --git a/agents/sendlateragent/sendlaterconfigurewidget.h b/agents/sendlateragent/sendlaterconfigurewidget.h --- a/agents/sendlateragent/sendlaterconfigurewidget.h +++ b/agents/sendlateragent/sendlaterconfigurewidget.h @@ -26,7 +26,7 @@ #include #include -namespace SendLater { +namespace MessageComposer { class SendLaterInfo; } @@ -36,11 +36,11 @@ explicit SendLaterItem(QTreeWidget *parent = nullptr); ~SendLaterItem(); - void setInfo(SendLater::SendLaterInfo *info); - SendLater::SendLaterInfo *info() const; + void setInfo(MessageComposer::SendLaterInfo *info); + MessageComposer::SendLaterInfo *info() const; private: - SendLater::SendLaterInfo *mInfo = nullptr; + MessageComposer::SendLaterInfo *mInfo = nullptr; }; class SendLaterWidget : public QWidget @@ -73,7 +73,7 @@ void updateButtons(); void slotCustomContextMenuRequested(const QPoint &); void slotSendNow(); - void createOrUpdateItem(SendLater::SendLaterInfo *info, SendLaterItem *item = nullptr); + void createOrUpdateItem(MessageComposer::SendLaterInfo *info, SendLaterItem *item = nullptr); void load(); QVector mListMessagesToRemove; bool mChanged = false; diff --git a/agents/sendlateragent/sendlaterconfigurewidget.cpp b/agents/sendlateragent/sendlaterconfigurewidget.cpp --- a/agents/sendlateragent/sendlaterconfigurewidget.cpp +++ b/agents/sendlateragent/sendlaterconfigurewidget.cpp @@ -18,10 +18,12 @@ */ #include "sendlaterconfigurewidget.h" -#include "sendlaterinfo.h" #include "sendlaterutil.h" #include "sendlaterdialog.h" +#include +#include + #include #include #include @@ -48,12 +50,12 @@ delete mInfo; } -void SendLaterItem::setInfo(SendLater::SendLaterInfo *info) +void SendLaterItem::setInfo(MessageComposer::SendLaterInfo *info) { mInfo = info; } -SendLater::SendLaterInfo *SendLaterItem::info() const +MessageComposer::SendLaterInfo *SendLaterItem::info() const { return mInfo; } @@ -147,12 +149,12 @@ void SendLaterWidget::load() { - KSharedConfig::Ptr config = KSharedConfig::openConfig(); + KSharedConfig::Ptr config = SendLaterUtil::defaultConfig(); const QStringList filterGroups = config->groupList().filter(QRegularExpression(sendLaterItemPattern())); const int numberOfItem = filterGroups.count(); for (int i = 0; i < numberOfItem; ++i) { KConfigGroup group = config->group(filterGroups.at(i)); - SendLater::SendLaterInfo *info = new SendLater::SendLaterInfo(group); + auto info = SendLaterUtil::readSendLaterInfo(group); if (info->isValid()) { createOrUpdateItem(info); } else { @@ -162,7 +164,7 @@ mWidget->treeWidget->setShowDefaultText(numberOfItem == 0); } -void SendLaterWidget::createOrUpdateItem(SendLater::SendLaterInfo *info, SendLaterItem *item) +void SendLaterWidget::createOrUpdateItem(MessageComposer::SendLaterInfo *info, SendLaterItem *item) { if (!item) { item = new SendLaterItem(mWidget->treeWidget); @@ -183,7 +185,7 @@ if (!mChanged) { return; } - KSharedConfig::Ptr config = KSharedConfig::openConfig(); + KSharedConfig::Ptr config = SendLaterUtil::defaultConfig(); // first, delete all filter groups: const QStringList filterGroups = config->groupList().filter(QRegularExpression(sendLaterItemPattern())); @@ -196,8 +198,7 @@ for (int i = 0; i < numberOfItem; ++i) { SendLaterItem *mailItem = static_cast(mWidget->treeWidget->topLevelItem(i)); if (mailItem->info()) { - KConfigGroup group = config->group(SendLater::SendLaterUtil::sendLaterPattern().arg(mailItem->info()->itemId())); - mailItem->info()->writeConfig(group); + SendLaterUtil::writeSendLaterInfo(config, mailItem->info()); } } config->sync(); @@ -248,9 +249,9 @@ } SendLaterItem *mailItem = static_cast(item); - QPointer dialog = new SendLater::SendLaterDialog(mailItem->info(), this); + QPointer dialog = new MessageComposer::SendLaterDialog(mailItem->info(), this); if (dialog->exec()) { - SendLater::SendLaterInfo *info = dialog->info(); + auto info = dialog->info(); createOrUpdateItem(info, mailItem); mChanged = true; } @@ -261,7 +262,7 @@ void SendLaterWidget::needToReload() { mWidget->treeWidget->clear(); - KSharedConfig::Ptr config = KSharedConfig::openConfig(); + KSharedConfig::Ptr config = SendLaterUtil::defaultConfig(); config->reparseConfiguration(); load(); } diff --git a/agents/sendlateragent/sendlaterjob.h b/agents/sendlateragent/sendlaterjob.h --- a/agents/sendlateragent/sendlaterjob.h +++ b/agents/sendlateragent/sendlaterjob.h @@ -28,29 +28,29 @@ #include #include -namespace SendLater { +namespace MessageComposer { class SendLaterInfo; } class KJob; class SendLaterJob : public QObject { Q_OBJECT public: - explicit SendLaterJob(SendLaterManager *manager, SendLater::SendLaterInfo *info, QObject *parent = nullptr); - ~SendLaterJob(); + SendLaterJob(SendLaterManager *manager, MessageComposer::SendLaterInfo *info, QObject *parent = nullptr); + ~SendLaterJob() override; + void start(); private: - Q_DISABLE_COPY(SendLaterJob) void sendDone(); void sendError(const QString &error, SendLaterManager::ErrorType type); void slotMessageTransfered(const Akonadi::Item::List &); void slotJobFinished(KJob *); void slotDeleteItem(KJob *); void updateAndCleanMessageBeforeSending(const KMime::Message::Ptr &msg); Akonadi::ItemFetchScope mFetchScope; SendLaterManager *mManager = nullptr; - SendLater::SendLaterInfo *mInfo = nullptr; + MessageComposer::SendLaterInfo *mInfo = nullptr; Akonadi::Item mItem; }; diff --git a/agents/sendlateragent/sendlaterjob.cpp b/agents/sendlateragent/sendlaterjob.cpp --- a/agents/sendlateragent/sendlaterjob.cpp +++ b/agents/sendlateragent/sendlaterjob.cpp @@ -18,10 +18,10 @@ */ #include "sendlaterjob.h" -#include "sendlaterinfo.h" #include #include +#include #include #include @@ -36,7 +36,7 @@ #include #include "sendlateragent_debug.h" -SendLaterJob::SendLaterJob(SendLaterManager *manager, SendLater::SendLaterInfo *info, QObject *parent) +SendLaterJob::SendLaterJob(SendLaterManager *manager, MessageComposer::SendLaterInfo *info, QObject *parent) : QObject(parent) , mManager(manager) , mInfo(info) diff --git a/agents/sendlateragent/sendlatermanager.h b/agents/sendlateragent/sendlatermanager.h --- a/agents/sendlateragent/sendlatermanager.h +++ b/agents/sendlateragent/sendlatermanager.h @@ -27,12 +27,9 @@ #include -namespace SendLater { -class SendLaterInfo; -} - namespace MessageComposer { class AkonadiSender; +class SendLaterInfo; } class QTimer; @@ -53,8 +50,8 @@ explicit SendLaterManager(QObject *parent); ~SendLaterManager(); - void sendDone(SendLater::SendLaterInfo *info); - void sendError(SendLater::SendLaterInfo *info, ErrorType type); + void sendDone(MessageComposer::SendLaterInfo *info); + void sendError(MessageComposer::SendLaterInfo *info, ErrorType type); Q_REQUIRED_RESULT QString printDebugInfo() const; void stopAll(); @@ -74,15 +71,15 @@ Q_DISABLE_COPY(SendLaterManager) void slotCreateJob(); void createSendInfoList(); - QString infoToStr(SendLater::SendLaterInfo *info) const; - void removeLaterInfo(SendLater::SendLaterInfo *info); - SendLater::SendLaterInfo *searchInfo(Akonadi::Item::Id id); + QString infoToStr(MessageComposer::SendLaterInfo *info) const; + void removeLaterInfo(MessageComposer::SendLaterInfo *info); + MessageComposer::SendLaterInfo *searchInfo(Akonadi::Item::Id id); void recreateSendList(); void stopTimer(); void removeInfo(Akonadi::Item::Id id); KSharedConfig::Ptr mConfig; - QList mListSendLaterInfo; - SendLater::SendLaterInfo *mCurrentInfo = nullptr; + QList mListSendLaterInfo; + MessageComposer::SendLaterInfo *mCurrentInfo = nullptr; SendLaterJob *mCurrentJob = nullptr; QTimer *mTimer = nullptr; MessageComposer::AkonadiSender *mSender = nullptr; diff --git a/agents/sendlateragent/sendlatermanager.cpp b/agents/sendlateragent/sendlatermanager.cpp --- a/agents/sendlateragent/sendlatermanager.cpp +++ b/agents/sendlateragent/sendlatermanager.cpp @@ -18,11 +18,11 @@ */ #include "sendlatermanager.h" -#include "sendlaterinfo.h" #include "sendlaterutil.h" #include "sendlaterjob.h" #include +#include #include #include @@ -39,7 +39,7 @@ : QObject(parent) , mSender(new MessageComposer::AkonadiSender) { - mConfig = KSharedConfig::openConfig(); + mConfig = SendLaterUtil::defaultConfig(); mTimer = new QTimer(this); connect(mTimer, &QTimer::timeout, this, &SendLaterManager::slotCreateJob); } @@ -70,7 +70,7 @@ const int numberOfItems = itemList.count(); for (int i = 0; i < numberOfItems; ++i) { KConfigGroup group = mConfig->group(itemList.at(i)); - SendLater::SendLaterInfo *info = new SendLater::SendLaterInfo(group); + auto *info = SendLaterUtil::readSendLaterInfo(group); if (info->isValid()) { mListSendLaterInfo.append(info); } else { @@ -83,7 +83,7 @@ void SendLaterManager::createSendInfoList() { mCurrentInfo = nullptr; - std::sort(mListSendLaterInfo.begin(), mListSendLaterInfo.end(), SendLater::SendLaterUtil::compareSendLaterInfo); + std::sort(mListSendLaterInfo.begin(), mListSendLaterInfo.end(), SendLaterUtil::compareSendLaterInfo); //Look at QQueue if (mSendLaterQueue.isEmpty()) { @@ -103,7 +103,7 @@ mTimer->stop(); } } else { - SendLater::SendLaterInfo *info = searchInfo(mSendLaterQueue.dequeue()); + MessageComposer::SendLaterInfo *info = searchInfo(mSendLaterQueue.dequeue()); if (info) { mCurrentInfo = info; slotCreateJob(); @@ -120,9 +120,9 @@ } } -SendLater::SendLaterInfo *SendLaterManager::searchInfo(Akonadi::Item::Id id) +MessageComposer::SendLaterInfo *SendLaterManager::searchInfo(Akonadi::Item::Id id) { - for (SendLater::SendLaterInfo *info : qAsConst(mListSendLaterInfo)) { + for (MessageComposer::SendLaterInfo *info : qAsConst(mListSendLaterInfo)) { if (info->itemId() == id) { return info; } @@ -133,7 +133,7 @@ void SendLaterManager::sendNow(Akonadi::Item::Id id) { if (!mCurrentJob) { - SendLater::SendLaterInfo *info = searchInfo(id); + MessageComposer::SendLaterInfo *info = searchInfo(id); if (info) { mCurrentInfo = info; slotCreateJob(); @@ -161,7 +161,7 @@ bool SendLaterManager::itemRemoved(Akonadi::Item::Id id) { - if (mConfig->hasGroup(SendLater::SendLaterUtil::sendLaterPattern().arg(id))) { + if (mConfig->hasGroup(SendLaterUtil::sendLaterPattern().arg(id))) { removeInfo(id); mConfig->reparseConfiguration(); Q_EMIT needUpdateConfigDialogBox(); @@ -172,12 +172,12 @@ void SendLaterManager::removeInfo(Akonadi::Item::Id id) { - KConfigGroup group = mConfig->group(SendLater::SendLaterUtil::sendLaterPattern().arg(id)); + KConfigGroup group = mConfig->group(SendLaterUtil::sendLaterPattern().arg(id)); group.deleteGroup(); group.sync(); } -void SendLaterManager::sendError(SendLater::SendLaterInfo *info, ErrorType type) +void SendLaterManager::sendError(MessageComposer::SendLaterInfo *info, ErrorType type) { mCurrentJob = nullptr; if (info) { @@ -217,19 +217,20 @@ QTimer::singleShot(0, this, &SendLaterManager::createSendInfoList); } -void SendLaterManager::sendDone(SendLater::SendLaterInfo *info) +void SendLaterManager::sendDone(MessageComposer::SendLaterInfo *info) { if (info) { if (info->isRecurrence()) { - SendLater::SendLaterUtil::changeRecurrentDate(info); + SendLaterUtil::changeRecurrentDate(info); + load(true); } else { removeLaterInfo(info); } } recreateSendList(); } -void SendLaterManager::removeLaterInfo(SendLater::SendLaterInfo *info) +void SendLaterManager::removeLaterInfo(MessageComposer::SendLaterInfo *info) { mListSendLaterInfo.removeAll(mCurrentInfo); mCurrentInfo = nullptr; @@ -242,7 +243,7 @@ if (mListSendLaterInfo.isEmpty()) { infoStr = QStringLiteral("No mail"); } else { - for (SendLater::SendLaterInfo *info : qAsConst(mListSendLaterInfo)) { + for (MessageComposer::SendLaterInfo *info : qAsConst(mListSendLaterInfo)) { if (!infoStr.isEmpty()) { infoStr += QLatin1Char('\n'); } @@ -252,7 +253,7 @@ return infoStr; } -QString SendLaterManager::infoToStr(SendLater::SendLaterInfo *info) const +QString SendLaterManager::infoToStr(MessageComposer::SendLaterInfo *info) const { QString infoStr = QLatin1String("Recusive ") + (info->isRecurrence() ? QStringLiteral("true") : QStringLiteral("false")); infoStr += QLatin1String("Item id :") + QString::number(info->itemId()); diff --git a/agents/sendlateragent/tests/sendlaterinfo_gui.cpp b/agents/sendlateragent/sendlaterutil.h copy from agents/sendlateragent/tests/sendlaterinfo_gui.cpp copy to agents/sendlateragent/sendlaterutil.h --- a/agents/sendlateragent/tests/sendlaterinfo_gui.cpp +++ b/agents/sendlateragent/sendlaterutil.h @@ -17,21 +17,32 @@ Boston, MA 02110-1301, USA. */ -#include -#include -#include -#include "sendlaterdialog.h" - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - QStandardPaths::setTestModeEnabled(true); - QCommandLineParser parser; - parser.addVersionOption(); - parser.addHelpOption(); - parser.process(app); - SendLater::SendLaterDialog *dialog = new SendLater::SendLaterDialog(nullptr); - dialog->exec(); - delete dialog; - return 0; +#ifndef SENDLATERUTIL_H +#define SENDLATERUTIL_H + +#include + +namespace MessageComposer { +class SendLaterInfo; +} + +/** Send later utilities. */ +namespace SendLaterUtil { + +Q_REQUIRED_RESULT bool compareSendLaterInfo(MessageComposer::SendLaterInfo *left, MessageComposer::SendLaterInfo *right); + +Q_REQUIRED_RESULT KSharedConfig::Ptr defaultConfig(); + +void writeSendLaterInfo(KSharedConfig::Ptr config, MessageComposer::SendLaterInfo *info); +Q_REQUIRED_RESULT MessageComposer::SendLaterInfo *readSendLaterInfo(KConfigGroup &config); + +Q_REQUIRED_RESULT bool sentLaterAgentEnabled(); + +void changeRecurrentDate(MessageComposer::SendLaterInfo *info); +void forceReparseConfiguration(); + +Q_REQUIRED_RESULT QString sendLaterPattern(); + } + +#endif // SENDLATERUTIL_H diff --git a/agents/sendlateragent/sendlaterutil.cpp b/agents/sendlateragent/sendlaterutil.cpp new file mode 100644 --- /dev/null +++ b/agents/sendlateragent/sendlaterutil.cpp @@ -0,0 +1,145 @@ +/* + Copyright (C) 2013-2020 Laurent Montel + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "sendlaterutil.h" +#include "sendlateragentsettings.h" +#include "sendlateragent_debug.h" + +#include + +#include +#include + +#include +#include + +bool SendLaterUtil::compareSendLaterInfo(MessageComposer::SendLaterInfo *left, + MessageComposer::SendLaterInfo *right) +{ + if (left->dateTime() == right->dateTime()) { + //Set no recursive first. + if (left->isRecurrence()) { + return false; + } + } + return left->dateTime() < right->dateTime(); +} + +static QDateTime updateRecurence(MessageComposer::SendLaterInfo *info, QDateTime dateTime) +{ + switch (info->recurrenceUnit()) { + case MessageComposer::SendLaterInfo::Days: + dateTime = dateTime.addDays(info->recurrenceEachValue()); + break; + case MessageComposer::SendLaterInfo::Weeks: + dateTime = dateTime.addDays(info->recurrenceEachValue() * 7); + break; + case MessageComposer::SendLaterInfo::Months: + dateTime = dateTime.addMonths(info->recurrenceEachValue()); + break; + case MessageComposer::SendLaterInfo::Years: + dateTime = dateTime.addYears(info->recurrenceEachValue()); + break; + } + return dateTime; +} + +void SendLaterUtil::changeRecurrentDate(MessageComposer::SendLaterInfo *info) +{ + if (info && info->isRecurrence()) { + qCDebug(SENDLATERAGENT_LOG) << "BEFORE SendLaterUtil::changeRecurrentDate " << info->dateTime().toString(); + QDateTime newInfoDateTime = info->dateTime(); + newInfoDateTime = updateRecurence(info, newInfoDateTime); + qCDebug(SENDLATERAGENT_LOG) << " QDateTime::currentDateTime()" << QDateTime::currentDateTime().toString(); + while (newInfoDateTime <= QDateTime::currentDateTime()) { + newInfoDateTime = updateRecurence(info, newInfoDateTime); + } + info->setDateTime(newInfoDateTime); + qCDebug(SENDLATERAGENT_LOG) << "AFTER SendLaterUtil::changeRecurrentDate " << info->dateTime().toString() << " info" << info << "New date" << newInfoDateTime; + writeSendLaterInfo(defaultConfig(), info); + } +} + +KSharedConfig::Ptr SendLaterUtil::defaultConfig() +{ + return KSharedConfig::openConfig(QStringLiteral("akonadi_sendlater_agentrc"), KConfig::SimpleConfig); +} + +MessageComposer::SendLaterInfo *SendLaterUtil::readSendLaterInfo(KConfigGroup &config) +{ + auto info = new MessageComposer::SendLaterInfo; + if (config.hasKey(QStringLiteral("lastDateTimeSend"))) { + info->setLastDateTimeSend(QDateTime::fromString(config.readEntry("lastDateTimeSend"), Qt::ISODate)); + } + info->setDateTime(config.readEntry("date", QDateTime::currentDateTime())); + info->setRecurrence(config.readEntry("recurrence", false)); + info->setRecurrenceEachValue(config.readEntry("recurrenceValue", 1)); + info->setRecurrenceUnit(static_cast(config.readEntry("recurrenceUnit", static_cast(MessageComposer::SendLaterInfo::Days)))); + info->setItemId(config.readEntry("itemId", -1)); + info->setSubject(config.readEntry("subject")); + info->setTo(config.readEntry("to")); + + return info; +} + +void SendLaterUtil::writeSendLaterInfo(KSharedConfig::Ptr config, MessageComposer::SendLaterInfo *info) +{ + if (!info || !info->isValid()) { + return; + } + + const QString groupName = SendLaterUtil::sendLaterPattern().arg(info->itemId()); + // first, delete all filter groups: + const QStringList filterGroups = config->groupList(); + for (const QString &group : filterGroups) { + if (group == groupName) { + config->deleteGroup(group); + } + } + KConfigGroup group = config->group(groupName); + if (info->lastDateTimeSend().isValid()) { + group.writeEntry("lastDateTimeSend", info->lastDateTimeSend().toString(Qt::ISODate)); + } + group.writeEntry("date", info->dateTime()); + group.writeEntry("recurrence", info->isRecurrence()); + group.writeEntry("recurrenceValue", info->recurrenceEachValue()); + group.writeEntry("recurrenceUnit", static_cast(info->recurrenceUnit())); + group.writeEntry("itemId", info->itemId()); + group.writeEntry("subject", info->subject()); + group.writeEntry("to", info->to()); + config->sync(); + config->reparseConfiguration(); + qCDebug(SENDLATERAGENT_LOG) << " reparse config"; +} + +void SendLaterUtil::forceReparseConfiguration() +{ + SendLaterAgentSettings::self()->save(); + SendLaterAgentSettings::self()->config()->reparseConfiguration(); +} + +bool SendLaterUtil::sentLaterAgentEnabled() +{ + return SendLaterAgentSettings::self()->enabled(); +} + +QString SendLaterUtil::sendLaterPattern() +{ + return QStringLiteral("SendLaterItem %1"); +} diff --git a/agents/sendlateragent/autotests/sendlaterdialogtest.h b/agents/sendlateragent/sendlaterutil_p.h rename from agents/sendlateragent/autotests/sendlaterdialogtest.h rename to agents/sendlateragent/sendlaterutil_p.h --- a/agents/sendlateragent/autotests/sendlaterdialogtest.h +++ b/agents/sendlateragent/sendlaterutil_p.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2020 Laurent Montel + Copyright (C) 2013-2020 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public @@ -17,20 +17,18 @@ Boston, MA 02110-1301, USA. */ -#ifndef SENDLATERDIALOGTEST_H -#define SENDLATERDIALOGTEST_H +#ifndef SENDLATERUTIL_P_H +#define SENDLATERUTIL_P_H -#include +#include -class SendLaterDialogTest : public QObject -{ - Q_OBJECT -public: - explicit SendLaterDialogTest(QObject *parent = nullptr); - ~SendLaterDialogTest(); -private Q_SLOTS: - void shouldHaveDefaultValue(); - void initTestCase(); -}; +namespace SendLater { +class SendLaterInfo; -#endif // SENDLATERDIALOGTEST_H +namespace SendLaterUtil { + +Q_REQUIRED_RESULT QDateTime updateRecurence(SendLater::SendLaterInfo *info, QDateTime dateTime); + +} +} +#endif // SENDLATERUTIL_P_H diff --git a/agents/sendlateragent/tests/CMakeLists.txt b/agents/sendlateragent/tests/CMakeLists.txt --- a/agents/sendlateragent/tests/CMakeLists.txt +++ b/agents/sendlateragent/tests/CMakeLists.txt @@ -1,7 +1,5 @@ set(sendlaterinfo_gui_SRCS sendlaterinfo_gui.cpp ) add_executable(sendlaterinfo_gui ${sendlaterinfo_gui_SRCS}) target_link_libraries(sendlaterinfo_gui - KF5::SendLater - KF5::I18n - Qt5::Widgets + sendlateragent ) diff --git a/agents/sendlateragent/tests/sendlaterinfo_gui.cpp b/agents/sendlateragent/tests/sendlaterinfo_gui.cpp --- a/agents/sendlateragent/tests/sendlaterinfo_gui.cpp +++ b/agents/sendlateragent/tests/sendlaterinfo_gui.cpp @@ -20,6 +20,8 @@ #include #include #include + +#include #include "sendlaterdialog.h" int main(int argc, char **argv) @@ -30,7 +32,7 @@ parser.addVersionOption(); parser.addHelpOption(); parser.process(app); - SendLater::SendLaterDialog *dialog = new SendLater::SendLaterDialog(nullptr); + MessageComposer::SendLaterDialog *dialog = new MessageComposer::SendLaterDialog(nullptr); dialog->exec(); delete dialog; return 0;