File indexing completed on 2024-05-19 05:11:07

0001 /*
0002   SPDX-FileCopyrightText: 2013 Sérgio Martins <iamsergio@gmail.com>
0003 
0004   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0005 */
0006 
0007 #pragma once
0008 
0009 #include "options.h"
0010 
0011 #include <KCalendarCore/Incidence>
0012 
0013 #include <Akonadi/Collection>
0014 #include <Akonadi/FetchJobCalendar>
0015 #include <Akonadi/IncidenceChanger>
0016 #include <Akonadi/Item>
0017 #include <QMultiMap>
0018 #include <QObject>
0019 #include <QString>
0020 
0021 class CollectionLoader;
0022 
0023 class CalendarJanitor : public QObject
0024 {
0025     Q_OBJECT
0026 public:
0027     explicit CalendarJanitor(const Options &options, QObject *parent = nullptr);
0028 
0029     void start();
0030 
0031 Q_SIGNALS:
0032     void finished(bool success);
0033 
0034 private Q_SLOTS:
0035     void onCollectionsFetched(bool success);
0036     void onItemsFetched(bool success, const QString &errorMessage);
0037     void onModifyFinished(int changeId, const Akonadi::Item &item, Akonadi::IncidenceChanger::ResultCode resultCode, const QString &errorMessage);
0038     void onDeleteFinished(int changeId, const QList<Akonadi::Item::Id> &, Akonadi::IncidenceChanger::ResultCode resultCode, const QString &errorMessage);
0039 
0040     void processNextCollection();
0041 
0042     // For each collection we process, we run a bunch of tests on it.
0043     void runNextTest();
0044 
0045     void sanityCheck1();
0046     void sanityCheck2();
0047     void sanityCheck3();
0048     void sanityCheck4();
0049     void sanityCheck5();
0050     void sanityCheck6();
0051     void sanityCheck7();
0052     void sanityCheck8();
0053     void sanityCheck9();
0054 
0055     void stripOldAlarms();
0056 
0057     void printFound(const Akonadi::Item &item, const QString &explanation = QString());
0058 
0059     void beginTest(const QString &message);
0060     void endTest(bool print = true, const QString &fixExplanation = QString(), const QString &fixExplanation2 = QString());
0061 
0062     void deleteIncidence(const Akonadi::Item &item);
0063 
0064 private:
0065     CollectionLoader *m_collectionLoader = nullptr;
0066     Akonadi::Collection::List m_collectionsToProcess;
0067     Akonadi::Item::List m_itemsToProcess;
0068     Options m_options;
0069     Akonadi::IncidenceChanger *m_changer = nullptr;
0070     Akonadi::Collection m_currentCollection;
0071     Options::SanityCheck m_currentSanityCheck;
0072     int m_pendingModifications = 0;
0073     int m_pendingDeletions = 0;
0074     bool m_strippingOldAlarms = false;
0075 
0076     QList<Akonadi::Item::Id> m_test1Results;
0077     QStringList m_test2Results;
0078 
0079     int m_numDamaged = 0;
0080     bool m_fixingEnabled = false;
0081 
0082     QString m_summary; // to print at the end.
0083     QMultiMap<QString, KCalendarCore::Incidence::Ptr> m_incidenceMap;
0084     QMap<KCalendarCore::Incidence::Ptr, Akonadi::Item> m_incidenceToItem;
0085 
0086     Akonadi::FetchJobCalendar::Ptr m_calendar;
0087 
0088     int m_returnCode;
0089 };