-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpackageworker.cpp
156 lines (139 loc) · 4.5 KB
/
packageworker.cpp
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "packageworker.h"
PackageWorker::PackageWorker(QObject *parent) :
QObject(parent)
{
workProcess = new QProcess(this);
workProcess->setProcessChannelMode(QProcess::MergedChannels);
connect(workProcess, &QProcess::started, this, &PackageWorker::processStarted);
connect(workProcess, &QProcess::errorOccurred, this, &PackageWorker::processError);
connect(workProcess, &QProcess::readyReadStandardError, this, &PackageWorker::slotReadStdErr);
connect(workProcess, &QProcess::readyReadStandardOutput, this, &PackageWorker::slotReadStdOut);
connect(workProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &PackageWorker::processFinished);
connect(workProcess, &QProcess::destroyed, this, &PackageWorker::processDestroyed);
connect(this, &PackageWorker::killProcess, workProcess, &QProcess::kill);
connect(this, &PackageWorker::deleteProcess, workProcess, &QProcess::deleteLater);
}
void PackageWorker::setCommand(const QString &program,const QString &aut_params) {
#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
workProcess->setNativeArguments(
QString("%1 %2").arg(program, aut_params));
#else
workProcess->setArguments(
QStringList()<<program<<aut_params);
#endif
}
void PackageWorker::process() {
QString Command = "cmd.exe";
QStringList args={"/C"};
workProcess->start(Command, args, QIODevice::ReadOnly);
}
void PackageWorker::processStarted()
{
std::cout << "[PackageWorker] Process has started!\n";
}
void PackageWorker::processError(QProcess::ProcessError error)
{
std::cout << "[PackageWorker] Process ERROR!\n";
switch (error) {
case QProcess::FailedToStart: {
std::cout << "[PackageWorker ERROR]: FailedToStart\n";
break;
}
case QProcess::Crashed: {
std::cout << "[PackageWorker ERROR]: Crashed\n";
break;
}
case QProcess::Timedout: {
std::cout << "[PackageWorker ERROR]: Timedout\n";
break;
}
case QProcess::WriteError: {
std::cout << "[PackageWorker ERROR]: WriteError\n";
break;
}
case QProcess::ReadError: {
std::cout << "[PackageWorker ERROR]: ReadError\n";
break;
}
case QProcess::UnknownError: {
std::cout << "[PackageWorker ERROR]: UnknownError\n";
break;
}
default:
break;
}
}
void PackageWorker::slotReadStdErr()
{
// call helper with pointer
std::cout << "std err ready\n";
}
void PackageWorker::slotReadStdOut()
{
// call helper with pointer
std::cout << "std out ready\n";
}
void PackageWorker::processReadyReadSTDerr(QProcess &toRead)
{
QString stdErr = toRead.readAllStandardError();
std::cout << stdErr.toStdString() << std::endl;
emit readyReadSTDerr(stdErr);
}
void PackageWorker::processReadyReadSTDout(QProcess &toRead)
{
QString stdOut = toRead.readAllStandardOutput();
std::cout << stdOut.toStdString() << std::endl;
emit readyReadSTDout(stdOut);
}
void PackageWorker::processFinished(int exitCode)
{
std::cout << "[PackageWorker] Process exited";
std::cout << "[PackageWorker] Exit Code: " << exitCode << "\n";
emit finished(exitCode);
}
void PackageWorker::processDestroyed()
{
std::cout << "[QProcessWrapper] Process destroyed!";
}
void PackageWorker::processStateChanged(QProcess::ProcessState newState)
{
std::cout << "[QProcessWrapper] Process stage changed!";
switch (newState) {
case QProcess::NotRunning: {
std::cout << "[QProcessWrapper] Process is now NotRunning";
break;
}
case QProcess::Starting: {
std::cout << "[QProcessWrapper] Process is now Starting";
break;
}
case QProcess::Running: {
std::cout << "[QProcessWrapper] Process is now Running";
break;
}
default:
break;
}
}
void PackageWorker::errorMessageBox(QString error)
{
std::cout << "Error: " << error.toStdString() << std::endl;
}
void PackageWorker::Cancel(){
if (workProcess && workProcess->state() == QProcess::Running) {
#ifdef Q_OS_WIN
// Terminate process and its children on Windows
QString command =
QString("taskkill /F /T /PID %1")
.arg(QString::number(process->processId()));
QProcess::startDetached(command);
#else
// Terminate process and its children on Unix-like systems (including macOS)
qint64 pid = workProcess->pid();
if (pid != -1) {
QString command = QString("pkill -TERM -P %1").arg(pid);
QProcess::startDetached(command);
}
#endif
}
}