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"