QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCFileDownload.h
Go to the documentation of this file.
1#pragma once
2
5
6#include "QGCNetworkHelper.h"
7
8#include <QtCore/QObject>
9#include <QtCore/QUrl>
10#include <QtNetwork/QNetworkReply>
11#include <QtNetwork/QNetworkRequest>
12
13class QNetworkAccessManager;
14class QAbstractNetworkCache;
16class QFile;
17
60class QGCFileDownload : public QObject
61{
62 Q_OBJECT
63 Q_DISABLE_COPY_MOVE(QGCFileDownload)
64
65
66 Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged FINAL)
67
68
69 Q_PROPERTY(bool running READ isRunning NOTIFY runningChanged FINAL)
70
71
72 Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged FINAL)
73
74
75 Q_PROPERTY(QUrl url READ url NOTIFY urlChanged FINAL)
76
77
78 Q_PROPERTY(QString localPath READ localPath NOTIFY localPathChanged FINAL)
79
80
81 Q_PROPERTY(qint64 totalBytes READ totalBytes NOTIFY totalBytesChanged FINAL)
82
83
84 Q_PROPERTY(qint64 bytesReceived READ bytesReceived NOTIFY bytesReceivedChanged FINAL)
85
86
87 Q_PROPERTY(bool autoDecompress READ autoDecompress WRITE setAutoDecompress NOTIFY autoDecompressChanged FINAL)
88
89
90 Q_PROPERTY(QString outputPath READ outputPath WRITE setOutputPath NOTIFY outputPathChanged FINAL)
91
92
93 Q_PROPERTY(QString expectedHash READ expectedHash WRITE setExpectedHash NOTIFY expectedHashChanged FINAL)
94
95public:
97 enum class State {
98 Idle,
101 Verifying,
102 Completed,
103 Failed,
104 Cancelled
105 };
106 Q_ENUM(State)
107
108 explicit QGCFileDownload(QObject *parent = nullptr);
109 ~QGCFileDownload() override;
110
111 // Property getters
112 qreal progress() const { return _progress; }
113 bool isRunning() const {
114 return _state == State::Downloading || _state == State::Decompressing
115 || _state == State::Verifying;
116 }
117 QString errorString() const { return _errorString; }
118 QUrl url() const { return _url; }
119 QString localPath() const { return _localPath; }
120 qint64 totalBytes() const { return _totalBytes; }
121 qint64 bytesReceived() const { return _bytesReceived; }
122 bool autoDecompress() const { return _autoDecompress; }
123 QString outputPath() const { return _outputPath; }
124 QString expectedHash() const { return _expectedHash; }
125 State state() const { return _state; }
126 bool lastResultFromCache() const { return _lastResultFromCache; }
127
128 // Property setters
129 void setAutoDecompress(bool enabled);
130 void setOutputPath(const QString &path);
131 void setExpectedHash(const QString &hash);
132
134 void setCache(QAbstractNetworkCache *cache);
135
137 void setTimeout(int timeoutMs);
138
140 QNetworkAccessManager *networkManager() const { return _networkManager; }
141
142public slots:
146 bool start(const QString &remoteUrl);
147
152 bool start(const QString &remoteUrl, const QGCNetworkHelper::RequestConfig &config);
153
155 void cancel();
156
157signals:
160
162 void runningChanged(bool running);
163
165 void errorStringChanged(const QString &errorString);
166
168 void urlChanged(const QUrl &url);
169
171 void localPathChanged(const QString &localPath);
172
175
178
181
183 void outputPathChanged(const QString &outputPath);
184
186 void expectedHashChanged(const QString &expectedHash);
187
190
195 void finished(bool success, const QString &localPath, const QString &errorMessage);
196
199
202
203private slots:
204 void _onDownloadProgress(qint64 bytesReceived, qint64 totalBytes);
205 void _onDownloadFinished();
206 void _onDownloadError(QNetworkReply::NetworkError code);
207 void _onDecompressionFinished(bool success);
208 void _onReadyRead();
209
210private:
211 void _setState(State newState);
212 void _setProgress(qreal progress);
213 void _setErrorString(const QString &error);
214 void _cleanup();
215 void _emitFinished(bool success, const QString &localPath, const QString &errorMessage);
216 bool _writeReplyData(const QByteArray &data);
217 bool _failForWriteError(const QString &context);
218 QString _generateOutputPath(const QString &remoteUrl) const;
219 bool _verifyHash();
220 void _startDecompression();
221
222 QNetworkAccessManager *_networkManager = nullptr;
223 QNetworkReply *_currentReply = nullptr;
224 QGCCompressionJob *_decompressionJob = nullptr;
225 QFile *_outputFile = nullptr;
226
227 QUrl _url;
228 QString _localPath;
229 QString _outputPath;
230 QString _expectedHash;
231 QString _errorString;
232 QString _compressedFilePath;
233
234 qreal _progress = 0.0;
235 qint64 _totalBytes = -1;
236 qint64 _bytesReceived = 0;
238
239 State _state = State::Idle;
240 bool _autoDecompress = false;
241 bool _finishEmitted = false;
242 bool _lastResultFromCache = false;
243};
Error error
QObject wrapper for compression operations with progress signals.
File download with progress, decompression, and hash verification.
State
Current download progress (0.0 to 1.0)
@ Completed
Download completed successfully.
@ Verifying
Verifying file hash.
@ Cancelled
Download was cancelled.
@ Decompressing
Decompressing downloaded file.
@ Downloading
Actively downloading.
@ Failed
Download failed.
@ Idle
No download in progress.
void setTimeout(int timeoutMs)
Set request timeout in milliseconds.
void finished(bool success, const QString &localPath, const QString &errorMessage)
void setExpectedHash(const QString &hash)
void localPathChanged(const QString &localPath)
Emitted when local path changes.
void runningChanged(bool running)
Emitted when running state changes.
bool autoDecompress() const
void totalBytesChanged(qint64 totalBytes)
Emitted when total bytes changes.
qint64 totalBytes() const
void stateChanged(State state)
Emitted when state changes.
void autoDecompressChanged(bool autoDecompress)
Emitted when auto-decompress setting changes.
QString localPath() const
qint64 bytesReceived() const
bool start(const QString &remoteUrl)
void setCache(QAbstractNetworkCache *cache)
Set network cache for downloads.
State state() const
bool isRunning() const
void bytesReceivedChanged(qint64 bytesReceived)
Emitted when bytes received changes.
void errorStringChanged(const QString &errorString)
Emitted when error string changes.
QNetworkAccessManager * networkManager() const
Get the network access manager (for advanced configuration)
QString outputPath() const
void setOutputPath(const QString &path)
QString errorString() const
void setAutoDecompress(bool enabled)
QString expectedHash() const
void cancel()
Cancel current download.
void progressChanged(qreal progress)
Emitted when download progress changes.
void expectedHashChanged(const QString &expectedHash)
Emitted when expected hash setting changes.
void downloadProgress(qint64 bytesReceived, qint64 totalBytes)
Emitted during download with byte counts.
void outputPathChanged(const QString &outputPath)
Emitted when output path setting changes.
~QGCFileDownload() override
void urlChanged(const QUrl &url)
Emitted when URL changes.
void decompressionProgress(qreal progress)
Emitted during decompression (0.0 to 1.0)
qreal progress() const
bool lastResultFromCache() const
constexpr int kDefaultTimeoutMs
Default request timeout in milliseconds.
Common request configuration options.