File indexing completed on 2024-04-14 14:08:54

0001 /*
0002     SPDX-FileCopyrightText: 2016 Jasem Mutlaq <mutlaqja@ikarustech.com>
0003 
0004     Adapted from https://wiki.qt.io/Download_Data_from_URL
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #pragma once
0010 
0011 #include <QByteArray>
0012 #include <QFile>
0013 #include <QNetworkAccessManager>
0014 #include <QNetworkRequest>
0015 #include <QNetworkReply>
0016 #include <QObject>
0017 #include <QTemporaryFile>
0018 
0019 #include <functional>
0020 
0021 class QProgressDialog;
0022 
0023 class FileDownloader : public QObject
0024 {
0025     Q_OBJECT
0026   public:
0027     explicit FileDownloader(QObject *parent = nullptr);
0028     ~FileDownloader() override = default;
0029 
0030     void get(const QUrl &fileUrl);
0031     void post(const QUrl &fileUrl, QByteArray &data);
0032     void post(const QUrl &fileUrl, QHttpMultiPart *parts);
0033 
0034     QByteArray downloadedData() const;
0035 
0036     QUrl getDownloadedFileURL() const;
0037     bool setDownloadedFileURL(const QUrl &DownloadedFile);
0038 
0039     void setProgressDialogEnabled(bool ShowProgressDialog, const QString &textTitle = QString(),
0040                                   const QString &textLabel = QString());
0041 
0042     // Callbacks to verify data before being accepted
0043     void registerDataVerification(std::function<bool(const QByteArray &data)> verifyFunc) { m_verifyData = verifyFunc; }
0044     void registerFileVerification(std::function<bool(const QString &filename)> verifyFile){ m_verifyFile = verifyFile; }
0045 
0046   signals:
0047     void downloaded();
0048     void canceled();
0049     void error(const QString &errorString);
0050     void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
0051 
0052   private slots:
0053     void dataFinished(QNetworkReply *pReply);
0054     void dataReady();
0055     void slotError();
0056     void setDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
0057 
0058   private:
0059     QNetworkAccessManager m_WebCtrl;
0060     QByteArray m_DownloadedData;
0061 
0062     // Downloaded file
0063     QUrl m_DownloadedFileURL;
0064 
0065     // Temporary file used until download is successful
0066     QTemporaryFile m_downloadTemporaryFile;
0067 
0068     // Network reply
0069     QNetworkReply *m_Reply { nullptr };
0070 
0071     // Optional Progress dialog
0072     bool m_ShowProgressDialog { false };
0073 
0074 #ifndef KSTARS_LITE
0075     QProgressDialog *progressDialog { nullptr };
0076 #endif
0077     bool isCancelled { false };
0078     QString label;
0079     QString title;
0080 
0081     std::function<bool(const QByteArray &data)> m_verifyData;
0082     std::function<bool(const QString &filename)> m_verifyFile;
0083 };