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"