File indexing completed on 2024-05-12 05:22:13

0001 /*
0002  * This file is part of LibKGAPI library
0003  *
0004  * SPDX-FileCopyrightText: 2013 Daniel Vrátil <dvratil@redhat.com>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #include "eventcreatejob.h"
0010 #include "account.h"
0011 #include "calendarservice.h"
0012 #include "event.h"
0013 #include "private/queuehelper_p.h"
0014 #include "utils.h"
0015 
0016 #include <QNetworkReply>
0017 #include <QNetworkRequest>
0018 
0019 using namespace KGAPI2;
0020 
0021 class Q_DECL_HIDDEN EventCreateJob::Private
0022 {
0023 public:
0024     QueueHelper<EventPtr> events;
0025     QString calendarId;
0026     SendUpdatesPolicy updatesPolicy = SendUpdatesPolicy::All;
0027 };
0028 
0029 EventCreateJob::EventCreateJob(const EventPtr &event, const QString &calendarId, const AccountPtr &account, QObject *parent)
0030     : CreateJob(account, parent)
0031     , d(new Private)
0032 {
0033     d->events << event;
0034     d->calendarId = calendarId;
0035 }
0036 
0037 EventCreateJob::EventCreateJob(const EventsList &events, const QString &calendarId, const AccountPtr &account, QObject *parent)
0038     : CreateJob(account, parent)
0039     , d(new Private)
0040 {
0041     d->events = events;
0042     d->calendarId = calendarId;
0043 }
0044 
0045 EventCreateJob::~EventCreateJob() = default;
0046 
0047 void EventCreateJob::setSendUpdates(SendUpdatesPolicy policy)
0048 {
0049     if (d->updatesPolicy != policy) {
0050         d->updatesPolicy = policy;
0051         Q_EMIT sendUpdatesChanged(d->updatesPolicy);
0052     }
0053 }
0054 
0055 SendUpdatesPolicy EventCreateJob::sendUpdates() const
0056 {
0057     return d->updatesPolicy;
0058 }
0059 
0060 void EventCreateJob::start()
0061 {
0062     if (d->events.atEnd()) {
0063         emitFinished();
0064         return;
0065     }
0066 
0067     const EventPtr event = d->events.current();
0068     QUrl requestUrl;
0069 
0070     // If the organizer is different from the account name, import a private copy of the event in the user's calendar,
0071     // or normally create it otherwise.  This prevents that Google Calendar creates a copy event when accepting invitations
0072     // to events created by others.
0073     if (!event->attendees().isEmpty() && !event->organizer().isEmpty() && event->organizer().email() != this->account()->accountName()) {
0074         requestUrl = CalendarService::importEventUrl(d->calendarId, d->updatesPolicy);
0075     } else {
0076         requestUrl = CalendarService::createEventUrl(d->calendarId, d->updatesPolicy);
0077     }
0078 
0079     const auto request = CalendarService::prepareRequest(requestUrl);
0080     const QByteArray rawData = CalendarService::eventToJSON(event, CalendarService::EventSerializeFlag::NoID);
0081 
0082     enqueueRequest(request, rawData, QStringLiteral("application/json"));
0083 }
0084 
0085 ObjectsList EventCreateJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0086 {
0087     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0088     ContentType ct = Utils::stringToContentType(contentType);
0089     ObjectsList items;
0090     if (ct != KGAPI2::JSON) {
0091         setError(KGAPI2::InvalidResponse);
0092         setErrorString(tr("Invalid response content type"));
0093         emitFinished();
0094         return items;
0095     }
0096 
0097     items << CalendarService::JSONToEvent(rawData).dynamicCast<Object>();
0098     d->events.currentProcessed();
0099     // Enqueue next item or finish
0100     start();
0101 
0102     return items;
0103 }