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

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 "taskmodifyjob.h"
0010 #include "private/queuehelper_p.h"
0011 #include "task.h"
0012 #include "tasksservice.h"
0013 #include "utils.h"
0014 
0015 #include <QNetworkReply>
0016 #include <QNetworkRequest>
0017 
0018 using namespace KGAPI2;
0019 
0020 class Q_DECL_HIDDEN TaskModifyJob::Private
0021 {
0022 public:
0023     QueueHelper<TaskPtr> tasks;
0024     QString taskListId;
0025 };
0026 
0027 TaskModifyJob::TaskModifyJob(const TaskPtr &task, const QString &taskListId, const AccountPtr &account, QObject *parent)
0028     : ModifyJob(account, parent)
0029     , d(new Private)
0030 {
0031     d->tasks << task;
0032     d->taskListId = taskListId;
0033 }
0034 
0035 TaskModifyJob::TaskModifyJob(const TasksList &tasks, const QString &taskListId, const AccountPtr &account, QObject *parent)
0036     : ModifyJob(account, parent)
0037     , d(new Private)
0038 {
0039     d->tasks = tasks;
0040     d->taskListId = taskListId;
0041 }
0042 
0043 TaskModifyJob::~TaskModifyJob() = default;
0044 
0045 void TaskModifyJob::start()
0046 {
0047     if (d->tasks.atEnd()) {
0048         emitFinished();
0049         return;
0050     }
0051 
0052     const TaskPtr task = d->tasks.current();
0053     const QUrl url = TasksService::updateTaskUrl(d->taskListId, task->uid());
0054     QNetworkRequest request(url);
0055 
0056     const QByteArray rawData = TasksService::taskToJSON(task);
0057 
0058     QStringList headers;
0059     const auto rawHeaderList = request.rawHeaderList();
0060     headers.reserve(rawHeaderList.size());
0061     for (const QByteArray &str : std::as_const(rawHeaderList)) {
0062         headers << QLatin1StringView(str) + QLatin1StringView(": ") + QLatin1StringView(request.rawHeader(str));
0063     }
0064 
0065     enqueueRequest(request, rawData, QStringLiteral("application/json"));
0066 }
0067 
0068 ObjectsList TaskModifyJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0069 {
0070     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0071     ContentType ct = Utils::stringToContentType(contentType);
0072     ObjectsList items;
0073     if (ct != KGAPI2::JSON) {
0074         setError(KGAPI2::InvalidResponse);
0075         setErrorString(tr("Invalid response content type"));
0076         emitFinished();
0077         return items;
0078     }
0079 
0080     items << TasksService::JSONToTask(rawData).dynamicCast<Object>();
0081     d->tasks.currentProcessed();
0082     // Enqueue next item or finish
0083     start();
0084 
0085     return items;
0086 }
0087 
0088 #include "moc_taskmodifyjob.cpp"