yhkylin-backup-tools/backup-daemon/myprocess/rsyncpathtodirprocess.cpp

125 lines
3.6 KiB
C++
Executable File

#include "rsyncpathtodirprocess.h"
#include <QDebug>
RsyncPathToDirProcess::RsyncPathToDirProcess(QObject *parent) :
QObject(parent),
m_p(new QProcess(this)),
m_syncProcess(new QProcess(this))
{
m_currentRate = 0;
m_bSuccess = false;
connect(m_p, &QProcess::readyRead, this, [&]() {
QString str = QString(m_p->readAll());
qDebug() << str;
// if (str.contains("B\/s") && str.contains("%")) {
if (str.contains("B/s") && str.contains("%")) {
if (str.split("%").at(0).length() < 3)
return;
int tmpRate = str.split("%").at(0).right(3).toInt();
if (m_currentRate == tmpRate)
return;
m_currentRate = tmpRate;
emit progress(m_currentRate);
}
});
connect(m_p, &QProcess::readyReadStandardError, this, [&]() {
QByteArray err = m_p->readAllStandardError();
qCritical("backup process error: %s", err.data());
});
connect(m_p, &QProcess::errorOccurred, this, [&](QProcess::ProcessError error) {
Q_UNUSED(error)
m_p->kill();
});
connect(m_p, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(rsync_finished(int, QProcess::ExitStatus)));
connect(m_syncProcess, &QProcess::errorOccurred, this, [&](QProcess::ProcessError error) {
Q_UNUSED(error)
m_syncProcess->kill();
});
connect(m_syncProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(sync_finished(int, QProcess::ExitStatus)));
}
RsyncPathToDirProcess::~RsyncPathToDirProcess()
{
if (!m_p && m_p->state() != QProcess::NotRunning) {
m_p->kill();
}
if (!m_syncProcess && m_syncProcess->state() != QProcess::NotRunning) {
m_syncProcess->kill();
}
}
bool RsyncPathToDirProcess::start(QStringList args, bool block)
{
qDebug() << "RsyncPathToDirProcess::start invoke begin";
m_currentRate = 0;
m_bSuccess = false;
m_block = block;
QString cmd("rsync");
for (const QString& item : args) {
cmd += " ";
cmd += item;
}
qDebug() << cmd;
m_p->start("rsync", args);
if (!m_p->waitForStarted()) {
qCritical("rsync started failed");
return false;
}
if (m_block) {
if (!m_p->waitForFinished()) {
qCritical("rsync finished failed");
return false;
}
}
qDebug() << "RsyncPathToDirProcess::start invoke end";
return m_bSuccess;
}
void RsyncPathToDirProcess::rsync_finished(int exitCode, QProcess::ExitStatus)
{
qDebug() << "RsyncPathToDirProcess::rsync_finished invoke begin";
if (exitCode == QProcess::NormalExit || exitCode == 24 || exitCode == 23) {
if (m_block) {
m_bSuccess = true;
emit progress(100);
emit finished(true);
} else {
m_syncProcess->start("sync");
if (!m_syncProcess->waitForStarted()) {
m_bSuccess = false;
emit finished(false);
}
}
} else {
m_bSuccess = false;
emit finished(false);
}
qDebug() << "RsyncPathToDirProcess::rsync_finished invoke end";
}
void RsyncPathToDirProcess::sync_finished(int exitCode, QProcess::ExitStatus)
{
qDebug() << "RsyncPathToDirProcess::sync_finished invoke begin";
if (exitCode == QProcess::NormalExit || exitCode == 24 || exitCode == 23) {
m_bSuccess = true;
emit progress(100);
emit finished(true);
} else {
m_bSuccess = false;
emit finished(false);
}
qDebug() << "RsyncPathToDirProcess::sync_finished invoke end";
}