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

125 lines
3.6 KiB
C++
Raw Normal View History

2021-08-24 18:08:18 +08:00
#include "rsyncpathtodirprocess.h"
#include <QDebug>
RsyncPathToDirProcess::RsyncPathToDirProcess(QObject *parent) :
QObject(parent),
2021-11-11 16:03:58 +08:00
m_p(new QProcess(this)),
m_syncProcess(new QProcess(this))
2021-08-24 18:08:18 +08:00
{
m_currentRate = 0;
m_bSuccess = false;
connect(m_p, &QProcess::readyRead, this, [&]() {
QString str = QString(m_p->readAll());
2022-01-19 14:42:11 +08:00
qDebug() << str;
2021-10-26 09:24:05 +08:00
// if (str.contains("B\/s") && str.contains("%")) {
if (str.contains("B/s") && str.contains("%")) {
2021-08-24 18:08:18 +08:00
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)
2021-08-24 18:08:18 +08:00
m_p->kill();
});
2021-11-11 16:03:58 +08:00
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)));
2021-08-24 18:08:18 +08:00
}
RsyncPathToDirProcess::~RsyncPathToDirProcess()
{
if (!m_p && m_p->state() != QProcess::NotRunning) {
m_p->kill();
}
2021-11-20 12:09:26 +08:00
if (!m_syncProcess && m_syncProcess->state() != QProcess::NotRunning) {
m_syncProcess->kill();
}
2021-08-24 18:08:18 +08:00
}
bool RsyncPathToDirProcess::start(QStringList args, bool block)
{
qDebug() << "RsyncPathToDirProcess::start invoke begin";
m_currentRate = 0;
m_bSuccess = false;
2021-11-11 16:03:58 +08:00
m_block = block;
2021-08-24 18:08:18 +08:00
2021-11-11 16:03:58 +08:00
QString cmd("rsync");
2021-08-24 18:08:18 +08:00
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;
}
2021-11-11 16:03:58 +08:00
if (m_block) {
2021-08-24 18:08:18 +08:00
if (!m_p->waitForFinished()) {
qCritical("rsync finished failed");
return false;
}
}
qDebug() << "RsyncPathToDirProcess::start invoke end";
return m_bSuccess;
}
2021-11-11 16:03:58 +08:00
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)
2021-08-24 18:08:18 +08:00
{
2021-11-11 16:03:58 +08:00
qDebug() << "RsyncPathToDirProcess::sync_finished invoke begin";
2021-08-24 18:08:18 +08:00
if (exitCode == QProcess::NormalExit || exitCode == 24 || exitCode == 23) {
m_bSuccess = true;
2021-09-01 15:46:24 +08:00
emit progress(100);
2021-08-24 18:08:18 +08:00
emit finished(true);
} else {
2021-11-11 16:03:58 +08:00
m_bSuccess = false;
2021-08-24 18:08:18 +08:00
emit finished(false);
}
2021-11-11 16:03:58 +08:00
qDebug() << "RsyncPathToDirProcess::sync_finished invoke end";
2021-08-24 18:08:18 +08:00
}