@@ -113,20 +113,30 @@ void E2EFolderManager::restoreE2eFoldersForAccount(const AccountPtr &account)
113113
114114 auto blackList = folder->journalDb ()->getSelectiveSyncList (SyncJournalDb::SelectiveSyncBlackList, &ok);
115115 qCDebug (lcE2eFolderManager) << " Current blacklist:" << blackList;
116+ const auto blackListSize = blackList.size ();
116117
117118 for (const auto &pathToRemoveFromBlackList : foldersToRemoveFromBlacklist) {
118119 blackList.removeAll (pathToRemoveFromBlackList);
119120 }
120121
121- folder->journalDb ()->setSelectiveSyncList (SyncJournalDb::SelectiveSyncBlackList, blackList);
122- folder->journalDb ()->setSelectiveSyncList (SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, {});
122+ if (blackList.size () != blackListSize) {
123+ if (folder->isSyncRunning ()) {
124+ qCDebug (lcE2eFolderManager) << " Folder is syncing, terminating to prevent E2E folder deletion" ;
125+ folderTerminateSyncAndUpdateBlackList (blackList, folder, foldersToRemoveFromBlacklist);
126+ ++foldersProcessed;
127+ continue ;
128+ }
123129
124- for (const auto &pathToRemoteDiscover : foldersToRemoveFromBlacklist) {
125- folder->journalDb ()->schedulePathForRemoteDiscovery (pathToRemoteDiscover);
126- }
130+ folder->journalDb ()->setSelectiveSyncList (SyncJournalDb::SelectiveSyncBlackList, blackList);
131+ folder->journalDb ()->setSelectiveSyncList (SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, {});
127132
128- folderMan->scheduleFolder (folder);
129- ++foldersProcessed;
133+ for (const auto &pathToRemoteDiscover : foldersToRemoveFromBlacklist) {
134+ folder->journalDb ()->schedulePathForRemoteDiscovery (pathToRemoteDiscover);
135+ }
136+
137+ folderMan->scheduleFolder (folder);
138+ ++foldersProcessed;
139+ }
130140 }
131141
132142 if (foldersProcessed > 0 ) {
@@ -136,4 +146,31 @@ void E2EFolderManager::restoreE2eFoldersForAccount(const AccountPtr &account)
136146 }
137147}
138148
149+ void E2EFolderManager::folderTerminateSyncAndUpdateBlackList (const QStringList &blackList, OCC ::Folder *folder, const QStringList &foldersToRemoveFromBlacklist)
150+ {
151+ if (_folderConnections.contains (folder->alias ())) {
152+ qCWarning (lcE2eFolderManager) << " Folder " << folder->alias () << " is already terminating the sync." ;
153+ return ;
154+ }
155+ // in case sync is already running - terminate it and start a new one
156+ const QMetaObject::Connection syncTerminatedConnection = connect (folder, &Folder::syncFinished, this , [this , blackList, folder, foldersToRemoveFromBlacklist]() {
157+ const auto foundConnectionIt = _folderConnections.find (folder->alias ());
158+ if (foundConnectionIt != _folderConnections.end ()) {
159+ disconnect (*foundConnectionIt);
160+ _folderConnections.erase (foundConnectionIt);
161+ }
162+
163+ folder->journalDb ()->setSelectiveSyncList (SyncJournalDb::SelectiveSyncBlackList, blackList);
164+ folder->journalDb ()->setSelectiveSyncList (SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, {});
165+
166+ for (const auto &pathToRemoteDiscover : foldersToRemoveFromBlacklist) {
167+ folder->journalDb ()->schedulePathForRemoteDiscovery (pathToRemoteDiscover);
168+ }
169+
170+ FolderMan::instance ()->scheduleFolder (folder);
171+ });
172+ _folderConnections.insert (folder->alias (), syncTerminatedConnection);
173+ folder->slotTerminateSync ();
174+ }
175+
139176} // namespace OCC
0 commit comments