1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#ifndef EXECUTOR_H
#define EXECUTOR_H
#include <QObject>
#include <QProcess>
#include <QQueue>
/*!
\class Executor
\brief Executes external commands for handleing password, git and other data
*/
class Executor : public QObject {
Q_OBJECT
/*!
\struct execQueueItem
\brief Execution queue items for non-interactive ordered execution.
*/
struct execQueueItem {
/**
* @brief id identifier of process given by the caller
*/
int id;
/**
* @brief app executable path.
*/
QString app;
/**
* @brief args arguments for executable.
*/
QStringList args;
/**
* @brief input data to write to stdin of process
*/
QString input;
/**
* @brief readStdout whether to read stdout
*/
bool readStdout;
/**
* @brief readStderr whether to read stderr
* it's read regardless of this setting in case of
* non-0 return value of process
*/
bool readStderr;
/**
* @brief workingDir working directory in which the process will be
* started
*/
QString workingDir;
};
QQueue<execQueueItem> m_execQueue;
QProcess m_process;
bool running;
void executeNext();
public:
explicit Executor(QObject *parent = 0);
void execute(int id, const QString &app, const QStringList &args,
bool readStdout, bool readStderr = true);
void execute(int id, const QString &workDir, const QString &app,
const QStringList &args, bool readStdout,
bool readStderr = true);
void execute(int id, const QString &app, const QStringList &args,
QString input = QString(), bool readStdout = false,
bool readStderr = true);
void execute(int id, const QString &workDir, const QString &app,
const QStringList &args, QString input = QString(),
bool readStdout = false, bool readStderr = true);
static int executeBlocking(QString app, const QStringList &args,
QString input = QString(),
QString *process_out = Q_NULLPTR,
QString *process_err = Q_NULLPTR);
static int executeBlocking(QString app, const QStringList &args,
QString *process_out,
QString *process_err = Q_NULLPTR);
void setEnvironment(const QStringList &env);
int cancelNext();
private slots:
void finished(int exitCode, QProcess::ExitStatus exitStatus);
signals:
/**
* @brief finished signal that is emited when process finishes
*
* @param id id of the process
* @param exitCode return code of the process
* @param output stdout produced by the process
* @param errout stderr produced by the process
*/
void finished(int id, int exitCode, const QString &output,
const QString &errout);
/**
* @brief starting signal that is emited when process starts
*/
void starting();
/**
* @brief error signal that is emited when process finishes with an
* error
*
* @param id id of the process
* @param exitCode return code of the process
* @param output stdout produced by the process
* @param errout stderr produced by the process
*/
void error(int id, int exitCode, const QString &output,
const QString &errout);
};
#endif // EXECUTOR_H
|