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 "eventmovejob.h"
0010 #include "calendarservice.h"
0011 #include "event.h"
0012 #include "private/queuehelper_p.h"
0013 #include "utils.h"
0014 
0015 #include <QNetworkReply>
0016 #include <QNetworkRequest>
0017 
0018 using namespace KGAPI2;
0019 
0020 class Q_DECL_HIDDEN EventMoveJob::Private
0021 {
0022 public:
0023     QueueHelper<QString> eventsIds;
0024     QString source;
0025     QString destination;
0026 };
0027 
0028 EventMoveJob::EventMoveJob(const EventPtr &event,
0029                            const QString &sourceCalendarId,
0030                            const QString &destinationCalendarId,
0031                            const AccountPtr &account,
0032                            QObject *parent)
0033     : ModifyJob(account, parent)
0034     , d(new Private())
0035 {
0036     d->eventsIds << event->id();
0037     d->source = sourceCalendarId;
0038     d->destination = destinationCalendarId;
0039 }
0040 
0041 EventMoveJob::EventMoveJob(const EventsList &events,
0042                            const QString &sourceCalendarId,
0043                            const QString &destinationCalendarId,
0044                            const AccountPtr &account,
0045                            QObject *parent)
0046     : ModifyJob(account, parent)
0047     , d(new Private())
0048 {
0049     for (const EventPtr &event : events) {
0050         d->eventsIds << event->id();
0051     }
0052     d->source = sourceCalendarId;
0053     d->destination = destinationCalendarId;
0054 }
0055 
0056 EventMoveJob::EventMoveJob(const QString &eventId,
0057                            const QString &sourceCalendarId,
0058                            const QString &destinationCalendarId,
0059                            const AccountPtr &account,
0060                            QObject *parent)
0061     : ModifyJob(account, parent)
0062     , d(new Private())
0063 {
0064     d->eventsIds << eventId;
0065     d->source = sourceCalendarId;
0066     d->destination = destinationCalendarId;
0067 }
0068 
0069 EventMoveJob::EventMoveJob(const QStringList &eventsIds,
0070                            const QString &sourceCalendarId,
0071                            const QString &destinationCalendarId,
0072                            const AccountPtr &account,
0073                            QObject *parent)
0074     : ModifyJob(account, parent)
0075     , d(new Private())
0076 {
0077     d->eventsIds = eventsIds;
0078     d->source = sourceCalendarId;
0079     d->destination = destinationCalendarId;
0080 }
0081 
0082 EventMoveJob::~EventMoveJob() = default;
0083 
0084 void EventMoveJob::start()
0085 {
0086     if (d->eventsIds.atEnd()) {
0087         emitFinished();
0088         return;
0089     }
0090 
0091     const QString eventId = d->eventsIds.current();
0092     const auto request = CalendarService::prepareRequest(CalendarService::moveEventUrl(d->source, d->destination, eventId));
0093 
0094     enqueueRequest(request);
0095 }
0096 
0097 void EventMoveJob::dispatchRequest(QNetworkAccessManager *accessManager, const QNetworkRequest &request, const QByteArray &data, const QString &contentType)
0098 {
0099     Q_UNUSED(data)
0100     Q_UNUSED(contentType)
0101 
0102     accessManager->post(request, QByteArray());
0103 }
0104 
0105 KGAPI2::ObjectsList EventMoveJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0106 {
0107     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0108     ContentType ct = Utils::stringToContentType(contentType);
0109     ObjectsList items;
0110     if (ct != KGAPI2::JSON) {
0111         setError(KGAPI2::InvalidResponse);
0112         setErrorString(tr("Invalid response content type"));
0113         emitFinished();
0114         return items;
0115     }
0116 
0117     items << CalendarService::JSONToEvent(rawData).dynamicCast<Event>();
0118     d->eventsIds.currentProcessed();
0119     // Enqueue next item or finish
0120     start();
0121 
0122     return items;
0123 }