]> git.tdb.fi Git - builder.git/blobdiff - source/lib/task.h
Rearrange sources into subdirectories
[builder.git] / source / lib / task.h
diff --git a/source/lib/task.h b/source/lib/task.h
new file mode 100644 (file)
index 0000000..915ffe1
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef TASK_H_
+#define TASK_H_
+
+#include <string>
+#include <sigc++/signal.h>
+#include <msp/fs/path.h>
+
+/**
+Tasks are used to manage other programs and worker threads involved in the
+build process.  They are run asynchronously by default, but a wait() method is
+provided should it be necessary to wait for a task to finish.
+*/
+class Task
+{
+public:
+       enum Status
+       {
+               RUNNING,
+               SUCCESS,
+               ERROR
+       };
+
+       sigc::signal<void, bool> signal_finished;
+
+protected:
+       std::vector<Msp::FS::Path> files;
+       bool unlink = false;
+
+       Task() = default;
+public:
+       virtual ~Task() { }
+
+       /** Associate the task with a file. */
+       void add_file(const Msp::FS::Path &);
+
+       /** If set to true, the associated files are removed before the task is
+       started. */
+       void set_unlink(bool = true);
+
+       /** Returns the command being executed for this task.  Only makes sense if
+       an external command is involved. */
+       virtual std::string get_command() const = 0;
+
+       /// Starts the task.
+       virtual void start() = 0;
+
+protected:
+       /// Ensures that the output directory exists and removes files if necessary.
+       void prepare();
+
+public:
+       /// Checks the status of the task and immediately returns.
+       virtual Status check() = 0;
+
+       /// Waits for the task to finish and returns its final status.
+       virtual Status wait() = 0;
+};
+
+#endif