Fill out FileProviderItem
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Thu, 12 Jan 2023 20:49:28 +0000 (21:49 +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
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderItem.swift

index 5c49c88deed0e1fd16fb4a25cb4d645b111b8794..f3b4092b162faefffea80df2e56b51ee88889633 100644 (file)
@@ -27,8 +27,8 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
             self.serverUrl = ncAccount?.davFilesUrl
         } else {
             let dbManager = NextcloudFilesDatabaseManager.shared
-            if let itemMetadata = dbManager.fileMetadataFromFileProviderItemIdentifier(enumeratedItemIdentifier),
-               let itemDirectoryMetadata = dbManager.directoryMetadataForFile(itemMetadata) {
+            if let itemMetadata = dbManager.itemMetadataFromFileProviderItemIdentifier(enumeratedItemIdentifier),
+               let itemDirectoryMetadata = dbManager.parentDirectoryMetadataForItem(itemMetadata) {
 
                 self.serverUrl = URL(string: itemDirectoryMetadata.serverUrl + "/" + itemMetadata.fileName)
             }
@@ -42,6 +42,8 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
         // TODO: perform invalidation of server connection if necessary
     }
 
+    // MARK: - Protocol methods
+
     func enumerateItems(for observer: NSFileProviderEnumerationObserver, startingAt page: NSFileProviderPage) {
         /* TODO:
          - inspect the page to determine whether this is an initial or a follow-up request
@@ -55,7 +57,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
          - inform the observer about the items returned by the server (possibly multiple times)
          - inform the observer that you are finished with this page
          */
-        observer.didEnumerate([FileProviderItem(identifier: NSFileProviderItemIdentifier("a file"))])
+        //observer.didEnumerate([FileProviderItem(identifier: NSFileProviderItemIdentifier("a file"))])
         observer.finishEnumerating(upTo: nil)
     }
     
index fa793e42b139e96683cc88d050eb24c6a5bb5800..45f35b0ab8ebba262a20c4439e56bfb87b7c64cd 100644 (file)
 
 import FileProvider
 import UniformTypeIdentifiers
+import NextcloudKit
 
 class FileProviderItem: NSObject, NSFileProviderItem {
 
-    // TODO: implement an initializer to create an item from your extension's backing model
-    // TODO: implement the accessors to return the values from your extension's backing model
-    
-    private let identifier: NSFileProviderItemIdentifier
-    
-    init(identifier: NSFileProviderItemIdentifier) {
-        self.identifier = identifier
+    enum FileProviderItemTransferError: Error {
+        case downloadError
+        case uploadError
     }
+
+    let metadata: NextcloudItemMetadataTable
+    let parentItemIdentifier: NSFileProviderItemIdentifier
     
     var itemIdentifier: NSFileProviderItemIdentifier {
-        return identifier
-    }
-    
-    var parentItemIdentifier: NSFileProviderItemIdentifier {
-        return .rootContainer
+        return NSFileProviderItemIdentifier(metadata.ocId)
     }
     
     var capabilities: NSFileProviderItemCapabilities {
-        return [.allowsReading, .allowsWriting, .allowsRenaming, .allowsReparenting, .allowsTrashing, .allowsDeleting]
+        guard !metadata.directory else {
+            return [ .allowsAddingSubItems,
+                     .allowsContentEnumerating,
+                     .allowsReading,
+                     .allowsDeleting,
+                     .allowsRenaming ]
+        }
+        guard !metadata.lock else {
+            return [ .allowsReading ]
+        }
+        return [ .allowsWriting,
+                 .allowsReading,
+                 .allowsDeleting,
+                 .allowsRenaming,
+                 .allowsReparenting ]
     }
     
     var itemVersion: NSFileProviderItemVersion {
-        NSFileProviderItemVersion(contentVersion: "a content version".data(using: .utf8)!, metadataVersion: "a metadata version".data(using: .utf8)!)
+        NSFileProviderItemVersion(contentVersion: metadata.etag.data(using: .utf8)!,
+                                  metadataVersion: metadata.etag.data(using: .utf8)!)
     }
     
     var filename: String {
-        return identifier.rawValue
+        return metadata.fileNameView
     }
     
     var contentType: UTType {
-        return identifier == NSFileProviderItemIdentifier.rootContainer ? .folder : .plainText
+        if self.itemIdentifier == .rootContainer || metadata.directory {
+            return .folder
+        }
+
+        let internalType = NKCommon.shared.getInternalType(fileName: metadata.fileNameView,
+                                                           mimeType: "",
+                                                           directory: metadata.directory)
+        return UTType(filenameExtension: internalType.ext) ?? .content
+    }
+
+    var documentSize: NSNumber? {
+        return NSNumber(value: metadata.size)
+    }
+
+    var creationDate: Date? {
+        return metadata.creationDate as Date
+    }
+
+    var lastUsedDate: Date? {
+        return metadata.date as Date
+    }
+
+    var isDownloaded: Bool {
+        return metadata.directory || isFileSynced(metadata: metadata)
+    }
+
+    var isDownloading: Bool {
+        return metadata.status == NextcloudItemMetadataTable.Status.downloading.rawValue
+    }
+
+    var downloadingError: Error? {
+        if metadata.status == NextcloudItemMetadataTable.Status.downloadError.rawValue {
+            return FileProviderItemTransferError.downloadError
+        }
+        return nil
+    }
+
+    var isUploaded: Bool {
+        return NextcloudFilesDatabaseManager.shared.localFileMetadataFromOcId(metadata.ocId) != nil
+    }
+
+    var isUploading: Bool {
+        return metadata.status == NextcloudItemMetadataTable.Status.uploading.rawValue
+    }
+
+    var uploadingError: Error? {
+        if metadata.status == NextcloudItemMetadataTable.Status.uploadError.rawValue {
+            return FileProviderItemTransferError.uploadError
+        } else {
+            return nil
+        }
+    }
+
+    init(metadata: NextcloudItemMetadataTable, parentItemIdentifier: NSFileProviderItemIdentifier) {
+        self.metadata = metadata
+        self.parentItemIdentifier = parentItemIdentifier
+        super.init()
     }
 }