diff options
author | Saturneric <[email protected]> | 2022-01-03 22:10:04 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2022-01-03 22:10:04 +0000 |
commit | 2f64e4300b77f74cc4a7f0f50dbfe87862b72b95 (patch) | |
tree | 0d56d21ed78b5b1377681338619ac79c32386335 /src/ui/function/VersionCheckThread.cpp | |
parent | <fix, feature>(core, ui): key package import. (diff) | |
download | GpgFrontend-2f64e4300b77f74cc4a7f0f50dbfe87862b72b95.tar.gz GpgFrontend-2f64e4300b77f74cc4a7f0f50dbfe87862b72b95.zip |
<fix, feature>(core, ui): version system upgrade.
1. can notice user withdraw version now.
2. fix software not restart when signal caught.
3. improve ui.
Diffstat (limited to '')
-rw-r--r-- | src/ui/function/VersionCheckThread.cpp | 107 |
1 files changed, 79 insertions, 28 deletions
diff --git a/src/ui/function/VersionCheckThread.cpp b/src/ui/function/VersionCheckThread.cpp index bad60ef4..e038ab97 100644 --- a/src/ui/function/VersionCheckThread.cpp +++ b/src/ui/function/VersionCheckThread.cpp @@ -24,8 +24,7 @@ #include "VersionCheckThread.h" -#include <iterator> -#include <regex> +#include <QMetaType> #include "GpgFrontendBuildInfo.h" #include "json/json.hpp" @@ -33,45 +32,97 @@ namespace GpgFrontend::UI { void VersionCheckThread::run() { - using namespace nlohmann; - - LOG(INFO) << "get latest version from Github"; - auto current_version = std::string("v") + std::to_string(VERSION_MAJOR) + "." + std::to_string(VERSION_MINOR) + "." + std::to_string(VERSION_PATCH); - while (mNetworkReply->isRunning()) { - QApplication::processEvents(); - } + auto manager = new QNetworkAccessManager(nullptr); - if (mNetworkReply->error() != QNetworkReply::NoError) { - LOG(ERROR) << "network error"; - return; - } + LOG(INFO) << "current version" << current_version; - auto bytes = mNetworkReply->readAll(); + std::string latest_version_url = + "https://api.github.com/repos/saturneric/gpgfrontend/releases/latest"; - auto reply_json = nlohmann::json::parse(bytes.toStdString()); + std::string current_version_url = + "https://api.github.com/repos/saturneric/gpgfrontend/releases/tags/" + + current_version; - std::string latest_version = reply_json["tag_name"]; + QNetworkRequest latest_request, current_request; + latest_request.setUrl(QUrl(latest_version_url.c_str())); + current_request.setUrl(QUrl(current_version_url.c_str())); + auto reply = manager->get(latest_request); + while (reply->isRunning()) QApplication::processEvents(); + if (reply->error() != QNetworkReply::NoError) { + LOG(ERROR) << "network error"; + manager->deleteLater(); + return; + } - LOG(INFO) << "latest version from Github" << latest_version; + latest_reply_bytes_ = reply->readAll(); + reply = manager->get(current_request); + while (reply->isRunning()) QApplication::processEvents(); + current_reply_bytes_ = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + LOG(ERROR) << "network error"; + manager->deleteLater(); + return; + } - QRegularExpression re(R"(^[vV](\d+\.)?(\d+\.)?(\*|\d+))"); - auto version_match = re.match(latest_version.c_str()); - if (version_match.hasMatch()) { - latest_version = version_match.captured(0).toStdString(); - LOG(INFO) << "latest version matched" << latest_version; - } else { - latest_version = current_version; - LOG(WARNING) << "latest version unknown"; + SoftwareVersion version; + version.current_version = current_version; + + try { + using namespace nlohmann; + + auto latest_reply_json = + nlohmann::json::parse(latest_reply_bytes_.toStdString()); + auto current_reply_json = + nlohmann::json::parse(current_reply_bytes_.toStdString()); + + std::string latest_version = latest_reply_json["tag_name"]; + + LOG(INFO) << "latest version from Github" << latest_version; + + QRegularExpression re(R"(^[vV](\d+\.)?(\d+\.)?(\*|\d+))"); + auto version_match = re.match(latest_version.c_str()); + if (version_match.hasMatch()) { + latest_version = version_match.captured(0).toStdString(); + LOG(INFO) << "latest version matched" << latest_version; + } else { + latest_version = current_version; + LOG(WARNING) << "latest version unknown"; + } + + bool prerelease = latest_reply_json["prerelease"], + draft = latest_reply_json["draft"]; + std::string publish_date = latest_reply_json["published_at"]; + std::string release_note = latest_reply_json["body"]; + version.latest_version = latest_version; + version.latest_prerelease = prerelease; + version.latest_draft = draft; + version.publish_date = publish_date; + version.release_note = release_note; + + bool current_prerelease = current_reply_json["prerelease"], + current_draft = current_reply_json["draft"]; + version.latest_prerelease = current_prerelease; + version.latest_draft = current_draft; + + // loading done + version.load_info_done = true; + + } catch (...) { + LOG(INFO) << "error occurred"; + version.load_info_done = false; } - emit upgradeVersion(current_version.c_str(), latest_version.c_str()); + manager->deleteLater(); + + emit upgradeVersion(version); } -VersionCheckThread::VersionCheckThread(QNetworkReply* networkReply) - : mNetworkReply(networkReply) {} +VersionCheckThread::VersionCheckThread() : QThread(nullptr) { + qRegisterMetaType<SoftwareVersion>("SoftwareVersion"); +}; } // namespace GpgFrontend::UI |