11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
25PROMEKI_NAMESPACE_BEGIN
56class Process :
public ObjectBase {
57 PROMEKI_OBJECT(Process, ObjectBase)
72 Process(ObjectBase *parent =
nullptr);
83 const String &program()
const {
return _program; }
89 void setProgram(
const String &program) { _program = program; }
95 const List<String> &arguments()
const {
return _arguments; }
101 void setArguments(
const List<String> &args) { _arguments = args; }
107 const FilePath &workingDirectory()
const {
return _workingDirectory; }
115 void setWorkingDirectory(
const FilePath &dir) { _workingDirectory = dir; }
121 const Map<String, String> &environment()
const {
return _environment; }
129 void setEnvironment(
const Map<String, String> &env) { _environment = env; }
143 Error start(
const String &program,
const List<String> &args);
150 Error waitForStarted(
unsigned int timeoutMs = 0);
159 Error waitForFinished(
unsigned int timeoutMs = 0);
167 int exitCode()
const {
return _exitCode; }
173 bool isRunning()
const {
return _state == Running; }
179 State state()
const {
return _state; }
187 pid_t pid()
const {
return _pid; }
205 ssize_t writeToStdin(
const void *buf,
size_t bytes);
211 Buffer readAllStdout();
217 Buffer readAllStderr();
224 void closeWriteChannel();
228 PROMEKI_SIGNAL(started);
232 PROMEKI_SIGNAL(finished,
int);
236 PROMEKI_SIGNAL(readyReadStdout);
240 PROMEKI_SIGNAL(readyReadStderr);
244 PROMEKI_SIGNAL(errorOccurred, Error);
248 List<String> _arguments;
249 FilePath _workingDirectory;
250 Map<String, String> _environment;
251 State _state = NotRunning;
254 int _stdinPipe[2] = {-1, -1};
255 int _stdoutPipe[2] = {-1, -1};
256 int _stderrPipe[2] = {-1, -1};
257 List<Buffer> _stdoutChunks;
258 List<Buffer> _stderrChunks;
259 size_t _stdoutTotal = 0;
260 size_t _stderrTotal = 0;
263 void closeFd(
int &fd);
266 void closeAllPipes();
270 void drainFd(
int &fd, List<Buffer> &chunks,
size_t &total);
276 Buffer assembleChunks(List<Buffer> &chunks,
size_t &total);
279 bool collectExitStatus();