Add completeObserver method to FileProviderEnumerator
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Thu, 12 Jan 2023 20:50:35 +0000 (21:50 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:12 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift

index f3b4092b162faefffea80df2e56b51ee88889633..eea37e2b43c12bed5426d6b3c6a8639e4a29786a 100644 (file)
@@ -18,6 +18,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
     
     private let enumeratedItemIdentifier: NSFileProviderItemIdentifier
     private let anchor = NSFileProviderSyncAnchor("an anchor".data(using: .utf8)!)
+    private let maxItemsPerFileProviderPage = 100
     var serverUrl: URL?
     
     init(enumeratedItemIdentifier: NSFileProviderItemIdentifier, ncAccount: NextcloudAccount?) {
@@ -77,4 +78,32 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
     func currentSyncAnchor(completionHandler: @escaping (NSFileProviderSyncAnchor?) -> Void) {
         completionHandler(anchor)
     }
+
+    // MARK: - Helper methods
+
+    func completeObserver(observer: NSFileProviderEnumerationObserver, numPage: Int, itemMetadatas: [NextcloudItemMetadataTable]?) {
+        guard itemMetadatas != nil else { observer.finishEnumerating(upTo: nil); return }
+        var items: [NSFileProviderItem] = []
+
+        for itemMetadata in itemMetadatas! {
+            if itemMetadata.e2eEncrypted { continue }
+
+            createFileOrDirectoryLocally(metadata: itemMetadata)
+
+            if let parentItemIdentifier = parentItemIdentifierFromMetadata(itemMetadata) {
+                let item = FileProviderItem(metadata: itemMetadata, parentItemIdentifier: parentItemIdentifier)
+                items.append(item)
+            }
+        }
+
+        observer.didEnumerate(items)
+
+        if items.count == maxItemsPerFileProviderPage {
+            let nextPage = numPage + 1
+            let providerPage = NSFileProviderPage("\(nextPage)".data(using: .utf8)!)
+            observer.finishEnumerating(upTo: providerPage)
+        } else {
+            observer.finishEnumerating(upTo: nil)
+        }
+    }
 }