diff options
Diffstat (limited to 'src/libs/utils/qtcprocess.h')
-rw-r--r-- | src/libs/utils/qtcprocess.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index d46bd41797..f16dd1764e 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -25,14 +25,61 @@ #pragma once +#include "utils_global.h" + #include "environment.h" #include <QProcess> +#include <QTextCodec> + +#include <functional> + +QT_FORWARD_DECLARE_CLASS(QDebug) namespace Utils { + class AbstractMacroExpander; namespace Internal { class QtcProcessPrivate; } +class SynchronousProcessPrivate; +class CommandLine; +class Environment; + +/* Result of SynchronousProcess execution */ +class QTCREATOR_UTILS_EXPORT SynchronousProcessResponse +{ +public: + enum Result { + // Finished with return code 0 + Finished, + // Finished with return code != 0 + FinishedError, + // Process terminated abnormally (kill) + TerminatedAbnormally, + // Executable could not be started + StartFailed, + // Hang, no output after time out + Hang }; + + void clear(); + + // Helper to format an exit message. + QString exitMessage(const QString &binary, int timeoutS) const; + + QByteArray allRawOutput() const; + QString allOutput() const; + + QString stdOut() const; + QString stdErr() const; + + Result result = StartFailed; + int exitCode = -1; + + QByteArray rawStdOut; + QByteArray rawStdErr; + QTextCodec *codec = QTextCodec::codecForLocale(); +}; + class QTCREATOR_UTILS_EXPORT QtcProcess : public QProcess { @@ -178,4 +225,70 @@ private: QProcessEnvironment processEnvironment() const = delete; }; +QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug str, const SynchronousProcessResponse &); + +using ExitCodeInterpreter = std::function<SynchronousProcessResponse::Result(int /*exitCode*/)>; +QTCREATOR_UTILS_EXPORT SynchronousProcessResponse::Result defaultExitCodeInterpreter(int code); + +class QTCREATOR_UTILS_EXPORT SynchronousProcess : public QObject +{ + Q_OBJECT +public: + SynchronousProcess(); + ~SynchronousProcess() override; + + /* Timeout for hanging processes (triggers after no more output + * occurs on stderr/stdout). */ + void setTimeoutS(int timeoutS); + int timeoutS() const; + + void setCodec(QTextCodec *c); + QTextCodec *codec() const; + + QProcess::ProcessChannelMode processChannelMode () const; + void setProcessChannelMode(QProcess::ProcessChannelMode m); + + bool stdOutBufferedSignalsEnabled() const; + void setStdOutBufferedSignalsEnabled(bool); + + bool stdErrBufferedSignalsEnabled() const; + void setStdErrBufferedSignalsEnabled(bool); + + bool timeOutMessageBoxEnabled() const; + void setTimeOutMessageBoxEnabled(bool); + + Environment environment() const; + void setEnvironment(const Environment &); + + void setWorkingDirectory(const QString &workingDirectory); + QString workingDirectory() const; + + // Unix: Do not give the child process a terminal for input prompting. + void setDisableUnixTerminal(); + + void setExitCodeInterpreter(const ExitCodeInterpreter &interpreter); + ExitCodeInterpreter exitCodeInterpreter() const; + + // Starts a nested event loop and runs the command + SynchronousProcessResponse run(const CommandLine &cmd, const QByteArray &writeData = {}); + // Starts the command blocking the UI fully + SynchronousProcessResponse runBlocking(const CommandLine &cmd); + +signals: + void stdOutBuffered(const QString &lines, bool firstTime); + void stdErrBuffered(const QString &lines, bool firstTime); + +public slots: + bool terminate(); + +private: + void slotTimeout(); + void finished(int exitCode, QProcess::ExitStatus e); + void error(QProcess::ProcessError); + void processStdOut(bool emitSignals); + void processStdErr(bool emitSignals); + + SynchronousProcessPrivate *d; +}; + } // namespace Utils |