1 /*
2  * This file is part of LibKGAPI library
3  *
4  * SPDX-FileCopyrightText: 2013 Daniel Vrátil <dvratil@redhat.com>
5  *
6  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7  */
8 
9 #include "eventmovejob.h"
10 #include "account.h"
11 #include "calendarservice.h"
12 #include "../debug.h"
13 #include "event.h"
14 #include "utils.h"
15 #include "private/queuehelper_p.h"
16 
17 #include <QNetworkRequest>
18 #include <QNetworkReply>
19 
20 
21 using namespace KGAPI2;
22 
23 class Q_DECL_HIDDEN EventMoveJob::Private
24 {
25 public:
26     QueueHelper<QString> eventsIds;
27     QString source;
28     QString destination;
29 };
30 
EventMoveJob(const EventPtr & event,const QString & sourceCalendarId,const QString & destinationCalendarId,const AccountPtr & account,QObject * parent)31 EventMoveJob::EventMoveJob(const EventPtr &event, const QString &sourceCalendarId,
32                            const QString &destinationCalendarId, const AccountPtr &account,
33                            QObject *parent):
34     ModifyJob(account, parent),
35     d(new Private())
36 {
37     d->eventsIds << event->id();
38     d->source = sourceCalendarId;
39     d->destination = destinationCalendarId;
40 }
41 
EventMoveJob(const EventsList & events,const QString & sourceCalendarId,const QString & destinationCalendarId,const AccountPtr & account,QObject * parent)42 EventMoveJob::EventMoveJob(const EventsList &events, const QString &sourceCalendarId,
43                            const QString &destinationCalendarId, const AccountPtr &account,
44                            QObject *parent):
45     ModifyJob(account, parent),
46     d(new Private())
47 {
48     for (const EventPtr &event : events) {
49         d->eventsIds << event->id();
50     }
51     d->source = sourceCalendarId;
52     d->destination = destinationCalendarId;
53 }
54 
EventMoveJob(const QString & eventId,const QString & sourceCalendarId,const QString & destinationCalendarId,const AccountPtr & account,QObject * parent)55 EventMoveJob::EventMoveJob(const QString &eventId, const QString &sourceCalendarId,
56                            const QString &destinationCalendarId, const AccountPtr &account,
57                            QObject *parent):
58     ModifyJob(account, parent),
59     d(new Private())
60 {
61     d->eventsIds << eventId;
62     d->source = sourceCalendarId;
63     d->destination = destinationCalendarId;
64 }
65 
EventMoveJob(const QStringList & eventsIds,const QString & sourceCalendarId,const QString & destinationCalendarId,const AccountPtr & account,QObject * parent)66 EventMoveJob::EventMoveJob(const QStringList &eventsIds, const QString &sourceCalendarId,
67                            const QString &destinationCalendarId, const AccountPtr &account,
68                            QObject *parent):
69     ModifyJob(account, parent),
70     d(new Private())
71 {
72     d->eventsIds = eventsIds;
73     d->source = sourceCalendarId;
74     d->destination = destinationCalendarId;
75 }
76 
77 EventMoveJob::~EventMoveJob() = default;
78 
start()79 void EventMoveJob::start()
80 {
81     if (d->eventsIds.atEnd()) {
82         emitFinished();
83         return;
84     }
85 
86     const QString eventId = d->eventsIds.current();
87     const auto request = CalendarService::prepareRequest(CalendarService::moveEventUrl(d->source, d->destination, eventId));
88 
89     enqueueRequest(request);
90 }
91 
dispatchRequest(QNetworkAccessManager * accessManager,const QNetworkRequest & request,const QByteArray & data,const QString & contentType)92 void EventMoveJob::dispatchRequest(QNetworkAccessManager *accessManager, const QNetworkRequest &request, const QByteArray &data, const QString &contentType)
93 {
94     Q_UNUSED(data)
95     Q_UNUSED(contentType)
96 
97     accessManager->post(request, QByteArray());
98 }
99 
handleReplyWithItems(const QNetworkReply * reply,const QByteArray & rawData)100 KGAPI2::ObjectsList EventMoveJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
101 {
102     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
103     ContentType ct = Utils::stringToContentType(contentType);
104     ObjectsList items;
105     if (ct != KGAPI2::JSON) {
106         setError(KGAPI2::InvalidResponse);
107         setErrorString(tr("Invalid response content type"));
108         emitFinished();
109         return items;
110     }
111 
112     items << CalendarService::JSONToEvent(rawData).dynamicCast<Event>();
113     d->eventsIds.currentProcessed();
114     // Enqueue next item or finish
115     start();
116 
117     return items;
118 }
119 
120 
121 
122