diff --git a/src/Cutter.pro b/src/Cutter.pro index fa63a4a5..d49efbd3 100644 --- a/src/Cutter.pro +++ b/src/Cutter.pro @@ -17,7 +17,7 @@ ICON = img/cutter.icns # Icon/resources for Windows win32: RC_ICONS = img/cutter.ico -QT += core gui widgets svg +QT += core gui widgets svg network QT_CONFIG -= no-pkg-config CONFIG += c++11 diff --git a/src/dialogs/AboutDialog.cpp b/src/dialogs/AboutDialog.cpp index 10e276b4..638461e5 100644 --- a/src/dialogs/AboutDialog.cpp +++ b/src/dialogs/AboutDialog.cpp @@ -5,6 +5,14 @@ #include "r_version.h" #include "utils/Configuration.h" +#include +#include +#include +#include +#include +#include +#include + #include "CutterConfig.h" AboutDialog::AboutDialog(QWidget *parent) : @@ -51,7 +59,7 @@ void AboutDialog::on_buttonBox_rejected() void AboutDialog::on_showVersionButton_clicked() { QMessageBox popup(this); - popup.setWindowTitle("radare2 version information"); + popup.setWindowTitle(tr("radare2 version information")); auto versionInformation = Core()->getVersionInformation(); popup.setText(versionInformation); popup.exec(); @@ -62,3 +70,69 @@ void AboutDialog::on_showPluginsButton_clicked() R2PluginsDialog dialog(this); dialog.exec(); } + +void AboutDialog::on_checkForUpdatesButton_clicked() +{ + QUrl url("https://api.github.com/repos/radareorg/cutter/releases/latest"); + QNetworkRequest request; + request.setUrl(url); + + QProgressDialog waitDialog; + QProgressBar *bar = new QProgressBar(&waitDialog); + bar->setMaximum(0); + + waitDialog.setBar(bar); + waitDialog.setLabel(new QLabel(tr("Checking for updates..."), &waitDialog)); + + QNetworkAccessManager nm; + + QTimer timeoutTimer; + timeoutTimer.setSingleShot(true); + timeoutTimer.setInterval(7000); + + connect(&nm, &QNetworkAccessManager::finished, &timeoutTimer, &QTimer::stop); + connect(&nm, &QNetworkAccessManager::finished, &waitDialog, &QProgressDialog::cancel); + connect(&nm, &QNetworkAccessManager::finished, this, &AboutDialog::serveVersionCheckReply); + + QNetworkReply *reply = nm.get(request); + timeoutTimer.start(); + + connect(&timeoutTimer, &QTimer::timeout, []() { + QMessageBox mb; + mb.setIcon(QMessageBox::Critical); + mb.setStandardButtons(QMessageBox::Ok); + mb.setWindowTitle(tr("Timeout error!")); + mb.setText(tr("Please check your internet connection and try again.")); + mb.exec(); + }); + + waitDialog.exec(); + delete reply; +} + +void AboutDialog::serveVersionCheckReply(QNetworkReply *reply) +{ + QString currVersion = ""; + QMessageBox mb; + mb.setStandardButtons(QMessageBox::Ok); + if (reply->error()) { + mb.setIcon(QMessageBox::Critical); + mb.setWindowTitle(tr("Error!")); + mb.setText(reply->errorString()); + } else { + currVersion = QJsonDocument::fromJson(reply->readAll()).object().value("tag_name").toString(); + currVersion.remove('v'); + + mb.setWindowTitle(tr("Version control")); + mb.setIcon(QMessageBox::Information); + if (currVersion == CUTTER_VERSION_FULL) { + mb.setText(tr("You have latest version and no need to update!")); + } else { + mb.setText(tr("Current version: " CUTTER_VERSION_FULL "
" + "Latest version: %1

" + "For update, please check the link: %2") + .arg(currVersion, "https://github.com/radareorg/cutter/releases")); + } + } + mb.exec(); +} diff --git a/src/dialogs/AboutDialog.h b/src/dialogs/AboutDialog.h index b2e7a171..669757aa 100644 --- a/src/dialogs/AboutDialog.h +++ b/src/dialogs/AboutDialog.h @@ -3,6 +3,7 @@ #include #include +#include namespace Ui { class AboutDialog; @@ -20,6 +21,8 @@ private slots: void on_buttonBox_rejected(); void on_showVersionButton_clicked(); void on_showPluginsButton_clicked(); + void on_checkForUpdatesButton_clicked(); + void serveVersionCheckReply(QNetworkReply *reply); private: std::unique_ptr ui; diff --git a/src/dialogs/AboutDialog.ui b/src/dialogs/AboutDialog.ui index 14e66f08..6f069b69 100644 --- a/src/dialogs/AboutDialog.ui +++ b/src/dialogs/AboutDialog.ui @@ -63,6 +63,19 @@ + + + + + 0 + 0 + + + + Check for updates + + +