diff options
Diffstat (limited to '')
-rw-r--r-- | src/ui/thread/VersionCheckTask.cpp (renamed from src/ui/thread/VersionCheckThread.cpp) | 136 |
1 files changed, 87 insertions, 49 deletions
diff --git a/src/ui/thread/VersionCheckThread.cpp b/src/ui/thread/VersionCheckTask.cpp index 6d73417d..7de3b511 100644 --- a/src/ui/thread/VersionCheckThread.cpp +++ b/src/ui/thread/VersionCheckTask.cpp @@ -26,45 +26,58 @@ * */ -#include "VersionCheckThread.h" +#include "VersionCheckTask.h" #include <QMetaType> -#include <nlohmann/json.hpp> +#include <memory> #include "GpgFrontendBuildInfo.h" namespace GpgFrontend::UI { -void VersionCheckThread::run() { - auto current_version = std::string("v") + std::to_string(VERSION_MAJOR) + - "." + std::to_string(VERSION_MINOR) + "." + - std::to_string(VERSION_PATCH); - - SoftwareVersion version; - version.current_version = current_version; +VersionCheckTask::VersionCheckTask() + : network_manager_(new QNetworkAccessManager(this)), + current_version_(std::string("v") + std::to_string(VERSION_MAJOR) + "." + + std::to_string(VERSION_MINOR) + "." + + std::to_string(VERSION_PATCH)) { + qRegisterMetaType<SoftwareVersion>("SoftwareVersion"); + version_.current_version = current_version_; +} - auto manager = std::make_unique<QNetworkAccessManager>(nullptr); +void VersionCheckTask::Run() { + SetFinishAfterRun(false); try { using namespace nlohmann; - LOG(INFO) << "current version" << current_version; - + LOG(INFO) << "current version" << current_version_; std::string latest_version_url = "https://api.github.com/repos/saturneric/gpgfrontend/releases/latest"; - std::string current_version_url = - "https://api.github.com/repos/saturneric/gpgfrontend/releases/tags/" + - current_version; - QNetworkRequest latest_request, current_request; + QNetworkRequest latest_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) << "current version request error"; - version.latest_version = current_version; + latest_reply_ = network_manager_->get(latest_request); + connect(latest_reply_, &QNetworkReply::finished, this, + &VersionCheckTask::slot_parse_latest_version_info); + + // loading done + version_.load_info_done = true; + + } catch (...) { + emit SignalTaskFinished(); + } +} + +void VersionCheckTask::slot_parse_latest_version_info() { + version_.current_version = current_version_; + + try { + if (latest_reply_ == nullptr || + latest_reply_->error() != QNetworkReply::NoError) { + LOG(ERROR) << "latest version request error"; + version_.latest_version = current_version_; } else { - latest_reply_bytes_ = _reply->readAll(); + latest_reply_bytes_ = latest_reply_->readAll(); + auto latest_reply_json = nlohmann::json::parse(latest_reply_bytes_.toStdString()); @@ -78,7 +91,7 @@ void VersionCheckThread::run() { latest_version = version_match.captured(0).toStdString(); LOG(INFO) << "latest version matched" << latest_version; } else { - latest_version = current_version; + latest_version = current_version_; LOG(WARNING) << "latest version unknown"; } @@ -86,44 +99,69 @@ void VersionCheckThread::run() { 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; + version_.latest_version = latest_version; + version_.latest_prerelease = prerelease; + version_.latest_draft = draft; + version_.publish_date = publish_date; + version_.release_note = release_note; } + } catch (...) { + LOG(INFO) << "error occurred"; + version_.load_info_done = false; + } - _reply->deleteLater(); + if (latest_reply_ != nullptr) { + latest_reply_->deleteLater(); + } - _reply = manager->get(current_request); - while (_reply->isRunning()) QApplication::processEvents(); - current_reply_bytes_ = _reply->readAll(); - if (_reply->error() != QNetworkReply::NoError) { + try { + std::string current_version_url = + "https://api.github.com/repos/saturneric/gpgfrontend/releases/tags/" + + current_version_; + + QNetworkRequest current_request; + current_request.setUrl(QUrl(current_version_url.c_str())); + current_reply_ = network_manager_->get(current_request); + + connect(current_reply_, &QNetworkReply::finished, this, + &VersionCheckTask::slot_parse_current_version_info); + } catch (...) { + LOG(ERROR) << "current version request create error"; + emit SignalTaskFinished(); + } +} + +void VersionCheckTask::slot_parse_current_version_info() { + try { + if (current_reply_ == nullptr || + current_reply_->error() != QNetworkReply::NoError) { LOG(ERROR) << "current version request network error"; - version.current_version_found = false; + version_.current_version_found = false; } else { - version.current_version_found = true; + version_.current_version_found = true; + current_reply_bytes_ = current_reply_->readAll(); + LOG(INFO) << "current version" << current_reply_bytes_.size(); auto current_reply_json = nlohmann::json::parse(current_reply_bytes_.toStdString()); bool current_prerelease = current_reply_json["prerelease"], current_draft = current_reply_json["draft"]; - version.latest_prerelease = current_prerelease; - version.latest_draft = current_draft; + version_.latest_prerelease = current_prerelease; + version_.latest_draft = current_draft; + version_.load_info_done = true; } - _reply->deleteLater(); - - // loading done - version.load_info_done = true; - } catch (...) { LOG(INFO) << "error occurred"; - version.load_info_done = false; + version_.load_info_done = false; } - emit SignalUpgradeVersion(version); -} -VersionCheckThread::VersionCheckThread() : QThread(nullptr) { - qRegisterMetaType<SoftwareVersion>("SoftwareVersion"); -}; + LOG(INFO) << "current version parse done" << version_.current_version_found; + + if (current_reply_ != nullptr) { + current_reply_->deleteLater(); + } + + emit SignalUpgradeVersion(version_); + emit SignalTaskFinished(); +} } // namespace GpgFrontend::UI |