aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/UserInterfaceUtils.cpp
diff options
context:
space:
mode:
authorSaturn&Eric <[email protected]>2022-05-09 15:58:36 +0000
committerGitHub <[email protected]>2022-05-09 15:58:36 +0000
commita1bef0cc06a5c128a0f868ab59d7c153f5ab8aec (patch)
treef55b3c76f4203590b4bf40b6ab2f97965f5a51ec /src/ui/UserInterfaceUtils.cpp
parentMerge pull request #56 from saturneric/develop-2.0.6 (diff)
parentfix: modified init order (diff)
downloadGpgFrontend-a1bef0cc06a5c128a0f868ab59d7c153f5ab8aec.tar.gz
GpgFrontend-a1bef0cc06a5c128a0f868ab59d7c153f5ab8aec.zip
Merge pull request #57 from saturneric/develop-2.0.7v2.0.7
Develop 2.0.7
Diffstat (limited to 'src/ui/UserInterfaceUtils.cpp')
-rw-r--r--src/ui/UserInterfaceUtils.cpp167
1 files changed, 105 insertions, 62 deletions
diff --git a/src/ui/UserInterfaceUtils.cpp b/src/ui/UserInterfaceUtils.cpp
index 52b7eb28..724a467e 100644
--- a/src/ui/UserInterfaceUtils.cpp
+++ b/src/ui/UserInterfaceUtils.cpp
@@ -29,10 +29,13 @@
#include "UserInterfaceUtils.h"
#include <utility>
+#include <vector>
#include "core/common/CoreCommonUtil.h"
#include "core/function/FileOperator.h"
#include "core/function/GlobalSettingStation.h"
+#include "core/function/gpg/GpgKeyGetter.h"
+#include "easylogging++.h"
#include "ui/SignalStation.h"
#include "ui/dialog/WaitingDialog.h"
#include "ui/widgets/TextEdit.h"
@@ -129,11 +132,24 @@ CommonUtils *CommonUtils::GetInstance() {
}
CommonUtils::CommonUtils() : QWidget(nullptr) {
+ LOG(INFO) << "common utils created";
+
connect(CoreCommonUtil::GetInstance(), &CoreCommonUtil::SignalGnupgNotInstall,
this, &CommonUtils::SignalGnupgNotInstall);
connect(this, &CommonUtils::SignalKeyStatusUpdated,
SignalStation::GetInstance(),
&SignalStation::SignalKeyDatabaseRefresh);
+ connect(this, &CommonUtils::SignalKeyDatabaseRefreshDone,
+ SignalStation::GetInstance(),
+ &SignalStation::SignalKeyDatabaseRefreshDone);
+
+ // directly connect to SignalKeyStatusUpdated
+ // to avoid the delay of signal emitting
+ // when the key database is refreshed
+ connect(SignalStation::GetInstance(),
+ &SignalStation::SignalKeyDatabaseRefresh, this,
+ &CommonUtils::slot_update_key_status);
+
connect(this, &CommonUtils::SignalGnupgNotInstall, this, []() {
QMessageBox::critical(
nullptr, _("ENV Loading Failed"),
@@ -227,8 +243,7 @@ void CommonUtils::SlotExecuteGpgCommand(
}
void CommonUtils::SlotImportKeyFromKeyServer(
- const KeyIdArgsList &key_ids,
- const ImportCallbackFunctiopn &callback) {
+ const KeyIdArgsList &key_ids, const ImportCallbackFunctiopn &callback) {
std::string target_keyserver;
if (target_keyserver.empty()) {
try {
@@ -248,70 +263,98 @@ void CommonUtils::SlotImportKeyFromKeyServer(
}
}
- auto thread =
- QThread::create([target_keyserver, key_ids, callback]() {
- QUrl target_keyserver_url(target_keyserver.c_str());
-
- auto network_manager = std::make_unique<QNetworkAccessManager>();
- // LOOP
- decltype(key_ids.size()) current_index = 1, all_index = key_ids.size();
- for (const auto &key_id : key_ids) {
- // New Req Url
- QUrl req_url(target_keyserver_url.scheme() + "://" +
- target_keyserver_url.host() +
- "/pks/lookup?op=get&search=0x" + key_id.c_str() +
- "&options=mr");
-
- LOG(INFO) << "request url" << req_url.toString().toStdString();
-
- // Waiting for reply
- QNetworkReply *reply = network_manager->get(QNetworkRequest(req_url));
- QEventLoop loop;
- connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
- loop.exec();
-
- // Get Data
- auto key_data = reply->readAll();
- auto key_data_ptr =
- std::make_unique<ByteArray>(key_data.data(), key_data.size());
-
- // Detect status
- std::string status;
- auto error = reply->error();
- if (error != QNetworkReply::NoError) {
- switch (error) {
- case QNetworkReply::ContentNotFoundError:
- status = _("Key Not Found");
- break;
- case QNetworkReply::TimeoutError:
- status = _("Timeout");
- break;
- case QNetworkReply::HostNotFoundError:
- status = _("Key Server Not Found");
- break;
- default:
- status = _("Connection Error");
- }
- }
-
- reply->deleteLater();
-
- // Try importing
- GpgImportInformation result =
- GpgKeyImportExporter::GetInstance()
- .ImportKey(std::move(key_data_ptr));
-
- if (result.imported == 1) {
- status = _("The key has been updated");
- } else {
- status = _("No need to update the key");
- }
- callback(key_id, status, current_index, all_index);
- current_index++;
+ auto thread = QThread::create([target_keyserver, key_ids, callback]() {
+ QUrl target_keyserver_url(target_keyserver.c_str());
+
+ auto network_manager = std::make_unique<QNetworkAccessManager>();
+ // LOOP
+ decltype(key_ids.size()) current_index = 1, all_index = key_ids.size();
+ for (const auto &key_id : key_ids) {
+ // New Req Url
+ QUrl req_url(
+ target_keyserver_url.scheme() + "://" + target_keyserver_url.host() +
+ "/pks/lookup?op=get&search=0x" + key_id.c_str() + "&options=mr");
+
+ LOG(INFO) << "request url" << req_url.toString().toStdString();
+
+ // Waiting for reply
+ QNetworkReply *reply = network_manager->get(QNetworkRequest(req_url));
+ QEventLoop loop;
+ connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
+ loop.exec();
+
+ // Get Data
+ auto key_data = reply->readAll();
+ auto key_data_ptr =
+ std::make_unique<ByteArray>(key_data.data(), key_data.size());
+
+ // Detect status
+ std::string status;
+ auto error = reply->error();
+ if (error != QNetworkReply::NoError) {
+ switch (error) {
+ case QNetworkReply::ContentNotFoundError:
+ status = _("Key Not Found");
+ break;
+ case QNetworkReply::TimeoutError:
+ status = _("Timeout");
+ break;
+ case QNetworkReply::HostNotFoundError:
+ status = _("Key Server Not Found");
+ break;
+ default:
+ status = _("Connection Error");
}
+ }
+
+ reply->deleteLater();
+
+ // Try importing
+ GpgImportInformation result =
+ GpgKeyImportExporter::GetInstance().ImportKey(
+ std::move(key_data_ptr));
+
+ if (result.imported == 1) {
+ status = _("The key has been updated");
+ } else {
+ status = _("No need to update the key");
+ }
+ callback(key_id, status, current_index, all_index);
+ current_index++;
+ }
+ });
+
+ connect(thread, &QThread::finished, thread, &QThread::deleteLater);
+ thread->start();
+}
+
+void CommonUtils::slot_update_key_status() {
+ LOG(INFO) << "called";
+ auto *thread = QThread::create([this]() {
+ std::vector<QThread *> threads;
+
+ // flush key cache for all GpgKeyGetter Intances.
+ for (const auto &channel_id : GpgKeyGetter::GetAllChannelId()) {
+ // multi threading
+ auto *refresh_thread = QThread::create([channel_id]() {
+ LOG(INFO) << "FlushKeyCache thread start"
+ << "channel:" << channel_id;
+ GpgKeyGetter::GetInstance(channel_id).FlushKeyCache();
});
+ refresh_thread->start();
+ threads.push_back(refresh_thread);
+ }
+ for (auto *thread : threads) {
+ thread->wait();
+ thread->deleteLater();
+ }
+
+ emit SignalKeyDatabaseRefreshDone();
+ LOG(INFO) << "finished";
+ });
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
+ LOG(INFO) << "start thread";
thread->start();
}