00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _STX_EXECPIPE_H_
00024 #define _STX_EXECPIPE_H_
00025
00026 #include <string>
00027 #include <vector>
00028
00030 namespace stx {
00031
00043 class PipeSource
00044 {
00045 private:
00047 class ExecPipeImpl* m_impl;
00048
00050 friend class ExecPipeImpl;
00051
00052 public:
00054 PipeSource();
00055
00058 virtual bool poll() = 0;
00059
00061 void write(const void* data, unsigned int datalen);
00062 };
00063
00074 class PipeSink
00075 {
00076 public:
00079 virtual void process(const void* data, unsigned int datalen) = 0;
00080
00083 virtual void eof() = 0;
00084 };
00085
00100 class PipeFunction : public PipeSink
00101 {
00102 private:
00104 class ExecPipeImpl* m_impl;
00105
00107 unsigned int m_stageid;
00108
00110 friend class ExecPipeImpl;
00111
00112 public:
00114 PipeFunction();
00115
00117 void write(const void* data, unsigned int datalen);
00118 };
00119
00128 class ExecPipe
00129 {
00130 protected:
00132 class ExecPipeImpl* m_impl;
00133
00134 public:
00136 ExecPipe();
00137
00139 ~ExecPipe();
00140
00142 ExecPipe(const ExecPipe& ep);
00143
00145 ExecPipe& operator=(const ExecPipe& ep);
00146
00147
00148
00150 enum DebugLevel
00151 {
00152 DL_ERROR=0,
00153 DL_INFO=1,
00154 DL_DEBUG=2,
00155 DL_TRACE=3
00156 };
00157
00159 void set_debug_level(enum DebugLevel dl);
00160
00163 void set_debug_output(void (*output)(const char *line));
00164
00165
00166
00168
00173 void set_input_fd(int fd);
00174
00179 void set_input_file(const char* path);
00180
00186 void set_input_string(const std::string* input);
00187
00193 void set_input_source(PipeSource* source);
00194
00196
00197
00198
00200
00205 void set_output_fd(int fd);
00206
00211 void set_output_file(const char* path, int mode = 0666);
00212
00218 void set_output_string(std::string* output);
00219
00224 void set_output_sink(PipeSink* sink);
00225
00227
00228
00229
00231
00235 unsigned int size() const;
00236
00241 void add_exec(const char* prog);
00242
00247 void add_exec(const char* prog, const char* arg1);
00248
00253 void add_exec(const char* prog, const char* arg1, const char* arg2);
00254
00259 void add_exec(const char* prog, const char* arg1, const char* arg2, const char* arg3);
00260
00266 void add_exec(const std::vector<std::string>* args);
00267
00268
00274 void add_execp(const char* prog);
00275
00281 void add_execp(const char* prog, const char* arg1);
00282
00288 void add_execp(const char* prog, const char* arg1, const char* arg2);
00289
00295 void add_execp(const char* prog, const char* arg1, const char* arg2, const char* arg3);
00296
00303 void add_execp(const std::vector<std::string>* args);
00304
00312 void add_exece(const char* path,
00313 const std::vector<std::string>* args,
00314 const std::vector<std::string>* env);
00315
00321 void add_function(PipeFunction* func);
00322
00324
00325
00326
00334 ExecPipe& run();
00335
00336
00337
00339
00344 int get_return_status(unsigned int stageid) const;
00345
00350 int get_return_code(unsigned int stageid) const;
00351
00356 int get_return_signal(unsigned int stageid) const;
00357
00361 bool all_return_codes_zero() const;
00362
00364 };
00365
00366 }
00367
00368 #endif // _STX_EXECPIPE_H_