aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/qtcprocess.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/utils/qtcprocess.h')
-rw-r--r--src/libs/utils/qtcprocess.h113
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