File indexing completed on 2025-05-04 04:54:54

0001 /*
0002    SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "followupreminderfinishtaskjob.h"
0008 #include "followupreminderagent_debug.h"
0009 
0010 #include <Akonadi/ItemFetchJob>
0011 #include <Akonadi/ItemModifyJob>
0012 #include <KCalendarCore/Todo>
0013 
0014 FollowUpReminderFinishTaskJob::FollowUpReminderFinishTaskJob(Akonadi::Item::Id id, QObject *parent)
0015     : QObject(parent)
0016     , mTodoId(id)
0017 {
0018 }
0019 
0020 FollowUpReminderFinishTaskJob::~FollowUpReminderFinishTaskJob() = default;
0021 
0022 void FollowUpReminderFinishTaskJob::start()
0023 {
0024     if (mTodoId != -1) {
0025         closeTodo();
0026     } else {
0027         qCWarning(FOLLOWUPREMINDERAGENT_LOG) << "Failed to FollowUpReminderFinishTaskJob::start";
0028         Q_EMIT finishTaskFailed();
0029         deleteLater();
0030     }
0031 }
0032 
0033 void FollowUpReminderFinishTaskJob::closeTodo()
0034 {
0035     Akonadi::Item item(mTodoId);
0036     auto job = new Akonadi::ItemFetchJob(item, this);
0037     connect(job, &Akonadi::ItemFetchJob::result, this, &FollowUpReminderFinishTaskJob::slotItemFetchJobDone);
0038 }
0039 
0040 void FollowUpReminderFinishTaskJob::slotItemFetchJobDone(KJob *job)
0041 {
0042     if (job->error()) {
0043         qCWarning(FOLLOWUPREMINDERAGENT_LOG) << "Failed to fetch item in FollowUpReminderFinishTaskJob : " << job->errorString();
0044         Q_EMIT finishTaskFailed();
0045         deleteLater();
0046         return;
0047     }
0048 
0049     const Akonadi::Item::List lst = qobject_cast<Akonadi::ItemFetchJob *>(job)->items();
0050     if (lst.count() == 1) {
0051         const Akonadi::Item item = lst.first();
0052         if (!item.hasPayload<KCalendarCore::Todo::Ptr>()) {
0053             qCDebug(FOLLOWUPREMINDERAGENT_LOG) << "FollowUpReminderFinishTaskJob::slotItemFetchJobDone: item is not a todo.";
0054             Q_EMIT finishTaskFailed();
0055             deleteLater();
0056             return;
0057         }
0058         auto todo = item.payload<KCalendarCore::Todo::Ptr>();
0059         todo->setCompleted(true);
0060         Akonadi::Item updateItem = item;
0061         updateItem.setPayload<KCalendarCore::Todo::Ptr>(todo);
0062 
0063         auto job = new Akonadi::ItemModifyJob(updateItem);
0064         connect(job, &Akonadi::ItemModifyJob::result, this, &FollowUpReminderFinishTaskJob::slotItemModifiedResult);
0065     } else {
0066         qCWarning(FOLLOWUPREMINDERAGENT_LOG) << " Found item different from 1: " << lst.count();
0067         Q_EMIT finishTaskFailed();
0068         deleteLater();
0069         return;
0070     }
0071 }
0072 
0073 void FollowUpReminderFinishTaskJob::slotItemModifiedResult(KJob *job)
0074 {
0075     if (job->error()) {
0076         qCWarning(FOLLOWUPREMINDERAGENT_LOG) << "FollowUpReminderFinishTaskJob::slotItemModifiedResult: Error during modified item: " << job->errorString();
0077         Q_EMIT finishTaskFailed();
0078     } else {
0079         Q_EMIT finishTaskDone();
0080     }
0081     deleteLater();
0082 }
0083 
0084 #include "moc_followupreminderfinishtaskjob.cpp"