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 }