File indexing completed on 2024-05-05 17:00:21

0001 /*
0002    SPDX-FileCopyrightText: 2018-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "downloadfilejob.h"
0008 #include "rocketchatqtrestapi_debug.h"
0009 #include <QDir>
0010 #include <QFile>
0011 #include <QFileInfo>
0012 #include <QNetworkReply>
0013 
0014 using namespace RocketChatRestApi;
0015 
0016 DownloadFileJob::DownloadFileJob(QObject *parent)
0017     : RestApiAbstractJob(parent)
0018 {
0019 }
0020 
0021 DownloadFileJob::~DownloadFileJob() = default;
0022 
0023 bool DownloadFileJob::start()
0024 {
0025     if (!canStart()) {
0026         deleteLater();
0027         return false;
0028     }
0029 
0030     mReply = networkAccessManager()->get(request());
0031     addStartRestApiInfo("DownloadFileJob: url:" + mUrl.toEncoded() + " mimetype " + mMimeType + " saveAs " + mLocalFileUrl.toEncoded());
0032     connect(mReply.data(), &QNetworkReply::finished, this, &DownloadFileJob::slotDownloadDone);
0033     return true;
0034 }
0035 
0036 void DownloadFileJob::slotDownloadDone()
0037 {
0038     auto reply = mReply;
0039     if (reply) {
0040         const QByteArray data = reply->readAll();
0041         const int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
0042         if (status == 200) {
0043             addLoggerInfo("DownloadFileJob::slotDownloadDone finished");
0044 
0045             // Split between image/video/audio
0046             const QString newFilePath = mLocalFileUrl.toLocalFile();
0047             QFileInfo(newFilePath).absoluteDir().mkpath(QStringLiteral("."));
0048             QFile file(newFilePath);
0049             if (file.open(QIODevice::ReadWrite)) {
0050                 file.write(data);
0051                 file.close();
0052             } else {
0053                 qCWarning(ROCKETCHATQTRESTAPI_LOG) << " Error !" << file.errorString();
0054             }
0055             Q_EMIT downloadFileDone(reply->url(), mLocalFileUrl);
0056         } else {
0057             // FIXME
0058             // emitFailedMessage(replyObject, reply);
0059             addLoggerWarning(QByteArrayLiteral("DownloadFileJob problem data: [") + data + "] :END");
0060         }
0061         reply->deleteLater();
0062     }
0063     deleteLater();
0064 }
0065 
0066 bool DownloadFileJob::requiredAuthentication() const
0067 {
0068     return mRequiredAuthentication;
0069 }
0070 
0071 void DownloadFileJob::setRequiredAuthentication(bool newRequiredAuthentication)
0072 {
0073     mRequiredAuthentication = newRequiredAuthentication;
0074 }
0075 
0076 QNetworkRequest DownloadFileJob::request() const
0077 {
0078     QNetworkRequest req(mUrl);
0079     addAuthRawHeader(req);
0080     req.setHeader(QNetworkRequest::ContentTypeHeader, mMimeType);
0081     req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
0082     req.setAttribute(QNetworkRequest::Http2AllowedAttribute, true);
0083     return req;
0084 }
0085 
0086 QUrl DownloadFileJob::localFileUrl() const
0087 {
0088     return mLocalFileUrl;
0089 }
0090 
0091 void DownloadFileJob::setLocalFileUrl(const QUrl &localFileUrl)
0092 {
0093     mLocalFileUrl = localFileUrl;
0094 }
0095 
0096 bool DownloadFileJob::requireHttpAuthentication() const
0097 {
0098     return mRequiredAuthentication;
0099 }
0100 
0101 bool DownloadFileJob::canStart() const
0102 {
0103     if (!RestApiAbstractJob::canStart()) {
0104         return false;
0105     }
0106     if (!mUrl.isValid()) {
0107         qCWarning(ROCKETCHATQTRESTAPI_LOG) << "DownloadFileJob: url is not valid: " << mUrl.toString();
0108         return false;
0109     }
0110     return true;
0111 }
0112 
0113 QUrl DownloadFileJob::url() const
0114 {
0115     return mUrl;
0116 }
0117 
0118 void DownloadFileJob::setUrl(const QUrl &url)
0119 {
0120     mUrl = url;
0121 }
0122 
0123 QByteArray DownloadFileJob::mimeType() const
0124 {
0125     return mMimeType;
0126 }
0127 
0128 void DownloadFileJob::setMimeType(const QByteArray &mimeType)
0129 {
0130     mMimeType = mimeType;
0131 }
0132 
0133 #include "moc_downloadfilejob.cpp"