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 }