From 8dd97a358ad2e2b507cdc7c749d5519fb3caa7bb Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Thu, 14 Feb 2013 16:25:00 +0100 Subject: [PATCH] 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 --- src/mirall/application.cpp | 4 ++++ src/mirall/csyncfolder.cpp | 2 ++ src/mirall/csyncthread.cpp | 14 ++++++++++++-- src/mirall/csyncthread.h | 1 + src/mirall/folder.cpp | 6 ------ src/mirall/miralltheme.cpp | 1 + src/mirall/owncloudfolder.cpp | 8 +++++--- src/mirall/owncloudtheme.cpp | 1 + src/mirall/syncfileitem.h | 4 ++++ src/mirall/syncresult.h | 1 + src/mirall/unisonfolder.cpp | 2 ++ 11 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/mirall/application.cpp b/src/mirall/application.cpp index ea7c5ed976..48b5559f94 100644 --- a/src/mirall/application.cpp +++ b/src/mirall/application.cpp @@ -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 ); diff --git a/src/mirall/csyncfolder.cpp b/src/mirall/csyncfolder.cpp index 23868a9b07..66c2853f94 100644 --- a/src/mirall/csyncfolder.cpp +++ b/src/mirall/csyncfolder.cpp @@ -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() ); diff --git a/src/mirall/csyncthread.cpp b/src/mirall/csyncthread.cpp index 61f0dec8d2..2276b17698 100644 --- a/src/mirall/csyncthread.cpp +++ b/src/mirall/csyncthread.cpp @@ -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 ); diff --git a/src/mirall/csyncthread.h b/src/mirall/csyncthread.h index d227b1b662..2535eb9223 100644 --- a/src/mirall/csyncthread.h +++ b/src/mirall/csyncthread.h @@ -92,6 +92,7 @@ private: QString _source; QString _target; + bool _needsUpdate; }; } diff --git a/src/mirall/folder.cpp b/src/mirall/folder.cpp index 5dcc686e00..9c07b0afa9 100644 --- a/src/mirall/folder.cpp +++ b/src/mirall/folder.cpp @@ -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"; diff --git a/src/mirall/miralltheme.cpp b/src/mirall/miralltheme.cpp index 3a7b209cd7..5c76a9b170 100644 --- a/src/mirall/miralltheme.cpp +++ b/src/mirall/miralltheme.cpp @@ -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: diff --git a/src/mirall/owncloudfolder.cpp b/src/mirall/owncloudfolder.cpp index 449f40ac75..4f29ec8303 100644 --- a/src/mirall/owncloudfolder.cpp +++ b/src/mirall/owncloudfolder.cpp @@ -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) diff --git a/src/mirall/owncloudtheme.cpp b/src/mirall/owncloudtheme.cpp index bbfe664b95..756cbe9600 100644 --- a/src/mirall/owncloudtheme.cpp +++ b/src/mirall/owncloudtheme.cpp @@ -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; diff --git a/src/mirall/syncfileitem.h b/src/mirall/syncfileitem.h index 37afcc47b5..d3ef2b1f35 100644 --- a/src/mirall/syncfileitem.h +++ b/src/mirall/syncfileitem.h @@ -21,6 +21,10 @@ public: return item._file == this->_file; } + bool isEmpty() const { + return _file.isEmpty(); + } + // variables QString _file; QString _renameTarget; diff --git a/src/mirall/syncresult.h b/src/mirall/syncresult.h index 9d3e0fc1e0..bb86cb7178 100644 --- a/src/mirall/syncresult.h +++ b/src/mirall/syncresult.h @@ -31,6 +31,7 @@ public: { Undefined, NotYetStarted, + SyncPrepare, SyncRunning, Success, Error, diff --git a/src/mirall/unisonfolder.cpp b/src/mirall/unisonfolder.cpp index c5b722fde3..1c8e679a56 100644 --- a/src/mirall/unisonfolder.cpp +++ b/src/mirall/unisonfolder.cpp @@ -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();