ckb-next  beta-v0.2.8 at branch testing
ckb-next driver for corsair devices
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
kbfirmware.h
Go to the documentation of this file.
1 #ifndef KBFIRMWARE_H
2 #define KBFIRMWARE_H
3 
4 #include "kb.h"
5 #include <QObject>
6 #include <QtNetwork/QtNetwork>
7 
8 // Class for managing/updating firmware on a device
9 
10 class KbFirmware : public QObject
11 {
12  Q_OBJECT
13 public:
14  // Checks for firmware updates. Maximum of once per hour. Returns true if it actually checked or false if not.
15  static inline bool checkUpdates() { return instance._checkUpdates(); }
16 
17  // Whether or not the firmware table has been downloaded at all.
18  static inline bool hasDownloaded() { return instance.lastFinished != 0; }
19 
20  // Latest firmware version for a keyboard model. Will check for updates automatically and return the latest known version.
21  // Zero if version unknown, -1.0 if ckb needs to be upgraded.
22  static inline float versionForBoard(const QString& features, bool waitForComplete = false) { return instance._latestForBoard(features, waitForComplete); }
23 
24  // Downloads and extracts the latest firmware for a keyboard. Returns an empty array on failure.
25  static inline QByteArray dataForBoard(const QString& features) { return instance._fileForBoard(features); }
26 
27 private:
28  KbFirmware();
29  ~KbFirmware();
30 
31  // Time initiated
33  // Model -> firmware table
34  struct FW {
35  QString url, fileName;
36  QByteArray hash;
38 
39  FW();
40  };
41  QMap<QString, FW> fwTable;
42  // SHA256 of last downloaded table (redundancy check)
43  QByteArray fwTableHash;
44 
45  // Network manager for downloading updates
46  // It can't be declared as part of the object or it will misbehave. Has to be initialized on use.
47  QNetworkAccessManager* networkManager;
48  void initManager();
49  // Current FW table download (null if nothing downloading)
50  QNetworkReply* tableDownload;
51 
52  // Can GPG be used to verify signatures?
53  enum { UNKNOWN = -1, NO, YES } hasGPG :2;
54 
55  // Singleton instance
56  bool _checkUpdates();
57  float _latestForBoard(const QString& features, bool waitForComplete);
58  QByteArray _fileForBoard(const QString& features);
60 
61 signals:
62  void downloaded();
63 
64 private slots:
65  void processDownload(QNetworkReply* reply);
66  void downloadFinished();
67 };
68 
69 #endif // KBFIRMWARE_H
static KbFirmware instance
Definition: kbfirmware.h:59
QNetworkAccessManager * networkManager
Definition: kbfirmware.h:47
void processDownload(QNetworkReply *reply)
Definition: kbfirmware.cpp:44
bool _checkUpdates()
Definition: kbfirmware.cpp:30
QString fileName
Definition: kbfirmware.h:35
static QByteArray dataForBoard(const QString &features)
Definition: kbfirmware.h:25
float fwVersion
Definition: kbfirmware.h:37
QByteArray fwTableHash
Definition: kbfirmware.h:43
void initManager()
Definition: kbfirmware.cpp:24
QString url
Definition: kbfirmware.h:35
quint64 lastFinished
Definition: kbfirmware.h:32
float _latestForBoard(const QString &features, bool waitForComplete)
Definition: kbfirmware.cpp:165
quint64 lastCheck
Definition: kbfirmware.h:32
enum KbFirmware::@1 hasGPG
QMap< QString, FW > fwTable
Definition: kbfirmware.h:41
static bool checkUpdates()
Definition: kbfirmware.h:15
static bool hasDownloaded()
Definition: kbfirmware.h:18
QNetworkReply * tableDownload
Definition: kbfirmware.h:50
float ckbVersion
Definition: kbfirmware.h:37
void downloadFinished()
Definition: kbfirmware.cpp:144
QByteArray hash
Definition: kbfirmware.h:36
static float versionForBoard(const QString &features, bool waitForComplete=false)
Definition: kbfirmware.h:22
QByteArray _fileForBoard(const QString &features)
Definition: kbfirmware.cpp:183