From e2d30cc0194db74b77e3c06dbaf9c597bb82c860 Mon Sep 17 00:00:00 2001 From: Saturneric Date: Sun, 5 Sep 2021 21:41:00 +0000 Subject: Adjust the code structure. Introduce log library. Remove Qt from the core code. --- src/gpg/function/GpgCommandExecutor.cpp | 50 ++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 22 deletions(-) (limited to 'src/gpg/function/GpgCommandExecutor.cpp') diff --git a/src/gpg/function/GpgCommandExecutor.cpp b/src/gpg/function/GpgCommandExecutor.cpp index c36cb2b6..dc4750ef 100644 --- a/src/gpg/function/GpgCommandExecutor.cpp +++ b/src/gpg/function/GpgCommandExecutor.cpp @@ -23,27 +23,33 @@ */ #include "gpg/function/GpgCommandExecutor.h" +#include + +using boost::process::async_pipe; + void GpgFrontend::GpgCommandExecutor::Execute( - const QStringList &arguments, - const std::function &interact_func) { - QEventLoop looper; - auto *gpg_process = new QProcess(&looper); - gpg_process->setProcessChannelMode(QProcess::MergedChannels); - connect(gpg_process, - qOverload(&QProcess::finished), &looper, - &QEventLoop::quit); - connect(gpg_process, &QProcess::errorOccurred, - []() -> void { qDebug("Error in Process"); }); - connect(gpg_process, &QProcess::errorOccurred, &looper, &QEventLoop::quit); - connect(gpg_process, &QProcess::started, - []() -> void { qDebug() << "Gpg Process Started Success"; }); - connect(gpg_process, &QProcess::readyReadStandardOutput, - [interact_func, gpg_process]() { - qDebug() << "Function Called"; - interact_func(gpg_process); - }); - gpg_process->setProgram(ctx.GetInfo().appPath.c_str()); - gpg_process->setArguments(arguments); - gpg_process->start(); - looper.exec(); + StringArgsRef arguments, + const std::function &interact_func) { + + using namespace boost::process; + + boost::asio::io_service ios; + + std::vector buf; + + async_pipe in_pipe_stream(ios); + async_pipe out_pipe_stream(ios); + + child child_process(ctx.GetInfo().appPath.c_str(), arguments, + std_out > in_pipe_stream, std_in < out_pipe_stream); + + boost::asio::async_read( + in_pipe_stream, boost::asio::buffer(buf), + [&](const boost::system::error_code &ec, std::size_t size) { + interact_func(in_pipe_stream, out_pipe_stream); + }); + + ios.run(); + child_process.wait(); + int result = child_process.exit_code(); } -- cgit v1.2.3