File indexing completed on 2024-05-12 16:01:54
0001 /* 0002 * SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 * 0006 */ 0007 #include "KisRemoteFileFetcher.h" 0008 0009 #include <QApplication> 0010 #include <QMessageBox> 0011 #include <QNetworkAccessManager> 0012 #include <QProgressDialog> 0013 0014 #include <klocalizedstring.h> 0015 0016 KisRemoteFileFetcher::KisRemoteFileFetcher(QObject *parent) 0017 : QObject(parent) 0018 , m_request(nullptr) 0019 , m_reply(nullptr) 0020 { 0021 } 0022 0023 KisRemoteFileFetcher::~KisRemoteFileFetcher() 0024 { 0025 delete m_request; 0026 delete m_reply; 0027 } 0028 0029 bool KisRemoteFileFetcher::fetchFile(const QUrl &remote, QIODevice *io) 0030 { 0031 Q_ASSERT(!remote.isLocalFile()); 0032 0033 { 0034 QMessageBox msgBox; 0035 msgBox.setWindowTitle(i18nc("@title:window", "Krita")); 0036 msgBox.setIcon(QMessageBox::Question); 0037 msgBox.setText( 0038 i18nc("Fetching remote image", "Do you want to download the image at %1?").arg(remote.toDisplayString())); 0039 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); 0040 msgBox.setDefaultButton(QMessageBox::No); 0041 const int res = msgBox.exec(); 0042 0043 if (res != QMessageBox::Yes) { 0044 return false; 0045 } 0046 } 0047 0048 QNetworkAccessManager manager(this); 0049 m_request = new QNetworkRequest(remote); 0050 m_request->setRawHeader("User-Agent", QString("Krita-%1").arg(qApp->applicationVersion()).toUtf8()); 0051 m_reply = manager.get(*m_request); 0052 0053 QLocale loc; 0054 0055 QProgressDialog progress; 0056 progress.setWindowTitle(i18nc("@title:window", "Krita")); 0057 progress.setLabelText(i18nc("Fetching remote image", "Downloading image from %1...").arg(remote.host())); 0058 progress.setMinimum(0); 0059 progress.setMaximum(0); 0060 progress.setWindowModality(Qt::ApplicationModal); 0061 progress.setWindowFlag(Qt::CustomizeWindowHint, true); 0062 progress.setWindowFlag(Qt::WindowCloseButtonHint, false); 0063 connect(m_reply, &QNetworkReply::finished, &progress, &QProgressDialog::accept); 0064 connect(m_reply, 0065 qOverload<QNetworkReply::NetworkError>(&QNetworkReply::error), 0066 &progress, 0067 &QProgressDialog::cancel); 0068 connect(m_reply, &QNetworkReply::downloadProgress, &progress, [&](const int ist, const int max) { 0069 progress.setMaximum(max); 0070 progress.setValue(ist); 0071 progress.setLabelText(i18nc("Fetching remote image", "Downloading image from %1... (%2 / %3)") 0072 .arg(remote.host()) 0073 .arg(loc.formattedDataSize(ist)) 0074 .arg(loc.formattedDataSize(max))); 0075 }); 0076 0077 connect(&progress, &QProgressDialog::canceled, m_reply, &QNetworkReply::abort); 0078 0079 progress.exec(); 0080 0081 // avoid double free on manager destruction 0082 m_reply->setParent(nullptr); 0083 0084 if (m_reply->error() != QNetworkReply::NoError) { 0085 QMessageBox msgBox; 0086 msgBox.setWindowTitle(i18nc("@title:window", "Krita")); 0087 msgBox.setIcon(QMessageBox::Critical); 0088 msgBox.setText(i18nc("Fetching remote image", "Could not download %1.").arg(remote.toDisplayString())); 0089 msgBox.setDetailedText(m_reply->errorString()); 0090 msgBox.setDefaultButton(QMessageBox::Ok); 0091 msgBox.exec(); 0092 return false; 0093 } 0094 0095 if (!io->isOpen()) { 0096 io->open(QIODevice::WriteOnly); 0097 } 0098 io->write(m_reply->readAll()); 0099 io->close(); 0100 0101 return true; 0102 } 0103 0104 void KisRemoteFileFetcher::error(QNetworkReply::NetworkError error) 0105 { 0106 Q_UNUSED(error); 0107 0108 qDebug() << "error" << m_reply->errorString(); 0109 }