1 /*
2     SPDX-FileCopyrightText: 2016 Jasem Mutlaq <mutlaqja@ikarustech.com>
3 
4     Adapted from https://wiki.qt.io/Download_Data_from_URL
5 
6     SPDX-License-Identifier: GPL-2.0-or-later
7 */
8 
9 #pragma once
10 
11 #include <QByteArray>
12 #include <QFile>
13 #include <QNetworkAccessManager>
14 #include <QNetworkRequest>
15 #include <QNetworkReply>
16 #include <QObject>
17 #include <QTemporaryFile>
18 
19 #include <functional>
20 
21 class QProgressDialog;
22 
23 class FileDownloader : public QObject
24 {
25     Q_OBJECT
26   public:
27     explicit FileDownloader(QObject *parent = nullptr);
28     ~FileDownloader() override = default;
29 
30     void get(const QUrl &fileUrl);
31     void post(const QUrl &fileUrl, QByteArray &data);
32     void post(const QUrl &fileUrl, QHttpMultiPart *parts);
33 
34     QByteArray downloadedData() const;
35 
36     QUrl getDownloadedFileURL() const;
37     bool setDownloadedFileURL(const QUrl &DownloadedFile);
38 
39     void setProgressDialogEnabled(bool ShowProgressDialog, const QString &textTitle = QString(),
40                                   const QString &textLabel = QString());
41 
42     // Callbacks to verify data before being accepted
registerDataVerification(std::function<bool (const QByteArray & data)> verifyFunc)43     void registerDataVerification(std::function<bool(const QByteArray &data)> verifyFunc) { m_verifyData = verifyFunc; }
registerFileVerification(std::function<bool (const QString & filename)> verifyFile)44     void registerFileVerification(std::function<bool(const QString &filename)> verifyFile){ m_verifyFile = verifyFile; }
45 
46   signals:
47     void downloaded();
48     void canceled();
49     void error(const QString &errorString);
50     void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
51 
52   private slots:
53     void dataFinished(QNetworkReply *pReply);
54     void dataReady();
55     void slotError();
56     void setDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
57 
58   private:
59     QNetworkAccessManager m_WebCtrl;
60     QByteArray m_DownloadedData;
61 
62     // Downloaded file
63     QUrl m_DownloadedFileURL;
64 
65     // Temporary file used until download is successful
66     QTemporaryFile m_downloadTemporaryFile;
67 
68     // Network reply
69     QNetworkReply *m_Reply { nullptr };
70 
71     // Optional Progress dialog
72     bool m_ShowProgressDialog { false };
73 
74 #ifndef KSTARS_LITE
75     QProgressDialog *progressDialog { nullptr };
76 #endif
77     bool isCancelled { false };
78     QString label;
79     QString title;
80 
81     std::function<bool(const QByteArray &data)> m_verifyData;
82     std::function<bool(const QString &filename)> m_verifyFile;
83 };
84