X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternaltask.h;h=9b9bc438867ce5884241249dedbe6b511af87ed8;hb=d1f9551e05c9d341149eb490e05b1465d3d6b711;hp=a5f10ec0b0c1486ce6b7b951d8dd10e668923cfb;hpb=666bf60f80a3f220a112c2a97ed00b72871924d3;p=builder.git diff --git a/source/externaltask.h b/source/externaltask.h index a5f10ec..9b9bc43 100644 --- a/source/externaltask.h +++ b/source/externaltask.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include "task.h" @@ -15,23 +16,27 @@ be captured. class ExternalTask: public Task { public: - enum Destination + enum StreamAction { - PASSTHROUGH, - CAPTURE, - IGNORE + PASSTHROUGH, //< Do not touch the stream + CAPTURE, //< Capture the stream + REDIRECT, //< Redirect the stream to/from a file + IGNORE //< Redirect the stream to oblivion }; - typedef std::vector Arguments; + using Arguments = Msp::Process::Arguments; private: Arguments argv; Msp::FS::Path work_dir; - int pid; - int exit_code; - Destination stdout_dest; - Destination stderr_dest; - Msp::IO::Pipe *capture_pipe; + Msp::Process *process = 0; + int exit_code = -1; + StreamAction stdin_action = PASSTHROUGH; + Msp::FS::Path stdin_file; + StreamAction stdout_action = PASSTHROUGH; + Msp::FS::Path stdout_file; + StreamAction stderr_action = PASSTHROUGH; + Msp::IO::Pipe *capture_pipe = 0; std::string output; public: @@ -40,23 +45,35 @@ public: name. If the working directory is not specified, no chdir is done. */ ExternalTask(const Arguments &, const Msp::FS::Path & = Msp::FS::Path()); - virtual ~ExternalTask(); + ~ExternalTask(); - virtual std::string get_command() const; - virtual void start(); - virtual Status check(); - Status wait(); + std::string get_command() const override; + void start() override; + Status check() override; + Status wait() override; private: Status do_wait(bool); public: - void set_stdout(Destination); - void set_stderr(Destination); + /// Redirect stdin from a file. Has no effect after the task is started. + void set_stdin(const Msp::FS::Path &); + + /// Sets destination for stdout. Has no effect after the task is started. + void set_stdout(StreamAction); + + /// Redirect stdout to a file. Has no effect after the task is started. + void set_stdout(const Msp::FS::Path &); + + /// Sets destination for stderr. Has no effect after the task is started. + void set_stderr(StreamAction); + + /** Returns captured output, if any. This may be called while the task is + still running, but it will always return all output. */ const std::string &get_output() const { return output; } - /** Executes a command and captures its output. Stderr is ignored, but if - the command exits with a nonzero status, an exception is thrown. */ - static std::string run_and_capture_output(const Arguments &, const Msp::FS::Path & = Msp::FS::Path()); + /** Executes a command and captures its output. If the command exits with + a nonzero status, an exception is thrown. */ + static std::string run_and_capture_output(const Arguments &, const Msp::FS::Path & = Msp::FS::Path(), bool = false); }; #endif