1 # An updater for Qt apps
3 This is an extensible updater for Qt apps. It can wrap [Sparkle](https://sparkle-project.org/) on macOS and use its own implementation on Windows and Linux. I use it in my apps at https://flavio.tordini.org .
7 The main interface is [Updater](https://github.com/flaviotordini/updater/blob/master/src/updater.h). A shared Updater subclass instance should be set on startup using `Updater::setInstance()`. Available implementations are:
9 - [`updater::DefaultUpdater`](https://github.com/flaviotordini/updater/blob/master/src/impl/defaultupdater.h), the default Qt-based implementation.
11 - [`updater::SparkleUpdater`](https://github.com/flaviotordini/updater/blob/master/src/sparkle/sparkleupdater.h), a Sparkle-based implementation for macOS
17 Updater provides ready-to-use widgets:
19 - `Updater::getAction()` returns a QAction suitable to be inserted in a QMenu.
20 - `Updater::getLabel()` returns a QLabel that automatically changes its message. Typically used in the about box.
21 - `Updater::getButton()` returns a QPushButton that autohides or automatically changes its function depending on the Updater status.
23 When the user triggers the action or pushes the button a dialog will show which is dependent on the Updater implementation.
27 [updater::DefaultUpdater](https://github.com/flaviotordini/updater/blob/master/src/impl/defaultupdater.h) has a number of extension points so it can be adapted to different release manifest formats and update mechanisms.
31 Implement [updater::Parser](https://github.com/flaviotordini/updater/blob/master/src/impl/parser.h) to parse your own manifest format. There are two ready-to-use parsers:
33 - [updater::AppcastParser](https://github.com/flaviotordini/updater/blob/master/src/impl/appcastparser.h). This the appcast format also used by Sparkle. It's a RSS feed with Sparkle extensions.
34 - [updater::SimpleXmlParser](https://github.com/flaviotordini/updater/blob/master/src/impl/simplexmlparser.h). This is a very simple XML format
36 Set the desired Parser implementation using `updater::DefaultUpdater::setParser`. The default is [updater::AppcastParser].
40 [updater::Installer](https://github.com/flaviotordini/updater/blob/master/src/impl/installer.h) is the abstraction responsible for preparing and running the update process. Currently the only available Installer implementation is [updater::RunInstaller](https://github.com/flaviotordini/updater/blob/master/src/impl/runinstaller.h). It just runs an executable update payload, optionally with arguments.
42 Installer can be implemented in other ways, for example an Installer that unzips a payload and moves files. Or one that invokes an update helper. Another idea is signature validation.
44 Set the desired Installer implementation using `updater::DefaultUpdater::setInstaller`. The default is [updater::RunInstaller].
58 You can use this library as a git submodule. For example, add it to your project inside a lib subdirectory:
61 git submodule add -b master https://github.com/flaviotordini/updater lib/updater
64 Then you can update your git submodules like this:
67 git submodule update --init --recursive --remote
70 To integrate the library in your qmake based project just add this to your .pro file:
73 include(lib/updater/updater.pri)
76 qmake builds all object files in the same directory. In order to avoid filename clashes use:
79 CONFIG += object_parallel_to_source
84 Example setup of the shared Updater instance:
88 #ifdef UPDATER_SPARKLE
89 #include "sparkleupdater.h"
91 #include "defaultupdater.h"
95 #ifdef UPDATER_SPARKLE
96 Updater::setInstance(new updater::SparkleUpdater());
98 auto updater = new updater::DefaultUpdater();
99 updater->setManifestUrl(myAppcastUrl);
100 Updater::setInstance(updater);
105 Updater provides a QAction instance ready to be used in a menu.
108 myMenu->addAction(Updater::instance().getAction());
111 In the About box you can use the standard widgets provided by Updater. A QLabel and a QPushButton.
114 myLayout->addWidget(Updater::instance().getLabel());
115 myLayout->addWidget(Updater::instance().getButton());
120 Always serve your manifest files and binary updates via HTTPS.
124 You can use this library under the GPLv3 license terms. If you do, you're welcome contributing your changes and fixes. Donations are welcome at https://flavio.tordini.org/donate
126 For commercial projects I ask for a one-time license fee, contact me at flavio.tordini@gmail.com