#ifndef PROCESSUTILITIES_H_ #define PROCESSUTILITIES_H_ #include #include #include class ProcessWatcher; class ProcessInfo; class ProcessController { public: virtual ~ProcessController() = 0; virtual void finished(int ret) = 0; virtual void standardOutput(const std::string& aString) = 0; virtual void standardError(const std::string& aString) = 0; virtual void failed() = 0; void add(ProcessWatcher* aWatch); void signalFinish(int ret); private: std::vector Public; friend class ProcessInfo; }; class LineProcessController : public ProcessController { public: virtual void finished(int ret); virtual void standardOutput(const std::string& aString); virtual void standardError(const std::string& aString); virtual void standardOutputByLine(const std::string& aString) = 0; virtual void standardErrorByLine(const std::string& aString) = 0; private: std::string OutputSoFar; std::string ErrorSoFar; }; class ProcessWatcher { public: virtual ~ProcessWatcher() = 0; virtual void processTerminated(ProcessController* Which, int ret) = 0; }; class TestController : public ProcessController { public: TestController(const std::string& n) : N(n) { } void finished(int ret) { std::cout << N << " finished with " << ret << std::endl; } void standardError(const std::string& Out) { std::cout << N << " ERR: " << Out << std::endl; } void standardOutput(const std::string& Out) { std::cout << N << " : " << Out << std::endl; } void failed() { std::cout << N << " failed" << std::endl; } std::string N; }; bool launchProcess(ProcessController* aController, const std::string& Executable, const std::vector& Args); bool shellLaunchProcess(ProcessController* aController, const std::string& Executable, const std::vector& Args); unsigned int waitForProcessEvent(); int syncExecuteProcess(const std::string& Executable, const std::vector& Args, std::string &StdOut, std::string& StdErr); #endif