diff options
Diffstat (limited to 'Source/CTest/cmProcess.h')
-rw-r--r-- | Source/CTest/cmProcess.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Source/CTest/cmProcess.h b/Source/CTest/cmProcess.h new file mode 100644 index 0000000..9d201d1 --- /dev/null +++ b/Source/CTest/cmProcess.h @@ -0,0 +1,79 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmProcess_h +#define cmProcess_h + +#include <cmConfigure.h> // IWYU pragma: keep + +#include <cmsys/Process.h> +#include <string> +#include <vector> + +/** \class cmProcess + * \brief run a process with c++ + * + * cmProcess wraps the kwsys process stuff in a c++ class. + */ +class cmProcess +{ +public: + cmProcess(); + ~cmProcess(); + const char* GetCommand() { return this->Command.c_str(); } + void SetCommand(const char* command); + void SetCommandArguments(std::vector<std::string> const& arg); + void SetWorkingDirectory(const char* dir) { this->WorkingDirectory = dir; } + void SetTimeout(double t) { this->Timeout = t; } + void ChangeTimeout(double t); + void ResetStartTime(); + // Return true if the process starts + bool StartProcess(); + + // return the process status + int GetProcessStatus(); + // Report the status of the program + int ReportStatus(); + int GetId() { return this->Id; } + void SetId(int id) { this->Id = id; } + int GetExitValue() { return this->ExitValue; } + double GetTotalTime() { return this->TotalTime; } + int GetExitException(); + /** + * Read one line of output but block for no more than timeout. + * Returns: + * cmsysProcess_Pipe_None = Process terminated and all output read + * cmsysProcess_Pipe_STDOUT = Line came from stdout or stderr + * cmsysProcess_Pipe_Timeout = Timeout expired while waiting + */ + int GetNextOutputLine(std::string& line, double timeout); + +private: + double Timeout; + double StartTime; + double TotalTime; + cmsysProcess* Process; + class Buffer : public std::vector<char> + { + // Half-open index range of partial line already scanned. + size_type First; + size_type Last; + + public: + Buffer() + : First(0) + , Last(0) + { + } + bool GetLine(std::string& line); + bool GetLast(std::string& line); + }; + Buffer Output; + std::string Command; + std::string WorkingDirectory; + std::vector<std::string> Arguments; + std::vector<const char*> ProcessArgs; + int Id; + int ExitValue; +}; + +#endif |