File indexing completed on 2024-05-12 05:22:13
0001 /* 0002 * SPDX-FileCopyrightText: 2015 Daniel Vrátil <dvratil@redhat.com> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "freebusyqueryjob.h" 0008 #include "calendarservice.h" 0009 #include "utils.h" 0010 0011 #include <QJsonDocument> 0012 #include <QNetworkAccessManager> 0013 #include <QNetworkReply> 0014 #include <QNetworkRequest> 0015 #include <QVariantMap> 0016 0017 using namespace KGAPI2; 0018 0019 class Q_DECL_HIDDEN FreeBusyQueryJob::Private 0020 { 0021 public: 0022 Private(const QString &id, const QDateTime &timeMin, const QDateTime &timeMax) 0023 : id(id) 0024 , timeMin(timeMin) 0025 , timeMax(timeMax) 0026 { 0027 } 0028 0029 const QString id; 0030 const QDateTime timeMin; 0031 const QDateTime timeMax; 0032 FreeBusyQueryJob::BusyRangeList busy; 0033 }; 0034 0035 FreeBusyQueryJob::FreeBusyQueryJob(const QString &id, const QDateTime &timeMin, const QDateTime &timeMax, const AccountPtr &account, QObject *parent) 0036 : FetchJob(account, parent) 0037 , d(new FreeBusyQueryJob::Private(id, timeMin, timeMax)) 0038 { 0039 } 0040 0041 FreeBusyQueryJob::~FreeBusyQueryJob() = default; 0042 0043 FreeBusyQueryJob::BusyRangeList FreeBusyQueryJob::busy() const 0044 { 0045 return d->busy; 0046 } 0047 0048 QString FreeBusyQueryJob::id() const 0049 { 0050 return d->id; 0051 } 0052 0053 QDateTime FreeBusyQueryJob::timeMin() const 0054 { 0055 return d->timeMin; 0056 } 0057 0058 QDateTime FreeBusyQueryJob::timeMax() const 0059 { 0060 return d->timeMax; 0061 } 0062 0063 void FreeBusyQueryJob::start() 0064 { 0065 QVariantMap requestData({{QStringLiteral("timeMin"), Utils::rfc3339DateToString(d->timeMin)}, 0066 {QStringLiteral("timeMax"), Utils::rfc3339DateToString(d->timeMax)}, 0067 {QStringLiteral("items"), QVariantList({QVariantMap({{QStringLiteral("id"), d->id}})})}}); 0068 QJsonDocument document = QJsonDocument::fromVariant(requestData); 0069 const QByteArray json = document.toJson(QJsonDocument::Compact); 0070 0071 const auto request = CalendarService::prepareRequest(CalendarService::freeBusyQueryUrl()); 0072 enqueueRequest(request, json, QStringLiteral("application/json")); 0073 } 0074 0075 void FreeBusyQueryJob::dispatchRequest(QNetworkAccessManager *accessManager, const QNetworkRequest &request, const QByteArray &data, const QString &contentType) 0076 { 0077 QNetworkRequest r = request; 0078 if (!r.hasRawHeader("Content-Type")) { 0079 r.setHeader(QNetworkRequest::ContentTypeHeader, contentType); 0080 } 0081 0082 accessManager->post(r, data); 0083 } 0084 0085 void FreeBusyQueryJob::handleReply(const QNetworkReply *reply, const QByteArray &rawData) 0086 { 0087 const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0088 ContentType ct = Utils::stringToContentType(contentType); 0089 if (ct == KGAPI2::JSON) { 0090 const QJsonDocument document = QJsonDocument::fromJson(rawData); 0091 const QVariantMap data = document.toVariant().toMap(); 0092 const QVariantMap cals = data[QStringLiteral("calendars")].toMap(); 0093 const QVariantMap cal = cals[d->id].toMap(); 0094 if (cal.contains(QStringLiteral("errors"))) { 0095 setError(KGAPI2::NotFound); 0096 setErrorString(tr("FreeBusy information is not available")); 0097 } else { 0098 const QVariantList busyList = cal[QStringLiteral("busy")].toList(); 0099 for (const QVariant &busyV : busyList) { 0100 const QVariantMap busy = busyV.toMap(); 0101 d->busy << BusyRange{Utils::rfc3339DateFromString(busy[QStringLiteral("start")].toString()), 0102 Utils::rfc3339DateFromString(busy[QStringLiteral("end")].toString())}; 0103 } 0104 } 0105 } else { 0106 setError(KGAPI2::InvalidResponse); 0107 setErrorString(tr("Invalid response content type")); 0108 } 0109 0110 emitFinished(); 0111 }