syncthingtray/connector/syncthingprocess.cpp

99 lines
2.1 KiB
C++
Raw Normal View History

2016-09-03 19:39:43 +02:00
#include "./syncthingprocess.h"
#include <QTimer>
using namespace ChronoUtilities;
2016-09-03 19:39:43 +02:00
namespace Data {
2017-05-01 03:34:43 +02:00
SyncthingProcess::SyncthingProcess(QObject *parent)
: QProcess(parent)
, m_manuallyStopped(false)
2016-09-03 19:39:43 +02:00
{
m_killTimer.setInterval(3000);
m_killTimer.setSingleShot(true);
2016-09-03 19:39:43 +02:00
setProcessChannelMode(QProcess::MergedChannels);
connect(this, &SyncthingProcess::started, this, &SyncthingProcess::handleStarted);
2017-05-01 03:34:43 +02:00
connect(this, static_cast<void (SyncthingProcess::*)(int exitCode, QProcess::ExitStatus exitStatus)>(&SyncthingProcess::finished), this,
&SyncthingProcess::handleFinished);
connect(&m_killTimer, &QTimer::timeout, this, &SyncthingProcess::confirmKill);
2016-09-03 19:39:43 +02:00
}
void SyncthingProcess::restartSyncthing(const QString &cmd)
2016-09-03 19:39:43 +02:00
{
if (!isRunning()) {
startSyncthing(cmd);
return;
2016-09-03 19:39:43 +02:00
}
m_cmd = cmd;
m_manuallyStopped = true;
m_killTimer.start();
terminate();
2016-09-03 19:39:43 +02:00
}
void SyncthingProcess::startSyncthing(const QString &cmd)
2016-09-03 19:39:43 +02:00
{
if (isRunning()) {
return;
}
m_manuallyStopped = false;
m_killTimer.stop();
if (cmd.isEmpty()) {
start(QProcess::ReadOnly);
} else {
start(cmd, QProcess::ReadOnly);
}
2016-09-03 19:39:43 +02:00
}
void SyncthingProcess::stopSyncthing()
{
if (!isRunning()) {
return;
}
m_manuallyStopped = true;
m_killTimer.start();
terminate();
}
void SyncthingProcess::killSyncthing()
{
if (!isRunning()) {
return;
}
m_manuallyStopped = true;
m_killTimer.stop();
kill();
}
void SyncthingProcess::handleStarted()
{
m_activeSince = DateTime::gmtNow();
}
2016-09-03 19:39:43 +02:00
void SyncthingProcess::handleFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
Q_UNUSED(exitCode)
Q_UNUSED(exitStatus)
m_activeSince = DateTime();
m_killTimer.stop();
2017-05-01 03:34:43 +02:00
if (!m_cmd.isEmpty()) {
startSyncthing(m_cmd);
m_cmd.clear();
2016-09-03 19:39:43 +02:00
}
}
void SyncthingProcess::killToRestart()
{
2017-05-01 03:34:43 +02:00
if (!m_cmd.isEmpty()) {
2016-09-03 19:39:43 +02:00
kill();
}
}
SyncthingProcess &syncthingProcess()
{
static SyncthingProcess process;
return process;
}
} // namespace Data