You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

200 lines
7.3 KiB

/*
Copyright (C) 2014-2020 Laurent Montel <montel@kde.org>
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 "followupremindermanager.h"
#include "followupreminderagent_debug.h"
#include <FollowupReminder/FollowUpReminderInfo>
#include <FollowupReminder/FollowUpReminderUtil>
#include "followupremindernoanswerdialog.h"
#include "jobs/followupreminderjob.h"
#include "jobs/followupreminderfinishtaskjob.h"
#include <Akonadi/KMime/SpecialMailCollections>
#include <KConfigGroup>
#include <KConfig>
#include <KSharedConfig>
#include <KNotification>
#include <KLocalizedString>
#include <QRegularExpression>
using namespace FollowUpReminder;
FollowUpReminderManager::FollowUpReminderManager(QObject *parent)
: QObject(parent)
{
mConfig = KSharedConfig::openConfig();
}
FollowUpReminderManager::~FollowUpReminderManager()
{
qDeleteAll(mFollowUpReminderInfoList);
mFollowUpReminderInfoList.clear();
}
void FollowUpReminderManager::load(bool forceReloadConfig)
{
if (forceReloadConfig) {
mConfig->reparseConfiguration();
}
const QStringList itemList = mConfig->groupList().filter(QRegularExpression(QStringLiteral("FollowupReminderItem \\d+")));
const int numberOfItems = itemList.count();
QList<FollowUpReminder::FollowUpReminderInfo *> noAnswerList;
for (int i = 0; i < numberOfItems; ++i) {
KConfigGroup group = mConfig->group(itemList.at(i));
FollowUpReminderInfo *info = new FollowUpReminderInfo(group);
if (info->isValid()) {
if (!info->answerWasReceived()) {
mFollowUpReminderInfoList.append(info);
if (!mInitialize) {
FollowUpReminderInfo *noAnswerInfo = new FollowUpReminderInfo(*info);
noAnswerList.append(noAnswerInfo);
} else {
delete info;
}
} else {
delete info;
}
} else {
delete info;
}
}
if (!noAnswerList.isEmpty()) {
mInitialize = true;
if (!mNoAnswerDialog.data()) {
mNoAnswerDialog = new FollowUpReminderNoAnswerDialog;
connect(mNoAnswerDialog.data(), &FollowUpReminderNoAnswerDialog::needToReparseConfiguration, this, &FollowUpReminderManager::slotReparseConfiguration);
}
mNoAnswerDialog->setInfo(noAnswerList);
mNoAnswerDialog->wakeUp();
}
}
void FollowUpReminderManager::addReminder(FollowUpReminder::FollowUpReminderInfo *info)
{
if (info->isValid()) {
FollowUpReminderUtil::writeFollowupReminderInfo(FollowUpReminderUtil::defaultConfig(), info, true);
} else {
delete info;
}
}
void FollowUpReminderManager::slotReparseConfiguration()
{
load(true);
}
void FollowUpReminderManager::checkFollowUp(const Akonadi::Item &item, const Akonadi::Collection &col)
{
if (mFollowUpReminderInfoList.isEmpty()) {
return;
}
const Akonadi::SpecialMailCollections::Type type = Akonadi::SpecialMailCollections::self()->specialCollectionType(col);
switch (type) {
case Akonadi::SpecialMailCollections::Trash:
case Akonadi::SpecialMailCollections::Outbox:
case Akonadi::SpecialMailCollections::Drafts:
case Akonadi::SpecialMailCollections::Templates:
case Akonadi::SpecialMailCollections::SentMail:
return;
default:
break;
}
FollowUpReminderJob *job = new FollowUpReminderJob(this);
connect(job, &FollowUpReminderJob::finished, this, &FollowUpReminderManager::slotCheckFollowUpFinished);
job->setItem(item);
job->start();
}
void FollowUpReminderManager::slotCheckFollowUpFinished(const QString &messageId, Akonadi::Item::Id id)
{
for (FollowUpReminderInfo *info : qAsConst(mFollowUpReminderInfoList)) {
qCDebug(FOLLOWUPREMINDERAGENT_LOG) << "FollowUpReminderManager::slotCheckFollowUpFinished info:" << info;
if (!info) {
continue;
}
if (info->messageId() == messageId) {
info->setAnswerMessageItemId(id);
info->setAnswerWasReceived(true);
answerReceived(info->to());
if (info->todoId() != -1) {
FollowUpReminderFinishTaskJob *job = new FollowUpReminderFinishTaskJob(info->todoId(), this);
connect(job, &FollowUpReminderFinishTaskJob::finishTaskDone, this, &FollowUpReminderManager::slotFinishTaskDone);
connect(job, &FollowUpReminderFinishTaskJob::finishTaskFailed, this, &FollowUpReminderManager::slotFinishTaskFailed);
job->start();
}
//Save item
FollowUpReminder::FollowUpReminderUtil::writeFollowupReminderInfo(FollowUpReminder::FollowUpReminderUtil::defaultConfig(), info, true);
break;
}
}
}
void FollowUpReminderManager::slotFinishTaskDone()
{
qCDebug(FOLLOWUPREMINDERAGENT_LOG) << " Task Done";
//TODO
}
void FollowUpReminderManager::slotFinishTaskFailed()
{
qCDebug(FOLLOWUPREMINDERAGENT_LOG) << " Task Failed";
//TODO
}
void FollowUpReminderManager::answerReceived(const QString &from)
{
KNotification::event(QStringLiteral("mailreceived"),
QString(),
i18n("Answer from %1 received", from),
QStringLiteral("kmail"),
nullptr,
KNotification::CloseOnTimeout,
QStringLiteral("akonadi_followupreminder_agent"));
}
QString FollowUpReminderManager::printDebugInfo() const
{
QString infoStr;
if (mFollowUpReminderInfoList.isEmpty()) {
infoStr = QStringLiteral("No mail");
} else {
for (FollowUpReminder::FollowUpReminderInfo *info : qAsConst(mFollowUpReminderInfoList)) {
if (!infoStr.isEmpty()) {
infoStr += QLatin1Char('\n');
}
infoStr += infoToStr(info);
}
}
return infoStr;
}
QString FollowUpReminderManager::infoToStr(FollowUpReminder::FollowUpReminderInfo *info) const
{
QString infoStr = QStringLiteral("****************************************");
infoStr += QStringLiteral("Akonadi Item id :%1\n").arg(info->originalMessageItemId());
infoStr += QStringLiteral("MessageId :%1\n").arg(info->messageId());
infoStr += QStringLiteral("Subject :%1\n").arg(info->subject());
infoStr += QStringLiteral("To :%1\n").arg(info->to());
infoStr += QStringLiteral("Dead Line :%1\n").arg(info->followUpReminderDate().toString());
infoStr += QStringLiteral("Answer received :%1\n").arg(info->answerWasReceived() ? QStringLiteral("true") : QStringLiteral("false"));
infoStr += QStringLiteral("****************************************\n");
return infoStr;
}