From: Claudio Cambra Date: Thu, 12 Jan 2023 20:49:28 +0000 (+0100) Subject: Fill out FileProviderItem X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~10^2~55^2~278 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7d1b275d5072a5455b35f331a8983aa703f1aced;p=nextcloud-desktop.git Fill out FileProviderItem Signed-off-by: Claudio Cambra --- diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift index 5c49c88de..f3b4092b1 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift @@ -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) } diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderItem.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderItem.swift index fa793e42b..45f35b0ab 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderItem.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderItem.swift @@ -14,39 +14,106 @@ 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() } }