]> git.tdb.fi Git - builder.git/blobdiff - source/externaltask.h
Rewrite ExternalTask to use Msp::Process
[builder.git] / source / externaltask.h
index 8127c75762459f9a4c73f1c532412a7567c45281..992df5c692a4c7bf8dfd6e6a208d2c64f15afdc0 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <string>
 #include <vector>
+#include <msp/core/process.h>
 #include <msp/fs/path.h>
 #include <msp/io/pipe.h>
 #include "task.h"
@@ -17,17 +18,17 @@ class ExternalTask: public Task
 public:
        enum Destination
        {
-               PASSTHROUGH,
-               CAPTURE,
-               IGNORE
+               PASSTHROUGH,  //< Do not touch the stream
+               CAPTURE,      //< Capture the stream
+               IGNORE        //< Redirect the stream to oblivion
        };
 
-       typedef std::vector<std::string> Arguments;
+       typedef Msp::Process::Arguments Arguments;
 
 private:
        Arguments argv;
        Msp::FS::Path work_dir;
-       int pid;
+       Msp::Process *process;
        int exit_code;
        Destination stdout_dest;
        Destination stderr_dest;
@@ -45,10 +46,24 @@ public:
        virtual std::string get_command() const;
        virtual void start();
        virtual Status check();
+       virtual Status wait();
+private:
+       Status do_wait(bool);
 
+public:
+       /// Sets destination for stdout.  Has no effect after the task is started.
        void set_stdout(Destination);
+
+       /// Sets destination for stderr.  Has no effect after the task is started.
        void set_stderr(Destination);
+
+       /** 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());
 };
 
 #endif