File indexing completed on 2024-05-12 05:10:44
0001 /* 0002 SPDX-FileCopyrightText: 2002-2004 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com> 0003 SPDX-FileCopyrightText: 2004 Cornelius Schumacher <schumacher@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #pragma once 0009 0010 #include "etmcalendar.h" 0011 #include "mailscheduler_p.h" 0012 0013 #include <KCalendarCore/FreeBusy> 0014 #include <KCalendarCore/ICalFormat> 0015 0016 #include <QDBusInterface> 0017 #include <QPointer> 0018 0019 #include <KJob> 0020 #include <QUrl> 0021 0022 namespace KIO 0023 { 0024 class Job; 0025 } 0026 0027 namespace Akonadi 0028 { 0029 class FreeBusyManager; 0030 0031 class FreeBusyManagerPrivate : public QObject 0032 { 0033 Q_OBJECT 0034 0035 FreeBusyManager *const q_ptr; 0036 Q_DECLARE_PUBLIC(FreeBusyManager) 0037 0038 public: /// Structs 0039 struct FreeBusyProviderRequest { 0040 FreeBusyProviderRequest(const QString &provider); 0041 0042 enum Status { NotStarted, HandlingRequested, FreeBusyRequested }; 0043 0044 Status mRequestStatus; 0045 QSharedPointer<QDBusInterface> mInterface; 0046 }; 0047 0048 struct FreeBusyProvidersRequestsQueue { 0049 FreeBusyProvidersRequestsQueue(); 0050 FreeBusyProvidersRequestsQueue(const QDateTime &start, const QDateTime &end); 0051 0052 QDateTime mStartTime; 0053 QDateTime mEndTime; 0054 QList<FreeBusyProviderRequest> mRequests; 0055 int mHandlersCount = 0; 0056 KCalendarCore::FreeBusy::Ptr mResultingFreeBusy; 0057 }; 0058 0059 public: 0060 Akonadi::ETMCalendar::Ptr mCalendar; 0061 KCalendarCore::ICalFormat mFormat; 0062 0063 QStringList mRetrieveQueue; 0064 QMap<QUrl, QString> mFreeBusyUrlEmailMap; 0065 QMap<QString, FreeBusyProvidersRequestsQueue> mProvidersRequestsByEmail; 0066 0067 // Free/Busy uploading 0068 QDateTime mNextUploadTime; 0069 int mTimerID = 0; 0070 bool mUploadingFreeBusy = false; 0071 bool mBrokenUrl = false; 0072 0073 QPointer<QWidget> mParentWidgetForMailling; 0074 0075 // the parentWidget to use while doing our "recursive" retrieval 0076 QPointer<QWidget> mParentWidgetForRetrieval; 0077 0078 public: /// Functions 0079 FreeBusyManagerPrivate(FreeBusyManager *q); 0080 void checkFreeBusyUrl(); 0081 QString freeBusyDir() const; 0082 void fetchFreeBusyUrl(const QString &email); 0083 QString freeBusyToIcal(const KCalendarCore::FreeBusy::Ptr &freebusy); 0084 KCalendarCore::FreeBusy::Ptr iCalToFreeBusy(const QByteArray &freeBusyData); 0085 KCalendarCore::FreeBusy::Ptr ownerFreeBusy(); 0086 QString ownerFreeBusyAsString(); 0087 void processFreeBusyDownloadResult(KJob *_job); 0088 void processFreeBusyUploadResult(KJob *_job); 0089 void uploadFreeBusy(); 0090 QStringList getFreeBusyProviders() const; 0091 void queryFreeBusyProviders(const QStringList &providers, const QString &email); 0092 void queryFreeBusyProviders(const QStringList &providers, const QString &email, const QDateTime &start, const QDateTime &end); 0093 0094 public Q_SLOTS: 0095 void processRetrieveQueue(); 0096 void contactSearchJobFinished(KJob *_job); 0097 void finishProcessRetrieveQueue(const QString &email, const QUrl &url); 0098 void onHandlesFreeBusy(const QString &email, bool handles); 0099 void onFreeBusyRetrieved(const QString &email, const QString &freeBusy, bool success, const QString &errorText); 0100 void processMailSchedulerResult(Akonadi::Scheduler::Result result, const QString &errorMsg); 0101 void fbCheckerJobFinished(KJob *job); 0102 0103 Q_SIGNALS: 0104 void freeBusyUrlRetrieved(const QString &email, const QUrl &url); 0105 }; 0106 0107 class FbCheckerJob : public KJob 0108 { 0109 Q_OBJECT 0110 public: 0111 explicit FbCheckerJob(const QList<QUrl> &urlsToCheck, QObject *parent = nullptr); 0112 void start() override; 0113 0114 QUrl validUrl() const; 0115 0116 private Q_SLOTS: 0117 void onGetJobFinished(KJob *job); 0118 void dataReceived(KIO::Job *, const QByteArray &data); 0119 0120 private: 0121 void checkNextUrl(); 0122 QList<QUrl> mUrlsToCheck; 0123 QByteArray mData; 0124 QUrl mValidUrl; 0125 }; 0126 }