Guitar
AbstractProcess.h
Go to the documentation of this file.
1 #ifndef ABSTRACTPROCESS_H
2 #define ABSTRACTPROCESS_H
3 
4 #include "ProcessHelper.h"
5 #include <cstdint>
6 #include <condition_variable>
7 #include <deque>
8 #include <functional>
9 #include <mutex>
10 #include <string>
11 #include <vector>
12 #include <limits.h>
13 
14 #ifdef APP_GUITAR
15 #include <QObject>
16 #include <QVariant>
17 #endif
18 
19 class QString;
20 
21 struct ProcessResult {
22  bool started_ = false;
23  bool running_ = false;
24  std::uint32_t exit_code_ = static_cast<std::uint32_t>(-1);
25  std::uint32_t error_code_ = 0;
26  std::string error_message_;
27 
28  bool started() const
29  {
30  return started_;
31  }
32 
33  bool running() const
34  {
35  return running_;
36  }
37 
38  std::uint32_t exit_code() const
39  {
40  return exit_code_;
41  }
42 
43  std::uint32_t error_code() const
44  {
45  return error_code_;
46  }
47 
48  std::string const &error_message() const
49  {
50  return error_message_;
51  }
52 };
53 
55 public:
56  virtual ~AbstractProcess() { }
57 
58  virtual void start(std::string const &command, bool use_input) = 0;
59  virtual ProcessResult wait(int time = INT_MAX) = 0;
60  virtual void stop() = 0;
61  virtual bool is_running() const = 0;
62  virtual int get_exit_code() const = 0;
63  virtual void write_input(char const *ptr, int len) = 0;
64 
65  virtual void close_input() = 0;
66 
67  virtual std::vector<char> const &stdout_bytes() const = 0;
68  virtual std::vector<char> const &stderr_bytes() const = 0;
69 };
70 
72 protected:
73  mutable std::mutex mutex_;
74  std::condition_variable cond_;
75 
77 
78  std::shared_ptr<void> user_data_;
79  std::function<void(bool, std::shared_ptr<void>)> completed_fn_;
80 
81  std::deque<char> output_queue_; // for log
82  std::vector<char> output_vector_; // for result
83  std::vector<char> stderr_bytes_;
84 
85  size_t max_output_queue_size_ = 0; // 0 = unlimited
86 
87  void write_output(char const *buf, size_t len);
88  int pop_output(char *ptr, int len);
89 
90 public:
91  virtual ~AbstractPtyProcess() { }
92 
94  {
95  change_dir_ = dir;
96  }
97 
98  // output_queue_ の最大サイズを設定する (0 = 無制限)。
99  // 超過分は古いデータから捨てられる。output_vector_ (結果バッファ) には影響しない。
101  {
102  std::lock_guard<std::mutex> lock(mutex_);
104  }
105 
106  // start() 前に設定すること。実行中の変更はスレッドセーフではない。
107  void set_completion_callback(std::function<void(bool, std::shared_ptr<void>)> fn, std::shared_ptr<void> userdata)
108  {
109  completed_fn_ = fn;
110  user_data_ = userdata;
111  }
112 
114  {
115  if (completed_fn_) {
116  completed_fn_(true, user_data_);
117  }
118  }
119 
120  std::string get_message() const; // deprecated
121  void clear_message();
122 
123  std::vector<char> const &stdout_bytes() const
124  {
125  return output_vector_;
126  }
127  std::vector<char> const &stderr_bytes() const
128  {
129  return stderr_bytes_;
130  // return output
131  }
132 
133  virtual void start(std::string const &cmd, std::string const &env, bool use_input) = 0;
134  virtual ProcessResult wait(int time = INT_MAX) = 0;
135  virtual void stop() = 0;
136  virtual bool is_running() const = 0;
137  virtual int get_exit_code() const = 0;
138  virtual void write_input(char const *ptr, int len) = 0;
139  virtual int read_output(char *ptr, int len) = 0;
140  virtual void close_input() = 0;
141 };
142 
143 #endif // ABSTRACTPROCESS_H
Definition: AbstractProcess.h:54
virtual std::vector< char > const & stderr_bytes() const =0
virtual void close_input()=0
virtual ProcessResult wait(int time=INT_MAX)=0
virtual void start(std::string const &command, bool use_input)=0
virtual void write_input(char const *ptr, int len)=0
virtual bool is_running() const =0
virtual ~AbstractProcess()
Definition: AbstractProcess.h:56
virtual int get_exit_code() const =0
virtual std::vector< char > const & stdout_bytes() const =0
virtual void stop()=0
Definition: AbstractProcess.h:71
size_t max_output_queue_size_
Definition: AbstractProcess.h:85
virtual void close_input()=0
std::deque< char > output_queue_
Definition: AbstractProcess.h:81
std::function< void(bool, std::shared_ptr< void >)> completed_fn_
Definition: AbstractProcess.h:79
void set_max_output_queue_size(size_t n)
Definition: AbstractProcess.h:100
std::condition_variable cond_
Definition: AbstractProcess.h:74
void notify_completed()
Definition: AbstractProcess.h:113
virtual bool is_running() const =0
process::helper::dir_string_t change_dir_
Definition: AbstractProcess.h:76
virtual void start(std::string const &cmd, std::string const &env, bool use_input)=0
virtual ~AbstractPtyProcess()
Definition: AbstractProcess.h:91
int pop_output(char *ptr, int len)
Definition: AbstractProcess.cpp:16
virtual void stop()=0
virtual int read_output(char *ptr, int len)=0
virtual void write_input(char const *ptr, int len)=0
virtual int get_exit_code() const =0
std::string get_message() const
Definition: AbstractProcess.cpp:31
virtual ProcessResult wait(int time=INT_MAX)=0
std::vector< char > const & stdout_bytes() const
Definition: AbstractProcess.h:123
void set_change_dir(process::helper::dir_string_t const &dir)
Definition: AbstractProcess.h:93
std::vector< char > stderr_bytes_
Definition: AbstractProcess.h:83
std::vector< char > output_vector_
Definition: AbstractProcess.h:82
void write_output(char const *buf, size_t len)
Definition: AbstractProcess.cpp:4
std::vector< char > const & stderr_bytes() const
Definition: AbstractProcess.h:127
std::mutex mutex_
Definition: AbstractProcess.h:73
void clear_message()
Definition: AbstractProcess.cpp:38
std::shared_ptr< void > user_data_
Definition: AbstractProcess.h:78
void set_completion_callback(std::function< void(bool, std::shared_ptr< void >)> fn, std::shared_ptr< void > userdata)
Definition: AbstractProcess.h:107
std::string dir_string_t
Definition: ProcessHelper.h:12
Definition: AbstractProcess.h:21
bool started_
Definition: AbstractProcess.h:22
std::uint32_t exit_code_
Definition: AbstractProcess.h:24
std::uint32_t exit_code() const
Definition: AbstractProcess.h:38
std::uint32_t error_code() const
Definition: AbstractProcess.h:43
std::string const & error_message() const
Definition: AbstractProcess.h:48
bool running() const
Definition: AbstractProcess.h:33
bool started() const
Definition: AbstractProcess.h:28
std::string error_message_
Definition: AbstractProcess.h:26
std::uint32_t error_code_
Definition: AbstractProcess.h:25
bool running_
Definition: AbstractProcess.h:23