aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/function/gpg/GpgCommandExecutor.cpp
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2023-10-16 20:19:26 +0000
committersaturneric <[email protected]>2023-10-16 20:19:26 +0000
commit5175b3ae6687839afa2cdfe01f2fd70d714024ed (patch)
tree96eef7e087749c9118d5da7a838fdd81b0e96354 /src/core/function/gpg/GpgCommandExecutor.cpp
parentfeat: using piml tech on plugin system (diff)
downloadGpgFrontend-5175b3ae6687839afa2cdfe01f2fd70d714024ed.tar.gz
GpgFrontend-5175b3ae6687839afa2cdfe01f2fd70d714024ed.zip
refactor: use c++17 features and piml tech to rewrite DataObject and Task
Diffstat (limited to 'src/core/function/gpg/GpgCommandExecutor.cpp')
-rw-r--r--src/core/function/gpg/GpgCommandExecutor.cpp106
1 files changed, 47 insertions, 59 deletions
diff --git a/src/core/function/gpg/GpgCommandExecutor.cpp b/src/core/function/gpg/GpgCommandExecutor.cpp
index dcb188ec..7d5ecc24 100644
--- a/src/core/function/gpg/GpgCommandExecutor.cpp
+++ b/src/core/function/gpg/GpgCommandExecutor.cpp
@@ -27,48 +27,56 @@
*/
#include "GpgCommandExecutor.h"
+#include <memory>
+#include <string>
+
#include "GpgFunctionObject.h"
#include "core/thread/TaskRunnerGetter.h"
+#include "thread/DataObject.h"
GpgFrontend::GpgCommandExecutor::GpgCommandExecutor(int channel)
: SingletonFunctionObject<GpgCommandExecutor>(channel) {}
void GpgFrontend::GpgCommandExecutor::Execute(
std::string cmd, std::vector<std::string> arguments,
- std::function<void(int, std::string, std::string)> callback,
- std::function<void(QProcess *)> interact_func) {
+ GpgCommandExecutorCallback callback,
+ GpgCommandExecutorInteractor interact_func) {
SPDLOG_DEBUG("called cmd {} arguments size: {}", cmd, arguments.size());
Thread::Task::TaskCallback result_callback =
- [](int rtn, Thread::Task::DataObjectPtr data_object) {
+ [](int rtn, Thread::DataObjectPtr data_object) {
SPDLOG_DEBUG("data object use count: {}", data_object.use_count());
- if (data_object->GetObjectSize() != 4)
+ if (!data_object->Check<int, std::string, std::string>())
throw std::runtime_error("invalid data object size");
- auto exit_code = data_object->PopObject<int>();
- auto process_stdout = data_object->PopObject<std::string>();
- auto process_stderr = data_object->PopObject<std::string>();
- auto callback = data_object->PopObject<
- std::function<void(int, std::string, std::string)>>();
+ auto exit_code = Thread::ExtractParams<int>(data_object, 0);
+ auto process_stdout =
+ Thread::ExtractParams<std::string>(data_object, 1);
+ auto process_stderr =
+ Thread::ExtractParams<std::string>(data_object, 2);
+ auto callback =
+ Thread::ExtractParams<GpgCommandExecutorCallback>(data_object, 3);
// call callback
callback(exit_code, process_stdout, process_stderr);
};
Thread::Task::TaskRunnable runner =
- [](GpgFrontend::Thread::Task::DataObjectPtr data_object) -> int {
+ [](Thread::DataObjectPtr data_object) -> int {
SPDLOG_DEBUG("process runner called, data object size: {}",
data_object->GetObjectSize());
- if (data_object->GetObjectSize() != 4)
+ if (!data_object
+ ->Check<std::string, std::string, GpgCommandExecutorInteractor>())
throw std::runtime_error("invalid data object size");
// get arguments
- auto cmd = data_object->PopObject<std::string>();
+ auto cmd = Thread::ExtractParams<std::string>(data_object, 0);
SPDLOG_DEBUG("get cmd: {}", cmd);
- auto arguments = data_object->PopObject<std::vector<std::string>>();
+ auto arguments =
+ Thread::ExtractParams<std::vector<std::string>>(data_object, 1);
auto interact_func =
- data_object->PopObject<std::function<void(QProcess *)>>();
+ Thread::ExtractParams<GpgCommandExecutorInteractor>(data_object, 2);
auto *cmd_process = new QProcess();
cmd_process->setProcessChannelMode(QProcess::MergedChannels);
@@ -120,27 +128,13 @@ void GpgFrontend::GpgCommandExecutor::Execute(
cmd_process->close();
cmd_process->deleteLater();
- // transfer result
- SPDLOG_DEBUG("runner append object");
- data_object->AppendObject(std::move(process_stderr));
- data_object->AppendObject(std::move(process_stdout));
- data_object->AppendObject(std::move(exit_code));
- SPDLOG_DEBUG("runner append object done");
-
+ data_object->Swap({exit_code, process_stdout, process_stderr});
return 0;
};
- // data transfer into task
- auto data_object = std::make_shared<Thread::Task::DataObject>();
- SPDLOG_DEBUG("executor append object");
- data_object->AppendObject(std::move(callback));
- data_object->AppendObject(std::move(interact_func));
- data_object->AppendObject(std::move(arguments));
- data_object->AppendObject(std::move(std::string{cmd}));
- SPDLOG_DEBUG("executor append object done");
-
auto *process_task = new GpgFrontend::Thread::Task(
- std::move(runner), fmt::format("Execute/{}", cmd), data_object,
+ std::move(runner), fmt::format("Execute/{}", cmd),
+ Thread::TransferParams(cmd, arguments, interact_func, callback),
std::move(result_callback));
QEventLoop looper;
@@ -158,40 +152,43 @@ void GpgFrontend::GpgCommandExecutor::Execute(
void GpgFrontend::GpgCommandExecutor::ExecuteConcurrently(
std::string cmd, std::vector<std::string> arguments,
- std::function<void(int, std::string, std::string)> callback,
- std::function<void(QProcess *)> interact_func) {
+ GpgCommandExecutorCallback callback,
+ GpgCommandExecutorInteractor interact_func) {
SPDLOG_DEBUG("called cmd {} arguments size: {}", cmd, arguments.size());
Thread::Task::TaskCallback result_callback =
- [](int rtn, Thread::Task::DataObjectPtr data_object) {
- if (data_object->GetObjectSize() != 4)
+ [](int rtn, Thread::DataObjectPtr data_object) {
+ if (!data_object->Check<int, std::string, std::string,
+ GpgCommandExecutorCallback>())
throw std::runtime_error("invalid data object size");
- auto exit_code = data_object->PopObject<int>();
- auto process_stdout = data_object->PopObject<std::string>();
- auto process_stderr = data_object->PopObject<std::string>();
- auto callback = data_object->PopObject<
- std::function<void(int, std::string, std::string)>>();
+ auto exit_code = Thread::ExtractParams<int>(data_object, 0);
+ auto process_stdout =
+ Thread::ExtractParams<std::string>(data_object, 1);
+ auto process_stderr =
+ Thread::ExtractParams<std::string>(data_object, 2);
+ auto callback =
+ Thread::ExtractParams<GpgCommandExecutorCallback>(data_object, 3);
// call callback
callback(exit_code, process_stdout, process_stderr);
};
Thread::Task::TaskRunnable runner =
- [](GpgFrontend::Thread::Task::DataObjectPtr data_object) -> int {
+ [](GpgFrontend::Thread::DataObjectPtr data_object) -> int {
SPDLOG_DEBUG("process runner called, data object size: {}",
data_object->GetObjectSize());
- if (data_object->GetObjectSize() != 4)
+ if (!data_object
+ ->Check<std::string, std::string, GpgCommandExecutorInteractor>())
throw std::runtime_error("invalid data object size");
- SPDLOG_DEBUG("runner pop object");
// get arguments
- auto cmd = data_object->PopObject<std::string>();
- auto arguments = data_object->PopObject<std::vector<std::string>>();
+ auto cmd = Thread::ExtractParams<std::string>(data_object, 0);
+ auto arguments =
+ Thread::ExtractParams<std::vector<std::string>>(data_object, 1);
auto interact_func =
- data_object->PopObject<std::function<void(QProcess *)>>();
- SPDLOG_DEBUG("runner pop object done");
+ Thread::ExtractParams<std::function<void(QProcess *)>>(data_object, 2);
auto *cmd_process = new QProcess();
cmd_process->setProcessChannelMode(QProcess::MergedChannels);
@@ -244,22 +241,13 @@ void GpgFrontend::GpgCommandExecutor::ExecuteConcurrently(
cmd_process->close();
cmd_process->deleteLater();
- // transfer result
- SPDLOG_DEBUG("runner append object");
- data_object->AppendObject(std::move(process_stderr));
- data_object->AppendObject(std::move(process_stdout));
- data_object->AppendObject(std::move(exit_code));
- SPDLOG_DEBUG("runner append object done");
-
+ data_object->Swap({exit_code, process_stdout, process_stderr});
return 0;
};
// data transfer into task
- auto data_object = std::make_shared<Thread::Task::DataObject>();
- data_object->AppendObject(std::move(callback));
- data_object->AppendObject(std::move(interact_func));
- data_object->AppendObject(std::move(arguments));
- data_object->AppendObject(std::move(std::string{cmd}));
+ auto data_object =
+ Thread::TransferParams(cmd, arguments, interact_func, callback);
auto *process_task = new GpgFrontend::Thread::Task(
std::move(runner), fmt::format("ExecuteConcurrently/{}", cmd),