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