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

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 #include "filecopyjob.h"
0009 #include "driveservice.h"
0010 #include "file.h"
0011 #include "utils.h"
0012 
0013 #include <QNetworkReply>
0014 #include <QNetworkRequest>
0015 
0016 using namespace KGAPI2;
0017 using namespace KGAPI2::Drive;
0018 
0019 class Q_DECL_HIDDEN FileCopyJob::Private
0020 {
0021 public:
0022     Private(FileCopyJob *parent);
0023     void processNext();
0024 
0025     QMap<QString, FilePtr> files;
0026 
0027     QList<FilePtr> copies;
0028 
0029 private:
0030     FileCopyJob *const q;
0031 };
0032 
0033 FileCopyJob::Private::Private(FileCopyJob *parent)
0034     : q(parent)
0035 {
0036 }
0037 
0038 void FileCopyJob::Private::processNext()
0039 {
0040     if (files.isEmpty()) {
0041         q->emitFinished();
0042         return;
0043     }
0044 
0045     const QString fileId = files.cbegin().key();
0046     const FilePtr file = files.take(fileId);
0047 
0048     QUrl url = DriveService::copyFileUrl(fileId);
0049     q->updateUrl(url);
0050 
0051     QNetworkRequest request(url);
0052 
0053     const QByteArray rawData = File::toJSON(file);
0054 
0055     q->enqueueRequest(request, rawData, QStringLiteral("application/json"));
0056 }
0057 
0058 FileCopyJob::FileCopyJob(const QString &sourceFileId, const FilePtr &destinationFile, const AccountPtr &account, QObject *parent)
0059     : FileAbstractDataJob(account, parent)
0060     , d(new Private(this))
0061 {
0062     d->files.insert(sourceFileId, destinationFile);
0063 }
0064 
0065 FileCopyJob::FileCopyJob(const FilePtr &sourceFile, const FilePtr &destinationFile, const AccountPtr &account, QObject *parent)
0066     : FileAbstractDataJob(account, parent)
0067     , d(new Private(this))
0068 {
0069     d->files.insert(sourceFile->id(), destinationFile);
0070 }
0071 
0072 FileCopyJob::FileCopyJob(const QMap<QString, FilePtr> &files, const AccountPtr &account, QObject *parent)
0073     : FileAbstractDataJob(account, parent)
0074     , d(new Private(this))
0075 {
0076     d->files = files;
0077 }
0078 
0079 FileCopyJob::FileCopyJob(const QMap<FilePtr, FilePtr> &files, const AccountPtr &account, QObject *parent)
0080     : FileAbstractDataJob(account, parent)
0081     , d(new Private(this))
0082 {
0083     QMap<FilePtr, FilePtr>::ConstIterator iter = files.constBegin();
0084     QMap<FilePtr, FilePtr>::ConstIterator iterEnd = files.constEnd();
0085     for (; iter != iterEnd; ++iter) {
0086         d->files.insert(iter.key()->id(), iter.value());
0087     }
0088 }
0089 
0090 FileCopyJob::~FileCopyJob()
0091 {
0092     delete d;
0093 }
0094 
0095 FilesList FileCopyJob::files() const
0096 {
0097     return d->copies;
0098 }
0099 
0100 void FileCopyJob::start()
0101 {
0102     d->processNext();
0103 }
0104 
0105 void FileCopyJob::dispatchRequest(QNetworkAccessManager *accessManager, const QNetworkRequest &request, const QByteArray &data, const QString &contentType)
0106 {
0107     QNetworkRequest r = request;
0108     r.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
0109 
0110     accessManager->post(r, data);
0111 }
0112 
0113 void FileCopyJob::handleReply(const QNetworkReply *reply, const QByteArray &rawData)
0114 {
0115     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0116     ContentType ct = Utils::stringToContentType(contentType);
0117     if (ct == KGAPI2::JSON) {
0118         d->copies << File::fromJSON(rawData);
0119     } else {
0120         setError(KGAPI2::InvalidResponse);
0121         setErrorString(tr("Invalid response content type"));
0122         emitFinished();
0123         return;
0124     }
0125 
0126     // Enqueue next item or finish
0127     d->processNext();
0128 }
0129 
0130 #include "moc_filecopyjob.cpp"