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

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 "childreferencecreatejob.h"
0010 #include "childreference.h"
0011 #include "driveservice.h"
0012 #include "utils.h"
0013 
0014 #include <QNetworkReply>
0015 #include <QNetworkRequest>
0016 #include <QUrlQuery>
0017 
0018 using namespace KGAPI2;
0019 using namespace KGAPI2::Drive;
0020 
0021 class Q_DECL_HIDDEN ChildReferenceCreateJob::Private
0022 {
0023 public:
0024     Private(ChildReferenceCreateJob *parent);
0025     void processNext();
0026 
0027     QString folderId;
0028     ChildReferencesList references;
0029     bool supportsAllDrives = true;
0030 
0031 private:
0032     ChildReferenceCreateJob *const q;
0033 };
0034 
0035 ChildReferenceCreateJob::Private::Private(ChildReferenceCreateJob *parent)
0036     : q(parent)
0037 {
0038 }
0039 
0040 void ChildReferenceCreateJob::Private::processNext()
0041 {
0042     if (references.isEmpty()) {
0043         q->emitFinished();
0044         return;
0045     }
0046 
0047     const ChildReferencePtr reference = references.takeFirst();
0048     QUrl url = DriveService::createChildReference(folderId);
0049 
0050     QUrlQuery withDriveSupportQuery(url);
0051     withDriveSupportQuery.addQueryItem(QStringLiteral("supportsAllDrives"), Utils::bool2Str(supportsAllDrives));
0052     url.setQuery(withDriveSupportQuery);
0053 
0054     QNetworkRequest request(url);
0055 
0056     const QByteArray rawData = ChildReference::toJSON(reference);
0057     q->enqueueRequest(request, rawData, QStringLiteral("application/json"));
0058 }
0059 
0060 ChildReferenceCreateJob::ChildReferenceCreateJob(const QString &folderId, const QString &childId, const AccountPtr &account, QObject *parent)
0061     : CreateJob(account, parent)
0062     , d(new Private(this))
0063 {
0064     d->folderId = folderId;
0065     d->references << ChildReferencePtr(new ChildReference(childId));
0066 }
0067 
0068 ChildReferenceCreateJob::ChildReferenceCreateJob(const QString &folderId, const QStringList &childrenIds, const AccountPtr &account, QObject *parent)
0069     : CreateJob(account, parent)
0070     , d(new Private(this))
0071 {
0072     d->folderId = folderId;
0073     for (const QString &childId : std::as_const(childrenIds)) {
0074         d->references << ChildReferencePtr(new ChildReference(childId));
0075     }
0076 }
0077 
0078 ChildReferenceCreateJob::ChildReferenceCreateJob(const QString &folderId, const ChildReferencePtr &reference, const AccountPtr &account, QObject *parent)
0079     : CreateJob(account, parent)
0080     , d(new Private(this))
0081 {
0082     d->folderId = folderId;
0083     d->references << reference;
0084 }
0085 
0086 ChildReferenceCreateJob::ChildReferenceCreateJob(const QString &folderId, const ChildReferencesList &references, const AccountPtr &account, QObject *parent)
0087     : CreateJob(account, parent)
0088     , d(new Private(this))
0089 {
0090     d->folderId = folderId;
0091     d->references << references;
0092 }
0093 
0094 ChildReferenceCreateJob::~ChildReferenceCreateJob()
0095 {
0096     delete d;
0097 }
0098 
0099 bool ChildReferenceCreateJob::supportsAllDrives() const
0100 {
0101     return d->supportsAllDrives;
0102 }
0103 
0104 void ChildReferenceCreateJob::setSupportsAllDrives(bool supportsAllDrives)
0105 {
0106     d->supportsAllDrives = supportsAllDrives;
0107 }
0108 
0109 void ChildReferenceCreateJob::start()
0110 {
0111     d->processNext();
0112 }
0113 
0114 ObjectsList ChildReferenceCreateJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0115 {
0116     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0117     ContentType ct = Utils::stringToContentType(contentType);
0118     ObjectsList items;
0119     if (ct == KGAPI2::JSON) {
0120         items << ChildReference::fromJSON(rawData);
0121     } else {
0122         setError(KGAPI2::InvalidResponse);
0123         setErrorString(tr("Invalid response content type"));
0124         emitFinished();
0125     }
0126 
0127     // Enqueue next item or finish
0128     d->processNext();
0129 
0130     return items;
0131 }
0132 
0133 #include "moc_childreferencecreatejob.cpp"