mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-25 05:45:42 +03:00
Abort the sync asynchroniously
Don't block the GUI when clicking on pause Mirall issue #968
This commit is contained in:
parent
b18810f381
commit
79ea7c3eed
7 changed files with 29 additions and 27 deletions
|
@ -235,7 +235,8 @@ void AccountSettings::folderToModelItem( QStandardItem *item, Folder *f )
|
|||
if( errorList.isEmpty() ) {
|
||||
if( (status == SyncResult::Error ||
|
||||
status == SyncResult::SetupError ||
|
||||
status == SyncResult::Unavailable )) {
|
||||
status == SyncResult::SyncAbortRequested ||
|
||||
status == SyncResult::Unavailable)) {
|
||||
errorList << theme->statusHeaderText(status);
|
||||
}
|
||||
}
|
||||
|
@ -306,7 +307,7 @@ void AccountSettings::slotResetCurrentFolder()
|
|||
if( ret == QMessageBox::Yes ) {
|
||||
FolderMan *folderMan = FolderMan::instance();
|
||||
Folder *f = folderMan->folder(alias);
|
||||
f->slotTerminateSync();
|
||||
f->slotTerminateSync(true);
|
||||
f->wipe();
|
||||
folderMan->slotScheduleAllFolders();
|
||||
}
|
||||
|
@ -430,8 +431,9 @@ void AccountSettings::slotEnableCurrentFolder()
|
|||
|
||||
// message box can return at any time while the thread keeps running,
|
||||
// so better check again after the user has responded.
|
||||
if ( f->isBusy() && terminate )
|
||||
folderMan->terminateSyncProcess( alias );
|
||||
if ( f->isBusy() && terminate ) {
|
||||
f->slotTerminateSync(false);
|
||||
}
|
||||
|
||||
folderMan->slotEnableFolder( alias, !folderEnabled );
|
||||
slotUpdateFolderState (f);
|
||||
|
|
|
@ -341,11 +341,15 @@ void CSyncThread::startSync()
|
|||
}
|
||||
qDebug() << Q_FUNC_INFO << "Sync started";
|
||||
|
||||
|
||||
qDebug() << "starting to sync " << qApp->thread() << QThread::currentThread();
|
||||
_syncedItems.clear();
|
||||
|
||||
_mutex.lock();
|
||||
_needsUpdate = false;
|
||||
if (!_abortRequested.fetchAndAddRelease(0)) {
|
||||
csync_resume(_csync_ctx);
|
||||
}
|
||||
_mutex.unlock();
|
||||
|
||||
|
||||
|
@ -635,6 +639,7 @@ QString CSyncThread::adjustRenamedPath(const QString& original)
|
|||
|
||||
void CSyncThread::abort()
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
csync_request_abort(_csync_ctx);
|
||||
_abortRequested = true;
|
||||
}
|
||||
|
|
|
@ -113,7 +113,6 @@ Folder::~Folder()
|
|||
{
|
||||
if( _thread ) {
|
||||
_csync->abort();
|
||||
_thread->quit();
|
||||
_thread->wait();
|
||||
}
|
||||
delete _csync;
|
||||
|
@ -400,35 +399,25 @@ void Folder::slotCatchWatcherError(const QString& error)
|
|||
Logger::instance()->postGuiLog(tr("Error"), error);
|
||||
}
|
||||
|
||||
void Folder::slotTerminateSync()
|
||||
void Folder::slotTerminateSync(bool block)
|
||||
{
|
||||
qDebug() << "folder " << alias() << " Terminating!";
|
||||
MirallConfigFile cfg;
|
||||
QString configDir = cfg.configPath();
|
||||
qDebug() << "csync's Config Dir: " << configDir;
|
||||
|
||||
if( _thread && _csync ) {
|
||||
_csync->abort();
|
||||
_errors.append( tr("The CSync thread terminated.") );
|
||||
_csyncError = true;
|
||||
if (!block) {
|
||||
setSyncState(SyncResult::SyncAbortRequested);
|
||||
return;
|
||||
}
|
||||
|
||||
_thread->wait();
|
||||
_csync->deleteLater();
|
||||
delete _thread;
|
||||
_csync = 0;
|
||||
_thread = 0;
|
||||
csync_resume(_csync_ctx);
|
||||
}
|
||||
|
||||
if( ! configDir.isEmpty() ) {
|
||||
QFile file( configDir + QLatin1String("/lock"));
|
||||
if( file.exists() ) {
|
||||
qDebug() << "After termination, lock file exists and gets removed.";
|
||||
file.remove();
|
||||
}
|
||||
}
|
||||
|
||||
_errors.append( tr("The CSync thread terminated.") );
|
||||
_csyncError = true;
|
||||
qDebug() << "-> CSync Terminated!";
|
||||
slotCSyncFinished();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// This removes the csync File database if the sync folder definition is removed
|
||||
|
|
|
@ -135,8 +135,10 @@ public slots:
|
|||
|
||||
/**
|
||||
* terminate the current sync run
|
||||
*
|
||||
* If block is true, this will block synchroniously for the sync thread to finish.
|
||||
*/
|
||||
void slotTerminateSync();
|
||||
void slotTerminateSync(bool block);
|
||||
|
||||
void slotAboutToRemoveAllFiles(SyncFileItem::Direction, bool*);
|
||||
|
||||
|
|
|
@ -295,8 +295,7 @@ void FolderMan::terminateSyncProcess( const QString& alias )
|
|||
if( ! folderAlias.isEmpty() ) {
|
||||
Folder *f = _folderMap[folderAlias];
|
||||
if( f ) {
|
||||
f->slotTerminateSync();
|
||||
|
||||
f->slotTerminateSync(true);
|
||||
if(_currentSyncFolder == folderAlias )
|
||||
_currentSyncFolder.clear();
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@ public:
|
|||
NotYetStarted,
|
||||
SyncPrepare,
|
||||
SyncRunning,
|
||||
SyncAbortRequested,
|
||||
Success,
|
||||
Problem,
|
||||
Error,
|
||||
|
|
|
@ -71,6 +71,9 @@ QString Theme::statusHeaderText( SyncResult::Status status ) const
|
|||
case SyncResult::SyncPrepare:
|
||||
resultStr = QCoreApplication::translate("theme", "Preparing to sync" );
|
||||
break;
|
||||
case SyncResult::SyncAbortRequested:
|
||||
resultStr = QCoreApplication::translate("theme", "Aborting..." );
|
||||
break;
|
||||
|
||||
}
|
||||
return resultStr;
|
||||
|
@ -241,6 +244,7 @@ QIcon Theme::syncStateIcon( SyncResult::Status status, bool sysTray ) const
|
|||
statusIcon = QLatin1String("state-offline");
|
||||
break;
|
||||
case SyncResult::SyncRunning:
|
||||
case SyncResult::SyncAbortRequested:
|
||||
statusIcon = QLatin1String("state-sync");
|
||||
break;
|
||||
case SyncResult::SyncPrepare:
|
||||
|
|
Loading…
Reference in a new issue