diff options
author | Saturneric <[email protected]> | 2021-12-14 11:28:53 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2021-12-14 11:28:53 +0000 |
commit | 50efbe1fcc7d0ebf5dd814a36602f88ec01d2b3a (patch) | |
tree | f64a58f0572b6af09323273b073e39fda78dff33 | |
parent | Add Deb Build Support & Install Support For Linux. (diff) | |
download | GpgFrontend-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.txt | 2 | ||||
-rw-r--r-- | src/gpg/GpgConstants.cpp | 29 | ||||
-rw-r--r-- | src/gpg/GpgConstants.h | 29 | ||||
-rw-r--r-- | src/gpg/function/BasicOperator.cpp | 16 | ||||
-rw-r--r-- | src/gpg/function/GpgKeyGetter.cpp | 15 | ||||
-rw-r--r-- | src/gpg/function/GpgKeyGetter.h | 4 | ||||
-rw-r--r-- | src/gpg/model/GpgKey.h | 7 | ||||
-rw-r--r-- | src/main.cpp | 3 | ||||
-rw-r--r-- | src/ui/UserInterfaceUtils.cpp | 13 | ||||
-rw-r--r-- | src/ui/UserInterfaceUtils.h | 2 | ||||
-rw-r--r-- | src/ui/main_window/MainWindowFileSlotFunction.cpp | 8 | ||||
-rw-r--r-- | src/ui/main_window/MainWindowSlotFunction.cpp | 8 | ||||
-rw-r--r-- | src/ui/widgets/KeyList.cpp | 32 | ||||
-rw-r--r-- | src/ui/widgets/KeyList.h | 4 |
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: |