From 67de82913ed552ec43611d89f53a7d38fa794db0 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 27 Jan 2023 02:26:27 +0100 Subject: [PATCH] Keep track of requested enumerators when account is being configured, notify them as changed once account is set up Signed-off-by: Claudio Cambra --- .../FileProviderEnumerator.swift | 10 +++----- .../FileProviderExtension.swift | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift index 27fa61389..f20844982 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift @@ -20,16 +20,16 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { private let enumeratedItemIdentifier: NSFileProviderItemIdentifier private let anchor = NSFileProviderSyncAnchor("an anchor".data(using: .utf8)!) private static let maxItemsPerFileProviderPage = 100 - var ncAccount: NextcloudAccount? - var serverUrl: String? + var ncAccount: NextcloudAccount + var serverUrl: String = "" - init(enumeratedItemIdentifier: NSFileProviderItemIdentifier, ncAccount: NextcloudAccount?) { + init(enumeratedItemIdentifier: NSFileProviderItemIdentifier, ncAccount: NextcloudAccount) { self.enumeratedItemIdentifier = enumeratedItemIdentifier self.ncAccount = ncAccount if enumeratedItemIdentifier == .rootContainer { NSLog("Providing enumerator for root container") - self.serverUrl = ncAccount?.davFilesUrl + self.serverUrl = ncAccount.davFilesUrl } else { NSLog("Providing enumerator for item with identifier: %@", enumeratedItemIdentifier.rawValue) let dbManager = NextcloudFilesDatabaseManager.shared @@ -70,8 +70,6 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { return } - guard let serverUrl = serverUrl, let ncAccount = ncAccount else { observer.finishEnumerating(upTo: nil); return } - if page == NSFileProviderPage.initialPageSortedByDate as NSFileProviderPage || page == NSFileProviderPage.initialPageSortedByName as NSFileProviderPage { diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift index 89cd7ac69..257e2976a 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift @@ -48,6 +48,8 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension { return session }() + private var itemIdsForEnumeratorsNeedingSignalling: NSMutableSet = NSMutableSet() + required init(domain: NSFileProviderDomain) { self.domain = domain // The containing application must create a domain using `NSFileProviderManager.add(_:, completionHandler:)`. The system will then launch the application extension process, call `FileProviderExtension.init(domain:)` to instantiate the extension for that domain, and call methods on the instance. @@ -126,6 +128,13 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension { } func enumerator(for containerItemIdentifier: NSFileProviderItemIdentifier, request: NSFileProviderRequest) throws -> NSFileProviderEnumerator { + + guard let ncAccount = ncAccount else { + NSLog("Not providing enumerator for container with identifier %@ yet as account not set up") + itemIdsForEnumeratorsNeedingSignalling.add(containerItemIdentifier) + throw NSFileProviderError(.notAuthenticated) + } + return FileProviderEnumerator(enumeratedItemIdentifier: containerItemIdentifier, ncAccount: ncAccount) } @@ -139,5 +148,21 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension { func setupDomainAccount(user: String, serverUrl: String, password: String) { ncAccount = NextcloudAccount(user: user, serverUrl: serverUrl, password: password) + NSLog("Nextcloud account set up in File Provider extension for user: %@ at server: %@", user, serverUrl) + + for itemIdObj in itemIdsForEnumeratorsNeedingSignalling { + guard let itemIdentifier = itemIdObj as? NSFileProviderItemIdentifier else { + NSLog("Skipping non-NSFileProviderItemIdentifier object in itemIdsForEnumeratorsNeedingSignalling.") + continue; + } + + NSFileProviderManager(for: domain)?.signalEnumerator(for: itemIdentifier) { error in + if error != nil { + NSLog("Error signalling enumerator: %@ for itemIdentifier", error!.localizedDescription, itemIdentifier.rawValue) + } + } + } + + itemIdsForEnumeratorsNeedingSignalling = NSMutableSet() } } -- 2.30.2