1 /*
2 SPDX-FileCopyrightText: 2014-2021 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "followupreminderagent.h"
8 #include "followupreminderadaptor.h"
9 #include "followupreminderagentsettings.h"
10 #include "followupreminderinfo.h"
11 #include "followupremindermanager.h"
12 #include "followupreminderutil.h"
13
14 #include <KMime/Message>
15
16 #include <Akonadi/ChangeRecorder>
17 #include <Akonadi/ItemFetchScope>
18 #include <QDBusConnection>
19
20 #include <Akonadi/CollectionFetchScope>
21 #include <Akonadi/ServerManager>
22 #include <Akonadi/Session>
23 #include <kcoreaddons_version.h>
24 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(6, 0, 0)
25 #include <Kdelibs4ConfigMigrator>
26 #endif
27 #include "followupreminderagent_debug.h"
28 #include <QTimer>
29 #include <chrono>
30
31 using namespace std::chrono_literals;
32
FollowUpReminderAgent(const QString & id)33 FollowUpReminderAgent::FollowUpReminderAgent(const QString &id)
34 : Akonadi::AgentBase(id)
35 , mManager(new FollowUpReminderManager(this))
36 , mTimer(new QTimer(this))
37 {
38 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(6, 0, 0)
39 Kdelibs4ConfigMigrator migrate(QStringLiteral("followupreminderagent"));
40 migrate.setConfigFiles(QStringList() << QStringLiteral("akonadi_followupreminder_agentrc") << QStringLiteral("akonadi_followupreminder_agent.notifyrc"));
41 migrate.migrate();
42 #endif
43
44 new FollowUpReminderAgentAdaptor(this);
45 QDBusConnection::sessionBus().registerObject(QStringLiteral("/FollowUpReminder"), this, QDBusConnection::ExportAdaptors);
46 const QString service = Akonadi::ServerManager::self()->agentServiceName(Akonadi::ServerManager::Agent, QStringLiteral("akonadi_followupreminder_agent"));
47 QDBusConnection::sessionBus().registerService(service);
48 setNeedsNetwork(true);
49
50 changeRecorder()->setMimeTypeMonitored(KMime::Message::mimeType());
51 changeRecorder()->itemFetchScope().setCacheOnly(true);
52 changeRecorder()->itemFetchScope().setFetchModificationTime(false);
53 changeRecorder()->fetchCollection(true);
54 changeRecorder()->setChangeRecordingEnabled(false);
55 changeRecorder()->ignoreSession(Akonadi::Session::defaultSession());
56 changeRecorder()->collectionFetchScope().setAncestorRetrieval(Akonadi::CollectionFetchScope::All);
57 changeRecorder()->setCollectionMonitored(Akonadi::Collection::root(), true);
58
59 if (FollowUpReminderAgentSettings::enabled()) {
60 mManager->load();
61 }
62
63 connect(mTimer, &QTimer::timeout, this, &FollowUpReminderAgent::reload);
64 // Reload all each 24hours
65 mTimer->start(24h);
66 }
67
68 FollowUpReminderAgent::~FollowUpReminderAgent() = default;
69
setEnableAgent(bool enabled)70 void FollowUpReminderAgent::setEnableAgent(bool enabled)
71 {
72 if (FollowUpReminderAgentSettings::self()->enabled() == enabled) {
73 return;
74 }
75
76 FollowUpReminderAgentSettings::self()->setEnabled(enabled);
77 FollowUpReminderAgentSettings::self()->save();
78 if (enabled) {
79 mManager->load();
80 mTimer->start();
81 } else {
82 mTimer->stop();
83 }
84 }
85
enabledAgent() const86 bool FollowUpReminderAgent::enabledAgent() const
87 {
88 return FollowUpReminderAgentSettings::self()->enabled();
89 }
90
itemAdded(const Akonadi::Item & item,const Akonadi::Collection & collection)91 void FollowUpReminderAgent::itemAdded(const Akonadi::Item &item, const Akonadi::Collection &collection)
92 {
93 if (!enabledAgent()) {
94 return;
95 }
96
97 if (item.mimeType() != KMime::Message::mimeType()) {
98 qCDebug(FOLLOWUPREMINDERAGENT_LOG) << "FollowUpReminderAgent::itemAdded called for a non-message item!";
99 return;
100 }
101 mManager->checkFollowUp(item, collection);
102 }
103
reload()104 void FollowUpReminderAgent::reload()
105 {
106 if (enabledAgent()) {
107 mManager->load(true);
108 mTimer->start();
109 }
110 }
111
addReminder(const QString & messageId,Akonadi::Item::Id messageItemId,const QString & to,const QString & subject,QDate followupDate,Akonadi::Item::Id todoId)112 void FollowUpReminderAgent::addReminder(const QString &messageId,
113 Akonadi::Item::Id messageItemId,
114 const QString &to,
115 const QString &subject,
116 QDate followupDate,
117 Akonadi::Item::Id todoId)
118 {
119 auto info = new FollowUpReminder::FollowUpReminderInfo();
120 info->setMessageId(messageId);
121 info->setOriginalMessageItemId(messageItemId);
122 info->setTo(to);
123 info->setSubject(subject);
124 info->setFollowUpReminderDate(followupDate);
125 info->setTodoId(todoId);
126
127 mManager->addReminder(info);
128 }
129
printDebugInfo() const130 QString FollowUpReminderAgent::printDebugInfo() const
131 {
132 return mManager->printDebugInfo();
133 }
134
135 AKONADI_AGENT_MAIN(FollowUpReminderAgent)
136