00001 #pragma once
00002
00003 #include <fstream>
00004 #include <memory>
00005 #include <mutex>
00006
00007 namespace FDR
00008 {
00009 typedef int64_t TaskId;
00010
00017 class ProgressReporter
00018 {
00019 public:
00020 ProgressReporter();
00021 virtual ~ProgressReporter();
00022
00023 enum
00024 {
00025 INVALID_TASK = 0,
00026 };
00027
00036 virtual void activate();
00037
00043 virtual void deactivate();
00044
00051 virtual void task_started(TaskId task_id, TaskId parent_task_id, const std::string& task_name);
00052
00054 virtual void task_finished(TaskId task_id);
00055
00057 virtual void task_message_output(TaskId task_id, const std::string& message);
00058
00060 virtual void task_status_updated(TaskId task_id, const std::string& new_status);
00061
00062 private:
00063 struct Data;
00064 std::unique_ptr<Data> data;
00065 };
00066
00068 class FileProgressReporter : public ProgressReporter
00069 {
00070 public:
00074 FileProgressReporter(const std::string& file_name);
00075
00076 void activate() override;
00077 void deactivate() override;
00078 void task_started(TaskId task_id, TaskId parent_task_id, const std::string& task_name) override;
00079 void task_finished(TaskId task_id) override;
00080 void task_message_output(TaskId task_id, const std::string& message) override;
00081 void task_status_updated(TaskId task_id, const std::string& new_status) override;
00082
00083 private:
00084 std::mutex mutex;
00085 std::ofstream stream;
00086 };
00087
00089 class StreamProgressReporter : public ProgressReporter
00090 {
00091 public:
00092 enum class StreamIdentifier
00093 {
00094 StdOut,
00095 StdErr,
00096 };
00097
00098 StreamProgressReporter(StreamIdentifier output_stream_identifier);
00099
00104 StreamProgressReporter(std::ostream& output_stream);
00105
00106 void activate() override;
00107 void deactivate() override;
00108 void task_started(TaskId task_id, TaskId parent_task_id, const std::string& task_name) override;
00109 void task_finished(TaskId task_id) override;
00110 void task_message_output(TaskId task_id, const std::string& message) override;
00111 void task_status_updated(TaskId task_id, const std::string& new_status) override;
00112
00113 private:
00114 std::mutex mutex;
00115 std::ostream& stream;
00116 };
00117
00118 }