Qt Utilities 6.18.1
Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models
Loading...
Searching...
No Matches
updater.h
Go to the documentation of this file.
1#ifndef QT_UTILITIES_SETUP_UPDATER_H
2#define QT_UTILITIES_SETUP_UPDATER_H
3
4#include "../global.h"
5
6#ifdef QT_UTILITIES_GUI_QTWIDGETS
9#endif
10
11#include <c++utilities/chrono/datetime.h>
12#include <c++utilities/misc/flagenumclass.h>
13
14#include <QObject>
15#include <QUrl>
16
17#ifdef QT_UTILITIES_SETUP_TOOLS_ENABLED
18#include <QNetworkRequest>
19#endif
20#ifdef QT_UTILITIES_GUI_QTWIDGETS
21#include <QMessageBox>
22#endif
23
24#include <atomic>
25#include <memory>
26
27QT_FORWARD_DECLARE_CLASS(QJsonParseError)
28QT_FORWARD_DECLARE_CLASS(QJsonArray)
29QT_FORWARD_DECLARE_CLASS(QNetworkAccessManager)
30QT_FORWARD_DECLARE_CLASS(QNetworkReply)
31QT_FORWARD_DECLARE_CLASS(QSettings)
32
33namespace QtUtilities {
34
37struct UpdaterPrivate;
39struct UpdateOptionPagePrivate;
40struct UpdateDialogPrivate;
42
43enum class UpdateCheckFlags : quint64 {
44 None = 0,
46 IncludeDrafts = (1 << 1),
48};
49
50} // namespace QtUtilities
51
53
54namespace QtUtilities {
55
59class QT_UTILITIES_EXPORT UpdateNotifier : public QObject {
60 Q_OBJECT
61 Q_PROPERTY(bool supported READ isSupported)
62 Q_PROPERTY(bool inProgress READ isInProgress NOTIFY inProgressChanged)
63 Q_PROPERTY(bool updateAvailable READ isUpdateAvailable)
64 Q_PROPERTY(QString executableName READ executableName CONSTANT)
65 Q_PROPERTY(QString newVersion READ newVersion)
66 Q_PROPERTY(QString additionalInfo READ additionalInfo)
67 Q_PROPERTY(QString releaseNotes READ releaseNotes)
68 Q_PROPERTY(QString error READ error)
69 Q_PROPERTY(QUrl downloadUrl READ downloadUrl)
70 Q_PROPERTY(QUrl signatureUrl READ signatureUrl)
71
72public:
73 explicit UpdateNotifier(QObject *parent = nullptr);
74 ~UpdateNotifier() override;
75
76 bool isSupported() const;
77 bool isInProgress() const;
78 bool isUpdateAvailable() const;
79 UpdateCheckFlags flags() const;
81 const QString &executableName() const;
82 const QString &newVersion() const;
83 const QString &latestVersion() const;
84 const QString &additionalInfo() const;
85 const QString &releaseNotes() const;
86 const QString &error() const;
87 const QUrl &downloadUrl() const;
88 const QUrl &signatureUrl() const;
89 QString status() const;
90 CppUtilities::DateTime lastCheck() const;
91 void restore(QSettings *settings);
92 void save(QSettings *settings);
93 void setNetworkAccessManager(QNetworkAccessManager *nm);
94#ifdef QT_UTILITIES_SETUP_TOOLS_ENABLED
95 void setCacheLoadControl(QNetworkRequest::CacheLoadControl cacheLoadControl);
96#endif
97
98public Q_SLOTS:
99 void checkForUpdate();
100 void resetUpdateInfo();
101 void supplyNewReleaseData(const QByteArray &data);
102
103Q_SIGNALS:
106 void updateAvailable(const QString &version, const QString &additionalInfo);
107
108private Q_SLOTS:
109 void lastCheckNow() const;
110 void setError(const QString &context, QNetworkReply *reply);
111 void setError(const QString &context, const QJsonParseError &jsonError, const QByteArray &response);
112 void readReleases();
113 void queryRelease(const QUrl &releaseUrl);
114 void readRelease();
115 void processAssets(const QJsonArray &assets, bool forUpdate);
116
117private:
118 std::unique_ptr<UpdateNotifierPrivate> m_p;
119};
120
124class QT_UTILITIES_EXPORT Updater : public QObject {
125 Q_OBJECT
126 Q_PROPERTY(bool inProgress READ isInProgress NOTIFY inProgressChanged)
127 Q_PROPERTY(QString overallStatus READ overallStatus NOTIFY inProgressChanged)
128 Q_PROPERTY(QString error READ error NOTIFY updateStatusChanged)
129 Q_PROPERTY(QString statusMessage READ statusMessage NOTIFY updateStatusChanged)
130 Q_PROPERTY(QString storedPath READ storedPath NOTIFY inProgressChanged)
131
132public:
133 struct Update {
134 std::string_view executableName;
135 std::string_view signatureName;
136 std::string_view data;
137 std::string_view signature;
138 };
139 using VerifyFunction = std::function<QString(const Update &)>;
140
141 explicit Updater(const QString &executableName, QObject *parent = nullptr);
142 explicit Updater(const QString &executableName, const QString &signatureExtension, QObject *parent = nullptr);
143 ~Updater() override;
144
145 bool isInProgress() const;
146 QString overallStatus() const;
147 const QString &error() const;
148 const QString &statusMessage() const;
149 const QString &storedPath() const;
150 void setNetworkAccessManager(QNetworkAccessManager *nm);
151 void setVerifier(VerifyFunction &&verifyFunction);
152#ifdef QT_UTILITIES_SETUP_TOOLS_ENABLED
153 void setCacheLoadControl(QNetworkRequest::CacheLoadControl cacheLoadControl);
154#endif
155
156public Q_SLOTS:
157 bool performUpdate(const QString &downloadUrl, const QString &signatureUrl);
158 void abortUpdate();
159
160Q_SIGNALS:
162 void updateFailed(const QString &error);
164 void updatePercentageChanged(qint64 bytesReceived, qint64 bytesTotal);
165 void updateStatusChanged(const QString &statusMessage);
166
167private Q_SLOTS:
168 void setError(const QString &error);
169 void startDownload(const QString &downloadUrl, const QString &signatureUrl);
170 void handleDownloadFinished();
171 void readSignature();
172 void storeExecutable();
173 void concludeUpdate();
174
175private:
176 std::unique_ptr<UpdaterPrivate> m_p;
177};
178
182class QT_UTILITIES_EXPORT UpdateHandler : public QObject {
183 Q_OBJECT
184 Q_PROPERTY(UpdateNotifier *notifier READ notifier CONSTANT)
185 Q_PROPERTY(Updater *updater READ updater CONSTANT)
186
187public:
192 CppUtilities::TimeSpan duration;
194 bool enabled = true;
195 };
196
197 explicit UpdateHandler(QSettings *settings, QNetworkAccessManager *nm, QObject *parent = nullptr);
198 explicit UpdateHandler(
199 const QString &executableName, const QString &signatureExtension, QSettings *settings, QNetworkAccessManager *nm, QObject *parent = nullptr);
200 ~UpdateHandler() override;
201
204 const CheckInterval &checkInterval() const;
207 void setConsideringSeparateSignature(bool consideringSeparateSignature);
208 QString preCheck() const;
209 static UpdateHandler *mainInstance();
211#ifdef QT_UTILITIES_SETUP_TOOLS_ENABLED
212 void setCacheLoadControl(QNetworkRequest::CacheLoadControl cacheLoadControl);
213#endif
214
215public Q_SLOTS:
216 void applySettings();
217 void performUpdate();
218 void saveNotifierState();
219
220private Q_SLOTS:
221 void handleUpdateCheckDone();
222
223private:
224#ifdef QT_UTILITIES_SETUP_TOOLS_ENABLED
225 void scheduleNextUpdateCheck();
226#endif
227
228 std::unique_ptr<UpdateHandlerPrivate> m_p;
229 static UpdateHandler *s_mainInstance;
230};
231
233{
234 return s_mainInstance;
235}
236
238{
239 s_mainInstance = mainInstance;
240}
241
246public:
247 explicit RestartHandler()
248 : m_restartRequested(false)
249 {
250 }
252 {
253 return m_restartRequested;
254 }
255 void requestRestart();
256 void reset()
257 {
258 m_restartRequested = false;
259 }
260 void respawnIfRestartRequested();
261 std::function<void()> requester()
262 {
263 return [this] { requestRestart(); };
264 }
265
266private:
267 std::atomic_bool m_restartRequested;
268};
269
270#ifdef QT_UTILITIES_GUI_QTWIDGETS
275public:
276explicit UpdateOptionPage(UpdateHandler *updateHandler, QWidget *parentWidget = nullptr);
277
278void setRestartHandler(std::function<void()> &&handler);
279
280private:
282void updateLatestVersion(bool inProgress = false);
283std::unique_ptr<UpdateOptionPagePrivate> m_p;
285
289class QT_UTILITIES_EXPORT VerificationErrorMessageBox : public QMessageBox {
290 Q_OBJECT
291
292public:
293 explicit VerificationErrorMessageBox();
294 ~VerificationErrorMessageBox() override;
295
296public Q_SLOTS:
297 int execForError(QString &errorMessage, const QString &explanation = QString());
298 void openForError(const QString &errorMessage, const QString &explanation = QString());
299};
300
304class QT_UTILITIES_EXPORT UpdateDialog : public SettingsDialog {
305 Q_OBJECT
306
307public:
308 explicit UpdateDialog(QWidget *parent = nullptr);
309 ~UpdateDialog() override;
310 UpdateOptionPage *page();
311 const UpdateOptionPage *page() const;
312
313private:
314 std::unique_ptr<UpdateDialogPrivate> m_p;
315};
316
317#endif
318
319} // namespace QtUtilities
320
321#endif // QT_UTILITIES_SETUP_UPDATER_H
322
323#if defined(QT_UTILITIES_GUI_QTWIDGETS)
325#endif
std::function< void()> requester()
Definition updater.h:261
The SettingsDialog class provides a framework for creating settings dialogs with different categories...
bool isConsideringSeparateSignature() const
Definition updater.cpp:1142
static UpdateHandler * mainInstance()
Definition updater.h:232
void setConsideringSeparateSignature(bool consideringSeparateSignature)
Definition updater.cpp:1147
static void setMainInstance(UpdateHandler *mainInstance)
Definition updater.h:237
UpdateHandler(QSettings *settings, QNetworkAccessManager *nm, QObject *parent=nullptr)
Handles checking for updates and performing an update of the application if available.
Definition updater.cpp:1081
const CheckInterval & checkInterval() const
Definition updater.cpp:1117
UpdateNotifier * notifier
Definition updater.h:184
QString preCheck() const
Definition updater.cpp:1152
void setCheckInterval(CheckInterval checkInterval)
Definition updater.cpp:1130
UpdateNotifier * notifier()
The UpdateNotifier class allows checking for new updates.
Definition updater.h:59
void setFlags(UpdateCheckFlags flags)
Definition updater.cpp:226
void setNetworkAccessManager(QNetworkAccessManager *nm)
Definition updater.cpp:374
UpdateNotifier(QObject *parent=nullptr)
Definition updater.cpp:142
void updateAvailable(const QString &version, const QString &additionalInfo)
void save(QSettings *settings)
Definition updater.cpp:336
bool isUpdateAvailable() const
Definition updater.cpp:208
void inProgressChanged(bool inProgress)
void supplyNewReleaseData(const QByteArray &data)
Definition updater.cpp:477
UpdateCheckFlags flags() const
Definition updater.cpp:217
const QString & latestVersion() const
Definition updater.cpp:255
void restore(QSettings *settings)
Definition updater.cpp:319
CppUtilities::DateTime lastCheck() const
Definition updater.cpp:310
The Updater class allows downloading and applying an update.
Definition updater.h:124
Updater(const QString &executableName, QObject *parent=nullptr)
Definition updater.cpp:673
void updatePercentageChanged(qint64 bytesReceived, qint64 bytesTotal)
void updateStatusChanged(const QString &statusMessage)
void updateFailed(const QString &error)
QString overallStatus
Definition updater.h:127
std::function< QString(const Update &)> VerifyFunction
Definition updater.h:139
QString statusMessage
Definition updater.h:129
bool performUpdate(const QString &downloadUrl, const QString &signatureUrl)
Definition updater.cpp:769
void setVerifier(VerifyFunction &&verifyFunction)
Definition updater.cpp:753
void inProgressChanged(bool inProgress)
void setNetworkAccessManager(QNetworkAccessManager *nm)
Definition updater.cpp:744
bool isInProgress() const
Definition updater.cpp:702
#define QT_UTILITIES_EXPORT
Marks the symbol to be exported by the qtutilities library.
Definition global.h:14
The CppUtilities namespace contains addons to the c++utilities library provided by the qtutilities li...
#define DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE(SomeClass)
Declares external instantiation of class declared with BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE in a c...
Definition optionpage.h:271
#define BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE_CUSTOM_CTOR(SomeClass)
Declares a class inheriting from Dialogs::UiFileBasedOptionPage in a convenient way.
Definition optionpage.h:215
#define END_DECLARE_OPTION_PAGE
Must be used after BEGIN_DECLARE_OPTION_PAGE and BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE.
Definition optionpage.h:241
#define DECLARE_SETUP_WIDGETS
Declares the method setupWidget() in a convenient way.
Definition optionpage.h:300
The CheckInterval struct specifies whether automatic checks for updates are enabled and of often they...
Definition updater.h:189
bool enabled
Whether automatic checks for updates are enabled at all.
Definition updater.h:194
CppUtilities::TimeSpan duration
The duration of the interval. Only durations up to around 24 days are supported. Only full-second acc...
Definition updater.h:192
std::string_view executableName
Definition updater.h:134
std::string_view signatureName
Definition updater.h:135
std::string_view data
Definition updater.h:136
std::string_view signature
Definition updater.h:137
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(QtUtilities, QtUtilities::UpdateCheckFlags)