Introduce SyncPrepare state

SyncPrepare is when the folder class prepares the actual syncing,
i.e. does treewalks and runs the reconceiler in case of mirall. The actual
SyncRunning state will only be entered if there is actually anything to
sync.

Fixes #289
This commit is contained in:
Daniel Molkentin 2013-02-14 16:25:00 +01:00
parent 7290afc6fe
commit 8dd97a358a
11 changed files with 33 additions and 11 deletions

View File

@ -936,6 +936,10 @@ void Application::computeOverallSyncStatus()
folderMessage = tr( "Waits to start syncing." );
overallResult.setStatus( SyncResult::NotYetStarted );
break;
case SyncResult::SyncPrepare:
folderMessage = tr( "Preparing for sync." );
overallResult.setStatus( SyncResult::SyncPrepare );
break;
case SyncResult::SyncRunning:
folderMessage = tr( "Sync is running." );
overallResult.setStatus( SyncResult::SyncRunning );

View File

@ -58,6 +58,8 @@ void CSyncFolder::startSync(const QStringList &pathList)
delete _thread;
_errors.clear();
_csyncError = false;
_syncResult.setStatus( SyncResult::SyncRunning );
emit syncStateChange();
_thread = new QThread(this);
_csync = new CSyncThread( path(), secondPath() );

View File

@ -226,6 +226,14 @@ int CSyncThread::treewalkFile( TREE_WALK_FILE *file, bool remote )
int re = 0;
switch(file->instruction) {
case CSYNC_INSTRUCTION_NONE:
case CSYNC_INSTRUCTION_IGNORE:
break;
default:
if (!_needsUpdate)
_needsUpdate = true;
}
switch(file->instruction) {
case CSYNC_INSTRUCTION_NONE:
// No need to do anything.
@ -289,10 +297,9 @@ void CSyncThread::startSync()
bool doTreeWalk = true;
int proxyPort = _proxy.port();
emit(started());
_mutex.lock();
_syncedItems.clear();
_needsUpdate = false;
if( csync_create(&csync,
_source.toUtf8().data(),
@ -376,6 +383,9 @@ void CSyncThread::startSync()
doTreeWalk = false;
}
if (_needsUpdate)
emit(started());
if( csync_propagate(csync) < 0 ) {
CSYNC_ERROR_CODE err = csync_get_error( csync );
const char *errMsg = csync_get_error_string( csync );

View File

@ -92,6 +92,7 @@ private:
QString _source;
QString _target;
bool _needsUpdate;
};
}

View File

@ -247,12 +247,6 @@ void Folder::evaluateSync(const QStringList &pathList)
}
void Folder::startSync( const QStringList &pathList )
{
_syncResult.setStatus( SyncResult::SyncRunning );
emit syncStateChange();
}
void Folder::slotPollTimerTimeout()
{
qDebug() << "* Polling" << alias() << "for changes. Ignoring all pending events until now";

View File

@ -71,6 +71,7 @@ QIcon mirallTheme::syncStateIcon( SyncResult::Status status, bool sysTray ) cons
statusIcon = QLatin1String("dialog-close");
break;
case SyncResult::NotYetStarted:
case SyncResult::SyncPrepare:
statusIcon = QLatin1String("task-ongoing");
break;
case SyncResult::SyncRunning:

View File

@ -123,7 +123,8 @@ void ownCloudFolder::startSync(const QStringList &pathList)
_syncResult.clearErrors();
// we now have watchers for everything, so every sync is remote.
_syncResult.setLocalRunOnly( false );
Folder::startSync( pathList );
_syncResult.setStatus( SyncResult::SyncPrepare );
emit syncStateChange();
QString url = replaceScheme(_secondPath);
@ -150,13 +151,14 @@ void ownCloudFolder::startSync(const QStringList &pathList)
connect(_csync, SIGNAL(csyncUnavailable()), SLOT(slotCsyncUnavailable()), Qt::QueuedConnection);
_thread->start();
QMetaObject::invokeMethod(_csync, "startSync", Qt::QueuedConnection);
emit syncStarted();
}
void ownCloudFolder::slotCSyncStarted()
{
qDebug() << " * csync thread started";
emit syncStarted();
_syncResult.setStatus(SyncResult::SyncRunning);
emit syncStateChange();
}
void ownCloudFolder::slotCSyncError(const QString& err)

View File

@ -124,6 +124,7 @@ QIcon ownCloudTheme::syncStateIcon( SyncResult::Status status, bool sysTray ) co
case SyncResult::SyncRunning:
statusIcon = QLatin1String("state-sync");
break;
case SyncResult::SyncPrepare:
case SyncResult::Success:
statusIcon = QLatin1String("state-ok");
break;

View File

@ -21,6 +21,10 @@ public:
return item._file == this->_file;
}
bool isEmpty() const {
return _file.isEmpty();
}
// variables
QString _file;
QString _renameTarget;

View File

@ -31,6 +31,7 @@ public:
{
Undefined,
NotYetStarted,
SyncPrepare,
SyncRunning,
Success,
Error,

View File

@ -61,6 +61,8 @@ bool UnisonFolder::isBusy() const
void UnisonFolder::startSync(const QStringList &pathList)
{
QMutexLocker locker(&_syncMutex);
_syncResult.setStatus( SyncResult::SyncRunning );
emit syncStateChange();
emit syncStarted();