Skip to content

Commit

Permalink
Merge pull request #6891 from DonLakeFlyer/VersionCheck
Browse files Browse the repository at this point in the history
Stable desktop version check
  • Loading branch information
DonLakeFlyer authored Sep 26, 2018
2 parents a070fb9 + 76d21b9 commit 6716ff4
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 11 deletions.
3 changes: 2 additions & 1 deletion ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ Note: This file only contains high level features or important fixes.

## 3.4

### 3.4.4 - Not yet released
### 3.4.4
* Stable desktop versions now inform user at boot if newer version is available.
* Multi-Vehicle Start Mission and Pause now work correctly. Issue #6864.

### 3.4.3
Expand Down
93 changes: 83 additions & 10 deletions src/QGCApplication.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <QStyleFactory>
#include <QAction>
#include <QStringListModel>
#include <QRegularExpression>

#ifdef QGC_ENABLE_BLUETOOTH
#include <QBluetoothLocalDevice>
Expand Down Expand Up @@ -86,6 +87,7 @@
#include "EditPositionDialogController.h"
#include "FactValueSliderListModel.h"
#include "KMLFileHelper.h"
#include "QGCFileDownload.h"

#ifndef NO_SERIAL_LINK
#include "SerialLink.h"
Expand Down Expand Up @@ -148,20 +150,24 @@ static QObject* kmlFileHelperSingletonFactory(QQmlEngine*, QJSEngine*)

QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting)
#ifdef __mobile__
: QGuiApplication (argc, argv)
, _qmlAppEngine (NULL)
: QGuiApplication (argc, argv)
, _qmlAppEngine (nullptr)
#else
: QApplication (argc, argv)
: QApplication (argc, argv)
#endif
, _runningUnitTests (unitTesting)
, _logOutput (false)
, _fakeMobile (false)
, _settingsUpgraded (false)
, _runningUnitTests (unitTesting)
, _logOutput (false)
, _fakeMobile (false)
, _settingsUpgraded (false)
, _majorVersion (0)
, _minorVersion (0)
, _buildVersion (0)
, _currentVersionDownload (nullptr)
#ifdef QT_DEBUG
, _testHighDPI (false)
, _testHighDPI (false)
#endif
, _toolbox (NULL)
, _bluetoothAvailable (false)
, _toolbox (nullptr)
, _bluetoothAvailable (false)
{
_app = this;

Expand Down Expand Up @@ -322,6 +328,8 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting)

_toolbox = new QGCToolbox(this);
_toolbox->setChildToolboxes();

_checkForNewVersion();
}

void QGCApplication::_shutdown(void)
Expand Down Expand Up @@ -692,3 +700,68 @@ bool QGCApplication::isInternetAvailable()
{
return getQGCMapEngine()->isInternetActive();
}

void QGCApplication::_checkForNewVersion(void)
{
#ifndef __mobile__
if (!_runningUnitTests) {
if (_parseVersionText(applicationVersion(), _majorVersion, _minorVersion, _buildVersion)) {
QString versionCheckFile = toolbox()->corePlugin()->stableVersionCheckFileUrl();
if (!versionCheckFile.isEmpty()) {
_currentVersionDownload = new QGCFileDownload(this);
connect(_currentVersionDownload, &QGCFileDownload::downloadFinished, this, &QGCApplication::_currentVersionDownloadFinished);
connect(_currentVersionDownload, &QGCFileDownload::error, this, &QGCApplication::_currentVersionDownloadError);
_currentVersionDownload->download(versionCheckFile);
}
}
}
#endif
}

void QGCApplication::_currentVersionDownloadFinished(QString remoteFile, QString localFile)
{
Q_UNUSED(remoteFile);

#ifdef __mobile__
Q_UNUSED(localFile);
#else
QFile versionFile(localFile);
if (versionFile.open(QIODevice::ReadOnly)) {
QTextStream textStream(&versionFile);
QString version = textStream.readLine();

qDebug() << version;

int majorVersion, minorVersion, buildVersion;
if (_parseVersionText(version, majorVersion, minorVersion, buildVersion)) {
if (_majorVersion < majorVersion ||
(_majorVersion == majorVersion && _minorVersion < minorVersion) ||
(_majorVersion == majorVersion && _minorVersion == minorVersion && _buildVersion < buildVersion)) {
QGCMessageBox::information(tr("New Version Available"), tr("There is a newer version of %1 available. You can download it from %2.").arg(applicationName()).arg(toolbox()->corePlugin()->stableDownloadLocation()));
}
}
}

_currentVersionDownload->deleteLater();
#endif
}

void QGCApplication::_currentVersionDownloadError(QString errorMsg)
{
Q_UNUSED(errorMsg);
_currentVersionDownload->deleteLater();
}

bool QGCApplication::_parseVersionText(const QString& versionString, int& majorVersion, int& minorVersion, int& buildVersion)
{
QRegularExpression regExp("v(\\d+)\\.(\\d+)\\.(\\d+)");
QRegularExpressionMatch match = regExp.match(versionString);
if (match.hasMatch() && match.lastCapturedIndex() == 3) {
majorVersion = match.captured(1).toInt();
minorVersion = match.captured(2).toInt();
buildVersion = match.captured(3).toInt();
return true;
}

return false;
}
9 changes: 9 additions & 0 deletions src/QGCApplication.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
class QGCSingleton;
class MainWindow;
class QGCToolbox;
class QGCFileDownload;

/**
* @brief The main application and management class.
Expand Down Expand Up @@ -152,9 +153,13 @@ public slots:

private slots:
void _missingParamsDisplay(void);
void _currentVersionDownloadFinished(QString remoteFile, QString localFile);
void _currentVersionDownloadError(QString errorMsg);
bool _parseVersionText(const QString& versionString, int& majorVersion, int& minorVersion, int& buildVersion);

private:
QObject* _rootQmlObject(void);
void _checkForNewVersion(void);

#ifdef __mobile__
QQmlApplicationEngine* _qmlAppEngine;
Expand All @@ -170,6 +175,10 @@ private slots:
QStringList _missingParams; ///< List of missing facts to be displayed
bool _fakeMobile; ///< true: Fake ui into displaying mobile interface
bool _settingsUpgraded; ///< true: Settings format has been upgrade to new version
int _majorVersion;
int _minorVersion;
int _buildVersion;
QGCFileDownload* _currentVersionDownload;

#ifdef QT_DEBUG
bool _testHighDPI; ///< true: double fonts sizes for simulating high dpi devices
Expand Down
10 changes: 10 additions & 0 deletions src/api/QGCCorePlugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -303,3 +303,13 @@ bool QGCCorePlugin::guidedActionsControllerLogging(void) const
{
return GuidedActionsControllerLog().isDebugEnabled();
}

QString QGCCorePlugin::stableVersionCheckFileUrl(void) const
{
#ifdef QGC_CUSTOM_BUILD
// Custom builds must override to turn on and provide their own location
return QString();
#else
return QString("https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGC.version.txt");
#endif
}
12 changes: 12 additions & 0 deletions src/api/QGCCorePlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,18 @@ class QGCCorePlugin : public QGCTool
/// should derive from QmlComponentInfo and set the url property.
virtual QmlObjectListModel* customMapItems(void);

/// Returns the url to download the stable version check file. Return QString() to indicate no version check should be performed.
/// Default QGC mainline implemenentation returns QGC Stable file location. Default QGC custom build code returns QString().
/// Custom builds can override to turn on and provide their own location.
/// The contents of this file should be a single line in the form:
/// v3.4.4
/// This indicates the latest stable version number.
virtual QString stableVersionCheckFileUrl(void) const;

/// Returns the user visible url to show user where to download new stable builds from.
/// Custom builds must override to provide their own location.
virtual QString stableDownloadLocation(void) const { return QString("qgroundcontrol.com"); }

bool showTouchAreas(void) const { return _showTouchAreas; }
bool showAdvancedUI(void) const { return _showAdvancedUI; }
void setShowTouchAreas(bool show);
Expand Down

0 comments on commit 6716ff4

Please sign in to comment.