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 }