From 10aaf18129a8da2c2789f2a09fb706b337b945c7 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 17 Jun 2015 15:55:48 +0200 Subject: [PATCH] FolderMan: Make folderSyncStateChange() signal reliable. #3354 --- src/gui/folder.cpp | 6 +++++- src/gui/folderman.cpp | 41 +++++++++++++++++++++++------------------ src/gui/folderman.h | 7 ++++++- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index 6a4e9a99f..06e0086f3 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -74,7 +74,11 @@ Folder::Folder(const FolderDefinition& definition, _timeSinceLastSyncStart.start(); _timeSinceLastSyncDone.start(); - _syncResult.setStatus( SyncResult::NotYetStarted ); + SyncResult::Status status = SyncResult::NotYetStarted; + if (definition.paused) { + status = SyncResult::Paused; + } + _syncResult.setStatus(status); // check if the local path exists checkLocalPath(); diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 86446d847..6ed55f8db 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -107,6 +107,15 @@ void FolderMan::unloadFolder( Folder *f ) _folderWatchers.remove(f->alias()); } _folderMap.remove( f->alias() ); + + disconnect(f, SIGNAL(scheduleToSync(Folder*)), + this, SLOT(slotScheduleSync(Folder*))); + disconnect(f, SIGNAL(syncStarted()), + this, SLOT(slotFolderSyncStarted())); + disconnect(f, SIGNAL(syncFinished(SyncResult)), + this, SLOT(slotFolderSyncFinished(SyncResult))); + disconnect(f, SIGNAL(syncStateChange()), + this, SLOT(slotForwardFolderSyncStateChange())); } int FolderMan::unloadAndDeleteAllFolders() @@ -389,22 +398,12 @@ Folder* FolderMan::setupFolderFromOldConfigFile(const QString &file, AccountStat folderDefinition.alias = alias; folderDefinition.localPath = path; folderDefinition.targetPath = targetPath; - folder = new Folder(folderDefinition, this ); - if( folder ) { + folderDefinition.paused = paused; + + folder = addFolderInternal(folderDefinition); + if (folder) { folder->setAccountState(accountState); - qDebug() << "Adding folder to Folder Map " << folder; - _folderMap[alias] = folder; - if (paused) { - folder->setSyncPaused(paused); - _disabledFolders.insert(folder); - } - - connect(folder, SIGNAL(scheduleToSync(Folder*)), SLOT(slotScheduleSync(Folder*))); - connect(folder, SIGNAL(syncStarted()), SLOT(slotFolderSyncStarted())); - connect(folder, SIGNAL(syncFinished(SyncResult)), SLOT(slotFolderSyncFinished(SyncResult))); - - registerFolderMonitor(folder); QStringList blackList = settings.value( QLatin1String("blackList")).toStringList(); if (!blackList.empty()) { //migrate settings @@ -690,6 +689,13 @@ void FolderMan::slotRemoveFoldersForAccount(AccountState* accountState) } } +void FolderMan::slotForwardFolderSyncStateChange() +{ + if (Folder* f = qobject_cast(sender())) { + emit folderSyncStateChange(f); + } +} + void FolderMan::slotFolderSyncStarted( ) { qDebug() << ">===================================== sync started for " << _currentSyncFolder->alias(); @@ -731,16 +737,15 @@ Folder* FolderMan::addFolderInternal(const FolderDefinition& folderDefinition) qDebug() << "Adding folder to Folder Map " << folder; _folderMap[folder->alias()] = folder; - if (folderDefinition.paused) { - folder->setSyncPaused(true); + if (folder->syncPaused()) { _disabledFolders.insert(folder); } - /* Use a signal mapper to connect the signals to the alias */ + // See matching disconnects in unloadFolder(). connect(folder, SIGNAL(scheduleToSync(Folder*)), SLOT(slotScheduleSync(Folder*))); connect(folder, SIGNAL(syncStarted()), SLOT(slotFolderSyncStarted())); connect(folder, SIGNAL(syncFinished(SyncResult)), SLOT(slotFolderSyncFinished(SyncResult))); - + connect(folder, SIGNAL(syncStateChange()), SLOT(slotForwardFolderSyncStateChange())); registerFolderMonitor(folder); return folder; diff --git a/src/gui/folderman.h b/src/gui/folderman.h index 6102bc7fb..634872889 100644 --- a/src/gui/folderman.h +++ b/src/gui/folderman.h @@ -135,8 +135,13 @@ private slots: void slotRemoveFoldersForAccount(AccountState* accountState); + // Wraps the Folder::syncStateChange() signal into the + // FolderMan::folderSyncStateChange(Folder*) signal. + void slotForwardFolderSyncStateChange(); + private: - /** Adds a folder for an account, does not add it to the account settings. + /** Adds a new folder, does not add it to the account settings and + * does not set an account on the new folder. */ Folder* addFolderInternal(const FolderDefinition& folderDefinition);