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