save for christmas
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "command.h"
|
||||
#include "worker.h"
|
||||
|
||||
#include <QProcess>
|
||||
#include <QDebug>
|
||||
@@ -7,12 +8,15 @@
|
||||
#include <QDateTime>
|
||||
#include <QMutexLocker>
|
||||
|
||||
|
||||
Command::Command(QString const &command, int start_timeout, int finish_timeout)
|
||||
: m_command(command.trimmed())
|
||||
, m_commandResult("")
|
||||
, m_waitForStartTimeout(start_timeout)
|
||||
, m_waitForFinishTimeout(finish_timeout)
|
||||
, m_exitCode(-1) {
|
||||
, m_exitCode(-1)
|
||||
, m_p(nullptr)
|
||||
, m_worker(nullptr) {
|
||||
}
|
||||
|
||||
QString Command::getCommandResult(bool reset) const {
|
||||
@@ -31,13 +35,52 @@ QString Command::getCommandResult(bool reset) const {
|
||||
void Command::readyReadStandardOutput() {
|
||||
QMutexLocker locker(&m_mtx);
|
||||
QProcess *p = (QProcess *)sender();
|
||||
m_commandResult += p->readAllStandardOutput();
|
||||
if (p) {
|
||||
QString s = p->readAllStandardOutput();
|
||||
if (m_worker) {
|
||||
int i = -1;
|
||||
if ((i = s.indexOf("<DC-VERSION>")) != -1) {
|
||||
s = s.mid(i+12).trimmed();
|
||||
if ((i = s.indexOf("\"")) != -1) {
|
||||
s = s.mid(i+1);
|
||||
if ((i = s.indexOf("\"")) != -1) {
|
||||
s = s.mid(0, i).trimmed();
|
||||
}
|
||||
}
|
||||
emit m_worker->showDcDownload(s);
|
||||
} else
|
||||
if ((i = s.indexOf("<PROGRESS>")) != -1) {
|
||||
bool ok;
|
||||
int v = s.mid(i+10).trimmed().toInt(&ok);
|
||||
if (ok) {
|
||||
emit m_worker->setDcDownloadProgress(v);
|
||||
emit m_worker->insertText(s.mid(0,i) + "\n");
|
||||
}
|
||||
} else
|
||||
if ((i = s.indexOf("<DC-UPDATE-FINISH>")) != -1) {
|
||||
m_worker->summary();
|
||||
// qApp->exit(0);
|
||||
} else
|
||||
if ((i = s.indexOf("<DC-UPDATE-SUCCESS>")) != -1) {
|
||||
m_worker->summary();
|
||||
} else
|
||||
if ((i = s.indexOf("<DC-UPDATE-FAILURE>")) != -1) {
|
||||
m_worker->summary();
|
||||
//qApp->exit(-1);
|
||||
} else {
|
||||
emit m_worker->insertText(s);
|
||||
}
|
||||
}
|
||||
m_commandResult += s;
|
||||
}
|
||||
}
|
||||
|
||||
void Command::readyReadStandardError() {
|
||||
QProcess *p = (QProcess *)sender();
|
||||
QByteArray buf = p->readAllStandardError();
|
||||
qCritical() << buf;
|
||||
if (p) {
|
||||
QByteArray buf = p->readAllStandardError();
|
||||
qCritical() << buf;
|
||||
}
|
||||
}
|
||||
|
||||
void Command::finished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) {
|
||||
@@ -52,6 +95,31 @@ void Command::finished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) {
|
||||
disconnect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(readyReadStandardError()));
|
||||
}
|
||||
|
||||
bool Command::start(QString workingDirectory, QStringList args) {
|
||||
if (!QDir::setCurrent(workingDirectory)) {
|
||||
qCritical() << "SET WORKING_DIRECTORY" << workingDirectory
|
||||
<< "FAILED FOR" << m_command;
|
||||
return false;
|
||||
}
|
||||
if (m_p != nullptr) {
|
||||
delete m_p;
|
||||
}
|
||||
m_p = new QProcess(this);
|
||||
m_p->setWorkingDirectory(workingDirectory);
|
||||
m_p->setProcessChannelMode(QProcess::MergedChannels);
|
||||
|
||||
connect(m_p, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()));
|
||||
connect(m_p, SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError()));
|
||||
|
||||
if (!args.isEmpty()) {
|
||||
m_p->start(m_command, args);
|
||||
} else {
|
||||
m_p->start(m_command);
|
||||
}
|
||||
|
||||
return m_p->waitForStarted(m_waitForStartTimeout);
|
||||
}
|
||||
|
||||
bool Command::execute(QString workingDirectory, QStringList args) {
|
||||
|
||||
if (!QDir::setCurrent(workingDirectory)) {
|
||||
|
@@ -9,7 +9,7 @@
|
||||
#include <QProcess>
|
||||
#include <QMutex>
|
||||
|
||||
|
||||
class Worker;
|
||||
class Command : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
@@ -19,6 +19,8 @@ class Command : public QObject {
|
||||
int m_waitForFinishTimeout;
|
||||
int m_exitCode;
|
||||
mutable QMutex m_mtx;
|
||||
QProcess *m_p;
|
||||
Worker *m_worker;
|
||||
public:
|
||||
explicit Command(QString const &command,
|
||||
int start_timeout = 100000,
|
||||
@@ -28,8 +30,11 @@ public:
|
||||
QString command() const { return m_command; }
|
||||
|
||||
bool execute(QString workingDirectory, QStringList args = QStringList());
|
||||
bool start(QString workingDirectory, QStringList args = QStringList());
|
||||
int exitCode() const { return m_exitCode; }
|
||||
|
||||
void setWorker(Worker *worker) {m_worker = worker; }
|
||||
|
||||
private slots:
|
||||
void readyReadStandardOutput();
|
||||
void readyReadStandardError();
|
||||
|
Reference in New Issue
Block a user