aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2021-12-14 11:28:53 +0000
committerSaturneric <[email protected]>2021-12-14 11:28:53 +0000
commit50efbe1fcc7d0ebf5dd814a36602f88ec01d2b3a (patch)
treef64a58f0572b6af09323273b073e39fda78dff33
parentAdd Deb Build Support & Install Support For Linux. (diff)
downloadGpgFrontend-50efbe1fcc7d0ebf5dd814a36602f88ec01d2b3a.tar.gz
GpgFrontend-50efbe1fcc7d0ebf5dd814a36602f88ec01d2b3a.zip
Modified Core to Optimization & Fixed Problem
1. GpgKey copy ability 2. GpgXXResult type to shared_ptr 3. KeyList Optimization 4. Fixed Loading Dialog Problem
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/gpg/GpgConstants.cpp29
-rw-r--r--src/gpg/GpgConstants.h29
-rw-r--r--src/gpg/function/BasicOperator.cpp16
-rw-r--r--src/gpg/function/GpgKeyGetter.cpp15
-rw-r--r--src/gpg/function/GpgKeyGetter.h4
-rw-r--r--src/gpg/model/GpgKey.h7
-rw-r--r--src/main.cpp3
-rw-r--r--src/ui/UserInterfaceUtils.cpp13
-rw-r--r--src/ui/UserInterfaceUtils.h2
-rw-r--r--src/ui/main_window/MainWindowFileSlotFunction.cpp8
-rw-r--r--src/ui/main_window/MainWindowSlotFunction.cpp8
-rw-r--r--src/ui/widgets/KeyList.cpp32
-rw-r--r--src/ui/widgets/KeyList.h4
14 files changed, 124 insertions, 48 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d5c6a8d8..2d91ab27 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.16)
-project(GpgFrontend VERSION 2.0.2 LANGUAGES CXX)
+project(GpgFrontend VERSION 2.0.3 LANGUAGES CXX)
message(STATUS "GpgFrontend Build Configuration Started CMAKE Version ${CMAKE_VERSION}")
diff --git a/src/gpg/GpgConstants.cpp b/src/gpg/GpgConstants.cpp
index 2454daa2..d38cafe3 100644
--- a/src/gpg/GpgConstants.cpp
+++ b/src/gpg/GpgConstants.cpp
@@ -190,3 +190,32 @@ int GpgFrontend::text_is_signed(GpgFrontend::BypeArrayRef text) {
else
return 0;
}
+
+GpgFrontend::GpgEncrResult GpgFrontend::_new_result(
+ gpgme_encrypt_result_t&& result) {
+ gpgme_result_ref(result);
+ return {result, _result_ref_deletor()};
+}
+
+GpgFrontend::GpgDecrResult GpgFrontend::_new_result(
+ gpgme_decrypt_result_t&& result) {
+ gpgme_result_ref(result);
+ return {result, _result_ref_deletor()};
+}
+
+GpgFrontend::GpgSignResult GpgFrontend::_new_result(
+ gpgme_sign_result_t&& result) {
+ gpgme_result_ref(result);
+ return {result, _result_ref_deletor()};
+}
+
+GpgFrontend::GpgVerifyResult GpgFrontend::_new_result(
+ gpgme_verify_result_t&& result) {
+ gpgme_result_ref(result);
+ return {result, _result_ref_deletor()};
+}
+
+void GpgFrontend::_result_ref_deletor::operator()(void* _result) {
+ DLOG(INFO) << "Called" << _result;
+ if (_result != nullptr) gpgme_result_unref(_result);
+}
diff --git a/src/gpg/GpgConstants.h b/src/gpg/GpgConstants.h
index 1cd0f64d..14895df7 100644
--- a/src/gpg/GpgConstants.h
+++ b/src/gpg/GpgConstants.h
@@ -25,8 +25,6 @@
#ifndef GPG_CONSTANTS_H
#define GPG_CONSTANTS_H
-#include "GpgFrontend.h"
-
#include <gpg-error.h>
#include <gpgme.h>
@@ -35,6 +33,8 @@
#include <memory>
#include <string>
+#include "GpgFrontend.h"
+
const int RESTART_CODE = 1000;
namespace GpgFrontend {
@@ -49,22 +49,21 @@ using StringArgsRef = std::vector<std::string>&;
using GpgError = gpgme_error_t;
-// Result Deletor
+// Result Deleter
struct _result_ref_deletor {
- void operator()(void* _result) {
- // if (_result != nullptr)
- // gpgme_result_unref(_result);
- }
+ void operator()(void* _result);
};
-using GpgEncrResult =
- std::unique_ptr<struct _gpgme_op_encrypt_result, _result_ref_deletor>;
-using GpgDecrResult =
- std::unique_ptr<struct _gpgme_op_decrypt_result, _result_ref_deletor>;
-using GpgSignResult =
- std::unique_ptr<struct _gpgme_op_sign_result, _result_ref_deletor>;
-using GpgVerifyResult =
- std::unique_ptr<struct _gpgme_op_verify_result, _result_ref_deletor>;
+using GpgEncrResult = std::shared_ptr<struct _gpgme_op_encrypt_result>;
+using GpgDecrResult = std::shared_ptr<struct _gpgme_op_decrypt_result>;
+using GpgSignResult = std::shared_ptr<struct _gpgme_op_sign_result>;
+using GpgVerifyResult = std::shared_ptr<struct _gpgme_op_verify_result>;
+
+// Convert from gpgme_xxx_result to GpgXXXResult
+GpgEncrResult _new_result(gpgme_encrypt_result_t&& result);
+GpgDecrResult _new_result(gpgme_decrypt_result_t&& result);
+GpgSignResult _new_result(gpgme_sign_result_t&& result);
+GpgVerifyResult _new_result(gpgme_verify_result_t&& result);
// Error Info Printer
GpgError check_gpg_error(GpgError err);
diff --git a/src/gpg/function/BasicOperator.cpp b/src/gpg/function/BasicOperator.cpp
index 5f6ffb85..f91282c4 100644
--- a/src/gpg/function/BasicOperator.cpp
+++ b/src/gpg/function/BasicOperator.cpp
@@ -48,7 +48,7 @@ GpgFrontend::GpgError GpgFrontend::BasicOperator::Encrypt(
auto temp_data_out = data_out.Read2Buffer();
std::swap(temp_data_out, out_buffer);
- auto temp_result = GpgEncrResult(gpgme_op_encrypt_result(ctx));
+ auto temp_result = _new_result(gpgme_op_encrypt_result(ctx));
std::swap(result, temp_result);
return err;
@@ -65,7 +65,7 @@ GpgFrontend::GpgError GpgFrontend::BasicOperator::Decrypt(
auto temp_data_out = data_out.Read2Buffer();
std::swap(temp_data_out, out_buffer);
- auto temp_result = GpgDecrResult(gpgme_op_decrypt_result(ctx));
+ auto temp_result = _new_result(gpgme_op_decrypt_result(ctx));
std::swap(result, temp_result);
return err;
@@ -86,7 +86,7 @@ GpgFrontend::GpgError GpgFrontend::BasicOperator::Verify(
} else
err = check_gpg_error(gpgme_op_verify(ctx, data_in, nullptr, data_out));
- auto temp_result = GpgVerifyResult(gpgme_op_verify_result(ctx));
+ auto temp_result = _new_result(gpgme_op_verify_result(ctx));
std::swap(result, temp_result);
return err;
@@ -122,7 +122,7 @@ GpgFrontend::GpgError GpgFrontend::BasicOperator::Sign(KeyListPtr keys,
auto temp_data_out = data_out.Read2Buffer();
std::swap(temp_data_out, out_buffer);
- auto temp_result = GpgSignResult(gpgme_op_sign_result(ctx));
+ auto temp_result = _new_result(gpgme_op_sign_result(ctx));
std::swap(result, temp_result);
@@ -141,10 +141,10 @@ gpgme_error_t GpgFrontend::BasicOperator::DecryptVerify(
auto temp_data_out = data_out.Read2Buffer();
std::swap(temp_data_out, out_buffer);
- auto temp_decr_result = GpgDecrResult(gpgme_op_decrypt_result(ctx));
+ auto temp_decr_result = _new_result(gpgme_op_decrypt_result(ctx));
std::swap(decrypt_result, temp_decr_result);
- auto temp_verify_result = GpgVerifyResult(gpgme_op_verify_result(ctx));
+ auto temp_verify_result = _new_result(gpgme_op_verify_result(ctx));
std::swap(verify_result, temp_verify_result);
return err;
@@ -176,9 +176,9 @@ gpgme_error_t GpgFrontend::BasicOperator::EncryptSign(
auto temp_data_out = data_out.Read2Buffer();
std::swap(temp_data_out, out_buffer);
- auto temp_encr_result = GpgEncrResult(gpgme_op_encrypt_result(ctx));
+ auto temp_encr_result = _new_result(gpgme_op_encrypt_result(ctx));
swap(encr_result, temp_encr_result);
- auto temp_sign_result = GpgSignResult(gpgme_op_sign_result(ctx));
+ auto temp_sign_result = _new_result(gpgme_op_sign_result(ctx));
swap(sign_result, temp_sign_result);
return err;
diff --git a/src/gpg/function/GpgKeyGetter.cpp b/src/gpg/function/GpgKeyGetter.cpp
index be27d69e..26973eda 100644
--- a/src/gpg/function/GpgKeyGetter.cpp
+++ b/src/gpg/function/GpgKeyGetter.cpp
@@ -67,9 +67,24 @@ GpgFrontend::KeyLinkListPtr GpgFrontend::GpgKeyGetter::FetchKey() {
return keys_list;
}
+
GpgFrontend::KeyListPtr GpgFrontend::GpgKeyGetter::GetKeys(
const KeyIdArgsListPtr& ids) {
auto keys = std::make_unique<KeyArgsList>();
for (const auto& id : *ids) keys->push_back(GetKey(id));
return keys;
}
+
+GpgFrontend::KeyLinkListPtr GpgFrontend::GpgKeyGetter::GetKeysCopy(
+ const GpgFrontend::KeyLinkListPtr& keys) {
+ auto keys_copy = std::make_unique<GpgKeyLinkList>();
+ for (const auto& key : *keys) keys_copy->push_back(key.copy());
+ return keys_copy;
+}
+
+GpgFrontend::KeyListPtr GpgFrontend::GpgKeyGetter::GetKeysCopy(
+ const GpgFrontend::KeyListPtr& keys) {
+ auto keys_copy = std::make_unique<KeyArgsList>();
+ for (const auto& key : *keys) keys_copy->push_back(key.copy());
+ return keys_copy;
+}
diff --git a/src/gpg/function/GpgKeyGetter.h b/src/gpg/function/GpgKeyGetter.h
index c8f5d73a..3af51815 100644
--- a/src/gpg/function/GpgKeyGetter.h
+++ b/src/gpg/function/GpgKeyGetter.h
@@ -43,6 +43,10 @@ class GpgKeyGetter : public SingletonFunctionObject<GpgKeyGetter> {
KeyLinkListPtr FetchKey();
+ static KeyListPtr GetKeysCopy(const KeyListPtr& keys);
+
+ static KeyLinkListPtr GetKeysCopy(const KeyLinkListPtr& keys);
+
private:
GpgContext& ctx =
GpgContext::GetInstance(SingletonFunctionObject::GetDefaultChannel());
diff --git a/src/gpg/model/GpgKey.h b/src/gpg/model/GpgKey.h
index 3bebcd41..5ddfa94b 100644
--- a/src/gpg/model/GpgKey.h
+++ b/src/gpg/model/GpgKey.h
@@ -144,9 +144,16 @@ class GpgKey {
explicit operator gpgme_key_t() const { return _key_ref.get(); }
+ [[nodiscard]] GpgKey copy() const {
+ gpgme_key_ref(_key_ref.get());
+ auto* _new_key_ref = _key_ref.get();
+ return GpgKey(std::move(_new_key_ref));
+ }
+
private:
struct _key_ref_deletor {
void operator()(gpgme_key_t _key) {
+ DLOG(INFO) << "Called" << _key;
if (_key != nullptr) gpgme_key_unref(_key);
}
};
diff --git a/src/main.cpp b/src/main.cpp
index 5faf34a9..7e46229e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -26,6 +26,7 @@
#include "GpgFrontendBuildInfo.h"
#include "gpg/GpgContext.h"
+#include "gpg/function/GpgKeyGetter.h"
#include "ui/MainWindow.h"
#include "ui/WaitingDialog.h"
#include "ui/settings/GlobalSettingStation.h"
@@ -86,6 +87,8 @@ int main(int argc, char* argv[]) {
QCoreApplication::quit();
exit(0);
}
+ // Try fetching key
+ GpgFrontend::GpgKeyGetter::GetInstance().FetchKey();
});
QApplication::connect(init_ctx_thread, &QThread::finished, init_ctx_thread,
diff --git a/src/ui/UserInterfaceUtils.cpp b/src/ui/UserInterfaceUtils.cpp
index 3c10009a..9e5fab10 100644
--- a/src/ui/UserInterfaceUtils.cpp
+++ b/src/ui/UserInterfaceUtils.cpp
@@ -24,6 +24,8 @@
#include "UserInterfaceUtils.h"
+#include <utility>
+
#include "gpg/result_analyse/ResultAnalyse.h"
#include "ui/SignalStation.h"
#include "ui/WaitingDialog.h"
@@ -36,15 +38,12 @@ std::unique_ptr<GpgFrontend::UI::CommonUtils>
GpgFrontend::UI::CommonUtils::_instance = nullptr;
void show_verify_details(QWidget* parent, InfoBoardWidget* info_board,
- GpgError error, VerifyResultAnalyse& verify_res) {
+ GpgError error, const GpgVerifyResult& verify_result) {
// take out result
- auto _result = verify_res.TakeChargeOfResult();
info_board->resetOptionActionsMenu();
- info_board->addOptionalAction(
- "Show Verify Details", [parent, error, _result_ptr = _result.get()]() {
- VerifyDetailsDialog(parent, error, GpgVerifyResult(_result_ptr));
- });
- _result.reset(nullptr);
+ info_board->addOptionalAction("Show Verify Details", [=]() {
+ VerifyDetailsDialog(parent, error, verify_result);
+ });
}
void import_unknown_key_from_keyserver(QWidget* parent,
diff --git a/src/ui/UserInterfaceUtils.h b/src/ui/UserInterfaceUtils.h
index 7b05658f..18eb04d0 100644
--- a/src/ui/UserInterfaceUtils.h
+++ b/src/ui/UserInterfaceUtils.h
@@ -38,7 +38,7 @@ class InfoBoardWidget;
class TextEdit;
void show_verify_details(QWidget* parent, InfoBoardWidget* info_board,
- GpgError error, VerifyResultAnalyse& verify_res);
+ GpgError error, const GpgVerifyResult& verify_result);
void import_unknown_key_from_keyserver(QWidget* parent,
const VerifyResultAnalyse& verify_res);
diff --git a/src/ui/main_window/MainWindowFileSlotFunction.cpp b/src/ui/main_window/MainWindowFileSlotFunction.cpp
index 535f47af..2a2c9be9 100644
--- a/src/ui/main_window/MainWindowFileSlotFunction.cpp
+++ b/src/ui/main_window/MainWindowFileSlotFunction.cpp
@@ -289,7 +289,7 @@ void MainWindow::slotFileVerify() {
});
if (!if_error) {
- auto result_analyse = VerifyResultAnalyse(error, std::move(result));
+ auto result_analyse = VerifyResultAnalyse(error, result);
result_analyse.analyse();
process_result_analyse(edit, infoBoard, result_analyse);
@@ -297,7 +297,7 @@ void MainWindow::slotFileVerify() {
import_unknown_key_from_keyserver(this, result_analyse);
if (result_analyse.getStatus() >= 0)
- show_verify_details(this, infoBoard, error, result_analyse);
+ show_verify_details(this, infoBoard, error, result);
fileTreeView->update();
} else {
@@ -431,7 +431,7 @@ void MainWindow::slotFileDecryptVerify() {
if (!if_error) {
auto decrypt_res = DecryptResultAnalyse(error, std::move(d_result));
- auto verify_res = VerifyResultAnalyse(error, std::move(v_result));
+ auto verify_res = VerifyResultAnalyse(error, v_result);
decrypt_res.analyse();
verify_res.analyse();
process_result_analyse(edit, infoBoard, decrypt_res, verify_res);
@@ -440,7 +440,7 @@ void MainWindow::slotFileDecryptVerify() {
import_unknown_key_from_keyserver(this, verify_res);
if (verify_res.getStatus() >= 0)
- show_verify_details(this, infoBoard, error, verify_res);
+ show_verify_details(this, infoBoard, error, v_result);
fileTreeView->update();
} else {
diff --git a/src/ui/main_window/MainWindowSlotFunction.cpp b/src/ui/main_window/MainWindowSlotFunction.cpp
index 41549182..6f51bfcf 100644
--- a/src/ui/main_window/MainWindowSlotFunction.cpp
+++ b/src/ui/main_window/MainWindowSlotFunction.cpp
@@ -261,7 +261,7 @@ void MainWindow::slotVerify() {
});
if (!if_error) {
- auto result_analyse = VerifyResultAnalyse(error, std::move(result));
+ auto result_analyse = VerifyResultAnalyse(error, result);
result_analyse.analyse();
process_result_analyse(edit, infoBoard, result_analyse);
@@ -269,7 +269,7 @@ void MainWindow::slotVerify() {
import_unknown_key_from_keyserver(this, result_analyse);
if (result_analyse.getStatus() >= 0)
- show_verify_details(this, infoBoard, error, result_analyse);
+ show_verify_details(this, infoBoard, error, result);
}
}
@@ -434,7 +434,7 @@ void MainWindow::slotDecryptVerify() {
if (!if_error) {
auto decrypt_res = DecryptResultAnalyse(error, std::move(d_result));
- auto verify_res = VerifyResultAnalyse(error, std::move(v_result));
+ auto verify_res = VerifyResultAnalyse(error, v_result);
decrypt_res.analyse();
verify_res.analyse();
process_result_analyse(edit, infoBoard, decrypt_res, verify_res);
@@ -445,7 +445,7 @@ void MainWindow::slotDecryptVerify() {
import_unknown_key_from_keyserver(this, verify_res);
if (verify_res.getStatus() >= 0)
- show_verify_details(this, infoBoard, error, verify_res);
+ show_verify_details(this, infoBoard, error, v_result);
} else {
QMessageBox::critical(this, _("Error"),
diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp
index 02a12e80..9ce49d89 100644
--- a/src/ui/widgets/KeyList.cpp
+++ b/src/ui/widgets/KeyList.cpp
@@ -61,12 +61,17 @@ void KeyList::init() {
SLOT(slotRefresh()));
setAcceptDrops(true);
+
+ // buffered keys list
+ _buffered_keys_list = GpgKeyGetter::GetInstance().FetchKey();
}
void KeyList::addListGroupTab(
const QString& name, KeyListRow::KeyType selectType,
KeyListColumn::InfoType infoType,
const std::function<bool(const GpgKey&)>& filter) {
+ LOG(INFO) << _("Called") << name.toStdString();
+
auto key_list = new QTableWidget(this);
if (mKeyList == nullptr) {
mKeyList = key_list;
@@ -121,15 +126,18 @@ void KeyList::addListGroupTab(
connect(key_list, &QTableWidget::doubleClicked, this,
&KeyList::slotDoubleClicked);
- // refresh
- mKeyTables.back().Refresh();
+ // refresh Optimization
+ if (_buffered_keys_list != nullptr)
+ mKeyTables.back().Refresh(GpgKeyGetter::GetKeysCopy(_buffered_keys_list));
+ else
+ mKeyTables.back().Refresh();
}
void KeyList::slotRefresh() {
- LOG(INFO) << _("called");
-
+ LOG(INFO) << _("Called");
+ _buffered_keys_list = GpgKeyGetter::GetInstance().FetchKey();
for (auto& key_table : mKeyTables) {
- key_table.Refresh();
+ key_table.Refresh(GpgKeyGetter::GetKeysCopy(_buffered_keys_list));
}
}
@@ -389,14 +397,22 @@ void KeyTable::SetChecked(const KeyIdArgsListPtr& key_ids) {
}
}
-void KeyTable::Refresh() {
+void KeyTable::Refresh(KeyLinkListPtr m_keys) {
+ LOG(INFO) << "Called";
+
auto checked_key_list = GetChecked();
// while filling the table, sort enabled causes errors
key_list->setSortingEnabled(false);
key_list->clearContents();
- auto keys = GpgKeyGetter::GetInstance().FetchKey();
+ // Optimization for copy
+ KeyLinkListPtr keys = nullptr;
+ if (m_keys == nullptr)
+ keys = GpgKeyGetter::GetInstance().FetchKey();
+ else
+ keys = std::move(m_keys);
+
auto it = keys->begin();
int row_count = 0;
@@ -491,5 +507,7 @@ void KeyTable::Refresh() {
}
SetChecked(checked_key_list);
+
+ LOG(INFO) << "End";
}
} // namespace GpgFrontend::UI
diff --git a/src/ui/widgets/KeyList.h b/src/ui/widgets/KeyList.h
index f09ae2ac..842cc6b3 100644
--- a/src/ui/widgets/KeyList.h
+++ b/src/ui/widgets/KeyList.h
@@ -68,7 +68,7 @@ struct KeyTable {
info_type(_info_type),
filter(std::move(_filter)) {}
- void Refresh();
+ void Refresh(KeyLinkListPtr m_keys = nullptr);
KeyIdArgsListPtr GetChecked();
@@ -134,6 +134,8 @@ class KeyList : public QWidget {
QMenu* popupMenu{};
+ GpgFrontend::KeyLinkListPtr _buffered_keys_list;
+
std::function<void(const GpgKey&, QWidget*)> mAction = nullptr;
private slots: