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

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