From b52b82134e04c9d402182d201ab39d1a1b453b4c Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 10 Mar 2023 02:09:24 +0100 Subject: [PATCH] Enumerate all known folders as workingSet enumeration Signed-off-by: Claudio Cambra --- .../FileProviderEnumerator.swift | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift index 01f53c308..49961eaa3 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift @@ -84,8 +84,40 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { if enumeratedItemIdentifier == .workingSet && dbManager.anyItemMetadatasForAccount(ncAccount.ncKitAccount) { NSLog("Enumerating working set for user: %@ with serverUrl: %@", ncAccount.username, serverUrl) - let itemMetadatas = dbManager.itemMetadatas(account: ncAccount.ncKitAccount) - FileProviderEnumerator.completeEnumerationObserver(observer, ncKit: self.ncKit, numPage: 1, itemMetadatas: itemMetadatas, createLocalFileOrDirectory: false) + let directoryMetadatas = dbManager.directoryMetadatas(account: ncAccount.ncKitAccount) + var allMetadatas: [NextcloudItemMetadataTable] = [] + + let dispatchGroup = DispatchGroup() + dispatchGroup.notify(queue: .main) { // Wait for all read tasks to finish + FileProviderEnumerator.completeEnumerationObserver(observer, ncKit: self.ncKit, numPage: 1, itemMetadatas: allMetadatas) + } + + for directoryMetadata in directoryMetadatas { + dispatchGroup.enter() + + FileProviderEnumerator.readServerUrl(directoryMetadata.serverUrl, ncAccount: ncAccount, ncKit: ncKit) { metadatas, _, _, _, readError in + guard readError == nil else { + NSLog("Finishing enumeration of working set directory %@ with error %@", directoryMetadata.serverUrl, readError!.localizedDescription) + + if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 { + NSLog("404 error means item no longer exists. Deleting metadata and reporting as deletion without error") + dbManager.deleteDirectoryAndSubdirectoriesMetadata(ocId: directoryMetadata.ocId) + } + + dispatchGroup.leave() + return + } + + if let metadatas = metadatas { + allMetadatas += metadatas + } else { + allMetadatas += dbManager.itemMetadatas(account: self.ncAccount.ncKitAccount, serverUrl: directoryMetadata.serverUrl) + } + + dispatchGroup.leave() + } + } + return } else if enumeratedItemIdentifier == .trashContainer { NSLog("Enumerating trash set for user: %@ with serverUrl: %@", ncAccount.username, serverUrl) @@ -182,9 +214,9 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { for directoryMetadata in directoryMetadatas { dispatchGroup.enter() - FileProviderEnumerator.readServerUrl(directoryMetadata.serverUrl, ncAccount: ncAccount, ncKit: ncKit) { [self] _, newMetadatas, updatedMetadatas, deletedMetadatas, readError in + FileProviderEnumerator.readServerUrl(directoryMetadata.serverUrl, ncAccount: ncAccount, ncKit: ncKit) { _, newMetadatas, updatedMetadatas, deletedMetadatas, readError in guard readError == nil else { - NSLog("Finishing enumeration of changes at %@ with error %@", serverUrl) + NSLog("Finishing enumeration of changes at %@ with error %@", self.serverUrl, readError!.localizedDescription) if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 { NSLog("404 error means item no longer exists. Deleting metadata and reporting as deletion without error")