MuldeR's Utilities for Qt
MUtilities
UpdateChecker.h
1 // MuldeR's Utilities for Qt
3 // Copyright (C) 2004-2022 LoRd_MuldeR <MuldeR2@GMX.de>
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 //
19 // http://www.gnu.org/licenses/lgpl-2.1.txt
21 
22 #pragma once
23 
24 //MUtils
25 #include <MUtils/Global.h>
26 
27 //Qt
28 #include <QThread>
29 #include <QDate>
30 
31 class QUrl;
32 
34 
35 namespace MUtils
36 {
37  class MUTILS_API UpdateCheckerInfo
38  {
39  friend class UpdateChecker;
40 
41  public:
42  UpdateCheckerInfo(void);
43  void resetInfo(void);
44  bool isComplete(void);
45 
46  const quint32 &getBuildNo(void) const { return m_buildNo; }
47  const QDate &getBuildDate(void) const { return m_buildDate; }
48  const QString &getDownloadSite(void) const { return m_downloadSite; }
49  const QString &getDownloadAddress(void) const { return m_downloadAddress; }
50  const QString &getDownloadFilename(void) const { return m_downloadFilename; }
51  const QString &getDownloadFilecode(void) const { return m_downloadFilecode; }
52  const QString &getDownloadChecksum(void) const { return m_downloadChecksum; }
53 
54  private:
55  quint32 m_buildNo;
56  QDate m_buildDate;
57  QString m_downloadSite;
58  QString m_downloadAddress;
59  QString m_downloadFilename;
60  QString m_downloadFilecode;
61  QString m_downloadChecksum;
62  };
63 
64  // ----------------------------------------------------------------
65 
66  class MUTILS_API UpdateChecker : public QThread
67  {
68  Q_OBJECT
69 
70  public:
71  enum
72  {
73  UpdateStatus_NotStartedYet = 0,
74  UpdateStatus_CheckingConnection = 1,
75  UpdateStatus_FetchingUpdates = 2,
76  UpdateStatus_CompletedUpdateAvailable = 3,
77  UpdateStatus_CompletedNoUpdates = 4,
78  UpdateStatus_CompletedNewVersionOlder = 5,
79  UpdateStatus_ErrorNoConnection = 6,
80  UpdateStatus_ErrorConnectionTestFailed = 7,
81  UpdateStatus_ErrorFetchUpdateInfo = 8,
82  UpdateStatus_CancelledByUser = 9
83  }
84  update_status_t;
85 
86  UpdateChecker(const QString &binCurl, const QString &binVerify, const QString &applicationId, const quint32 &installedBuildNo, const bool betaUpdates, const bool testMode = false);
87  ~UpdateChecker(void);
88 
89  const int getUpdateStatus(void) const { return m_status; }
90  const bool getSuccess(void) const { return m_success; };
91  const int getMaximumProgress(void) const { return m_maxProgress; };
92  const int getCurrentProgress(void) const { return m_progress; };
93  const UpdateCheckerInfo *getUpdateInfo(void) const { return m_updateInfo.data(); }
94 
95  bool cancel(void) { return m_cancelled.ref(); }
96 
97  public slots:
98  void start(Priority = InheritPriority);
99 
100  protected:
101  void run(void);
102  void checkForUpdates(void);
103  void testMirrorsList(void);
104 
105  signals:
106  void statusChanged(const int status);
107  void progressChanged(const int progress);
108  void messageLogged(const QString &text);
109 
110  private:
111  const int m_maxProgress;
112  QScopedPointer<UpdateCheckerInfo> m_updateInfo;
113 
114  const bool m_betaUpdates;
115  const bool m_testMode;
116 
117  const QString m_applicationId;
118  const quint32 m_installedBuildNo;
119 
120  const QString m_binaryCurl;
121  const QString m_binaryVerify;
122 
123  const QScopedPointer<const QHash<QString, QString>> m_environment;
124 
125  QAtomicInt m_success;
126  QAtomicInt m_cancelled;
127 
128  int m_status;
129  int m_progress;
130 
131  inline void setStatus(const int status);
132  inline void setProgress(const int progress);
133  inline void log(const QString &str1, const QString &str2 = QString(), const QString &str3 = QString(), const QString &str4 = QString());
134 
135  bool getUpdateInfo(const QString &url, const QString &outFileVers, const QString &outFileSign);
136  bool tryContactHost(const QString &hostname, const int &timeoutMsec);
137  bool parseVersionInfo(const QString &file, UpdateCheckerInfo *const updateInfo);
138 
139  bool getFile(const QUrl &url, const QString &outFile, const unsigned int maxRedir = 8U);
140  bool checkSignature(const QString &file, const QString &signature);
141  bool tryUpdateMirror(UpdateCheckerInfo *updateInfo, const QString &url, const bool &quick);
142 
143  bool execCurl(const QStringList &args, const QString &workingDir, const int timeout);
144  int execProcess(const QString &programFile, const QStringList &args, const QString &workingDir, const int timeout);
145  };
146 }
This file contains miscellaneous functions that are generally useful for Qt-based applications...
Definition: UpdateChecker.h:37
Global MUtils namespace.
Definition: CPUFeatures.h:37
Definition: UpdateChecker.h:66