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 };