nextcloud-desktop/src/mirall/unisonfolder.cpp

153 lines
4.2 KiB
C++

/*
* Copyright (C) by Duncan Mac-Vicar P. <duncan@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include <QDebug>
#include <QDir>
#include <QMutexLocker>
#include <QStringList>
#include <QTextStream>
#include "mirall/unisonfolder.h"
namespace Mirall {
UnisonFolder::UnisonFolder(const QString &alias,
const QString &path,
const QString &secondPath,
QObject *parent)
: Folder(alias, path, parent),
_unison(new QProcess(this)),
_secondPath(secondPath),
_syncCount(0)
{
QObject::connect(_unison, SIGNAL(readyReadStandardOutput()),
SLOT(slotReadyReadStandardOutput()));
QObject::connect(_unison, SIGNAL(readyReadStandardError()),
SLOT(slotReadyReadStandardError()));
QObject::connect(_unison, SIGNAL(stateChanged(QProcess::ProcessState)),
SLOT(slotStateChanged(QProcess::ProcessState)));
QObject::connect(_unison, SIGNAL(error(QProcess::ProcessError)),
SLOT(slotError(QProcess::ProcessError)));
QObject::connect(_unison, SIGNAL(started()),
SLOT(slotStarted()));
QObject::connect(_unison, SIGNAL(finished(int, QProcess::ExitStatus)),
SLOT(slotFinished(int, QProcess::ExitStatus)));
}
UnisonFolder::~UnisonFolder()
{
}
bool UnisonFolder::isBusy() const
{
return (_unison->state() != QProcess::NotRunning);
}
QString UnisonFolder::secondPath() const
{
return _secondPath;
}
void UnisonFolder::startSync(const QStringList &pathList)
{
QMutexLocker locker(&_syncMutex);
emit syncStarted();
QString program = "unison";
QStringList args;
args << "-ui" << "text";
args << "-auto" << "-batch";
args << "-confirmbigdel=false";
// only use -path in after a full synchronization
// already happened, which we do only on the first
// sync when the program is started
if (_syncCount > 0 ) {
// may be we should use a QDir in the API itself?
QDir root(path());
foreach(QString changedPath, pathList) {
args << "-path" << root.relativeFilePath(changedPath);
}
}
args << path();
args << secondPath();
qDebug() << " * Unison: will use" << pathList.size() << "path arguments";
_unison->start(program, args);
}
void UnisonFolder::slotStarted()
{
qDebug() << " * Unison process started ( PID " << _unison->pid() << ")";
_syncCount++;
//qDebug() << _unison->readAllStandardOutput();;
}
void UnisonFolder::slotFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug() << " * Unison process finished with status" << exitCode;
//if (exitCode != 0) {
qDebug() << _lastOutput;
//}
// parse a summary from here:
//[BGN] Copying zw.png from //piscola//space/store/folder1 to /space/mirall/folder1
//[BGN] Deleting gn.png from /space/mirall/folder1
//[END] Deleting gn.png
// from stderr:
//Reconciling changes
// <---- new file Package.h
_lastOutput.clear();
emit syncFinished((exitCode != 0) ?
SyncResult(SyncResult::Error)
: SyncResult(SyncResult::Success));
}
void UnisonFolder::slotReadyReadStandardOutput()
{
QTextStream stream(&_lastOutput);
stream << _unison->readAllStandardOutput();;
}
void UnisonFolder::slotReadyReadStandardError()
{
QTextStream stream(&_lastOutput);
stream << _unison->readAllStandardError();;
}
void UnisonFolder::slotStateChanged(QProcess::ProcessState state)
{
//qDebug() << "changed: " << state;
}
void UnisonFolder::slotError(QProcess::ProcessError error)
{
//qDebug() << "error: " << error;
}
} // ns