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

0001 /*
0002  * This file is part of LibKGAPI library
0003  *
0004  * SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #include "drivesmodifyjob.h"
0010 #include "debug.h"
0011 #include "drives.h"
0012 #include "driveservice.h"
0013 #include "utils.h"
0014 
0015 #include <QNetworkReply>
0016 #include <QNetworkRequest>
0017 #include <QUrlQuery>
0018 
0019 namespace
0020 {
0021 static const QString UseDomainAdminAccessAttr = QStringLiteral("useDomainAdminAccess");
0022 }
0023 using namespace KGAPI2;
0024 using namespace KGAPI2::Drive;
0025 
0026 class Q_DECL_HIDDEN DrivesModifyJob::Private
0027 {
0028 public:
0029     Private(DrivesModifyJob *parent);
0030     void processNext();
0031 
0032     bool useDomainAdminAccess = false;
0033 
0034     DrivesList drives;
0035 
0036 private:
0037     DrivesModifyJob *const q;
0038 };
0039 
0040 DrivesModifyJob::Private::Private(DrivesModifyJob *parent)
0041     : q(parent)
0042 {
0043 }
0044 
0045 void DrivesModifyJob::setUseDomainAdminAccess(bool useDomainAdminAccess)
0046 {
0047     if (isRunning()) {
0048         qCWarning(KGAPIDebug) << "Can't modify useDomainAdminAccess property when job is running";
0049         return;
0050     }
0051 
0052     d->useDomainAdminAccess = useDomainAdminAccess;
0053 }
0054 
0055 bool DrivesModifyJob::useDomainAdminAccess() const
0056 {
0057     return d->useDomainAdminAccess;
0058 }
0059 
0060 void DrivesModifyJob::Private::processNext()
0061 {
0062     if (drives.isEmpty()) {
0063         q->emitFinished();
0064         return;
0065     }
0066 
0067     const DrivesPtr drive = drives.takeFirst();
0068     QUrl url = DriveService::fetchDrivesUrl(drive->id());
0069 
0070     QUrlQuery query(url);
0071     if (useDomainAdminAccess != false) {
0072         query.addQueryItem(UseDomainAdminAccessAttr, Utils::bool2Str(useDomainAdminAccess));
0073     }
0074     url.setQuery(query);
0075 
0076     QNetworkRequest request(url);
0077 
0078     const QByteArray rawData = Drives::toJSON(drive);
0079     q->enqueueRequest(request, rawData, QStringLiteral("application/json"));
0080 }
0081 
0082 DrivesModifyJob::DrivesModifyJob(const DrivesPtr &drive, const AccountPtr &account, QObject *parent)
0083     : ModifyJob(account, parent)
0084     , d(new Private(this))
0085 {
0086     d->drives << drive;
0087 }
0088 
0089 DrivesModifyJob::DrivesModifyJob(const DrivesList &drives, const AccountPtr &account, QObject *parent)
0090     : ModifyJob(account, parent)
0091     , d(new Private(this))
0092 {
0093     d->drives << drives;
0094 }
0095 
0096 DrivesModifyJob::~DrivesModifyJob() = default;
0097 
0098 void DrivesModifyJob::start()
0099 {
0100     d->processNext();
0101 }
0102 
0103 ObjectsList DrivesModifyJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0104 {
0105     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0106     ContentType ct = Utils::stringToContentType(contentType);
0107     ObjectsList items;
0108     if (ct == KGAPI2::JSON) {
0109         items << Drives::fromJSON(rawData);
0110     } else {
0111         setError(KGAPI2::InvalidResponse);
0112         setErrorString(tr("Invalid response content type"));
0113         emitFinished();
0114         return items;
0115     }
0116 
0117     // Enqueue next item or finish
0118     d->processNext();
0119 
0120     return items;
0121 }
0122 
0123 #include "moc_drivesmodifyjob.cpp"