Move NKFile to metadata conversion methods to a new extension for NextcloudItemMetada...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 20 Mar 2023 13:29:14 +0000 (14:29 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 08:02:37 +0000 (16:02 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseManager.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift [new file with mode: 0644]
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator+SyncEngine.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift
shell_integration/MacOSX/NextcloudIntegration/NextcloudIntegration.xcodeproj/project.pbxproj

index c93439fbad5cc540db53d521eead4d3110c7b6ca..977ece03175efd300d32b7ca389d2ec844c7ff9f 100644 (file)
@@ -508,100 +508,4 @@ class NextcloudFilesDatabaseManager : NSObject {
 
         return itemMetadatas
     }
-
-    func convertNKFileToItemMetadata(_ file: NKFile, account: String) -> NextcloudItemMetadataTable {
-
-        let metadata = NextcloudItemMetadataTable()
-
-        metadata.account = account
-        metadata.checksums = file.checksums
-        metadata.commentsUnread = file.commentsUnread
-        metadata.contentType = file.contentType
-        if let date = file.creationDate {
-            metadata.creationDate = date as Date
-        } else {
-            metadata.creationDate = file.date as Date
-        }
-        metadata.dataFingerprint = file.dataFingerprint
-        metadata.date = file.date as Date
-        metadata.directory = file.directory
-        metadata.downloadURL = file.downloadURL
-        metadata.e2eEncrypted = file.e2eEncrypted
-        metadata.etag = file.etag
-        metadata.favorite = file.favorite
-        metadata.fileId = file.fileId
-        metadata.fileName = file.fileName
-        metadata.fileNameView = file.fileName
-        metadata.hasPreview = file.hasPreview
-        metadata.iconName = file.iconName
-        metadata.mountType = file.mountType
-        metadata.name = file.name
-        metadata.note = file.note
-        metadata.ocId = file.ocId
-        metadata.ownerId = file.ownerId
-        metadata.ownerDisplayName = file.ownerDisplayName
-        metadata.lock = file.lock
-        metadata.lockOwner = file.lockOwner
-        metadata.lockOwnerEditor = file.lockOwnerEditor
-        metadata.lockOwnerType = file.lockOwnerType
-        metadata.lockOwnerDisplayName = file.lockOwnerDisplayName
-        metadata.lockTime = file.lockTime
-        metadata.lockTimeOut = file.lockTimeOut
-        metadata.path = file.path
-        metadata.permissions = file.permissions
-        metadata.quotaUsedBytes = file.quotaUsedBytes
-        metadata.quotaAvailableBytes = file.quotaAvailableBytes
-        metadata.richWorkspace = file.richWorkspace
-        metadata.resourceType = file.resourceType
-        metadata.serverUrl = file.serverUrl
-        metadata.sharePermissionsCollaborationServices = file.sharePermissionsCollaborationServices
-        for element in file.sharePermissionsCloudMesh {
-            metadata.sharePermissionsCloudMesh.append(element)
-        }
-        for element in file.shareType {
-            metadata.shareType.append(element)
-        }
-        metadata.size = file.size
-        metadata.classFile = file.classFile
-        //FIXME: iOS 12.0,* don't detect UTI text/markdown, text/x-markdown
-        if (metadata.contentType == "text/markdown" || metadata.contentType == "text/x-markdown") && metadata.classFile == NKCommon.TypeClassFile.unknow.rawValue {
-            metadata.classFile = NKCommon.TypeClassFile.document.rawValue
-        }
-        if let date = file.uploadDate {
-            metadata.uploadDate = date as Date
-        } else {
-            metadata.uploadDate = file.date as Date
-        }
-        metadata.urlBase = file.urlBase
-        metadata.user = file.user
-        metadata.userId = file.userId
-
-        // Support for finding the correct filename for e2ee files should go here
-
-        return metadata
-    }
-
-    func convertNKFilesFromDirectoryReadToItemMetadatas(_ files: [NKFile], account: String, completionHandler: @escaping (_ directoryMetadata: NextcloudItemMetadataTable, _ childDirectoriesMetadatas: [NextcloudItemMetadataTable], _ metadatas: [NextcloudItemMetadataTable]) -> Void) {
-
-        var directoryMetadataSet = false
-        var directoryMetadata = NextcloudItemMetadataTable()
-        var childDirectoriesMetadatas: [NextcloudItemMetadataTable] = []
-        var metadatas: [NextcloudItemMetadataTable] = []
-
-        for file in files {
-            let metadata = convertNKFileToItemMetadata(file, account: account)
-
-            if metadatas.isEmpty && !directoryMetadataSet {
-                directoryMetadata = metadata;
-                directoryMetadataSet = true;
-            } else {
-                metadatas.append(metadata)
-                if metadata.directory {
-                    childDirectoriesMetadatas.append(metadata)
-                }
-            }
-        }
-
-        completionHandler(directoryMetadata, childDirectoriesMetadatas, metadatas)
-    }
 }
diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift
new file mode 100644 (file)
index 0000000..305d9cb
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2023 by Claudio Cambra <claudio.cambra@nextcloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+import Foundation
+import NextcloudKit
+
+extension NextcloudItemMetadataTable {
+    static func fromNKFile(_ file: NKFile, account: String) -> NextcloudItemMetadataTable {
+        let metadata = NextcloudItemMetadataTable()
+
+        metadata.account = account
+        metadata.checksums = file.checksums
+        metadata.commentsUnread = file.commentsUnread
+        metadata.contentType = file.contentType
+        if let date = file.creationDate {
+            metadata.creationDate = date as Date
+        } else {
+            metadata.creationDate = file.date as Date
+        }
+        metadata.dataFingerprint = file.dataFingerprint
+        metadata.date = file.date as Date
+        metadata.directory = file.directory
+        metadata.downloadURL = file.downloadURL
+        metadata.e2eEncrypted = file.e2eEncrypted
+        metadata.etag = file.etag
+        metadata.favorite = file.favorite
+        metadata.fileId = file.fileId
+        metadata.fileName = file.fileName
+        metadata.fileNameView = file.fileName
+        metadata.hasPreview = file.hasPreview
+        metadata.iconName = file.iconName
+        metadata.mountType = file.mountType
+        metadata.name = file.name
+        metadata.note = file.note
+        metadata.ocId = file.ocId
+        metadata.ownerId = file.ownerId
+        metadata.ownerDisplayName = file.ownerDisplayName
+        metadata.lock = file.lock
+        metadata.lockOwner = file.lockOwner
+        metadata.lockOwnerEditor = file.lockOwnerEditor
+        metadata.lockOwnerType = file.lockOwnerType
+        metadata.lockOwnerDisplayName = file.lockOwnerDisplayName
+        metadata.lockTime = file.lockTime
+        metadata.lockTimeOut = file.lockTimeOut
+        metadata.path = file.path
+        metadata.permissions = file.permissions
+        metadata.quotaUsedBytes = file.quotaUsedBytes
+        metadata.quotaAvailableBytes = file.quotaAvailableBytes
+        metadata.richWorkspace = file.richWorkspace
+        metadata.resourceType = file.resourceType
+        metadata.serverUrl = file.serverUrl
+        metadata.sharePermissionsCollaborationServices = file.sharePermissionsCollaborationServices
+        for element in file.sharePermissionsCloudMesh {
+            metadata.sharePermissionsCloudMesh.append(element)
+        }
+        for element in file.shareType {
+            metadata.shareType.append(element)
+        }
+        metadata.size = file.size
+        metadata.classFile = file.classFile
+        //FIXME: iOS 12.0,* don't detect UTI text/markdown, text/x-markdown
+        if (metadata.contentType == "text/markdown" || metadata.contentType == "text/x-markdown") && metadata.classFile == NKCommon.TypeClassFile.unknow.rawValue {
+            metadata.classFile = NKCommon.TypeClassFile.document.rawValue
+        }
+        if let date = file.uploadDate {
+            metadata.uploadDate = date as Date
+        } else {
+            metadata.uploadDate = file.date as Date
+        }
+        metadata.urlBase = file.urlBase
+        metadata.user = file.user
+        metadata.userId = file.userId
+
+        // Support for finding the correct filename for e2ee files should go here
+
+        return metadata
+    }
+
+    static func metadatasFromDirectoryReadNKFiles(_ files: [NKFile],
+                                                  account: String,
+                                                  completionHandler: @escaping (_ directoryMetadata: NextcloudItemMetadataTable,
+                                                                                _ childDirectoriesMetadatas: [NextcloudItemMetadataTable],
+                                                                                _ metadatas: [NextcloudItemMetadataTable]) -> Void) {
+
+        var directoryMetadataSet = false
+        var directoryMetadata = NextcloudItemMetadataTable()
+        var childDirectoriesMetadatas: [NextcloudItemMetadataTable] = []
+        var metadatas: [NextcloudItemMetadataTable] = []
+
+        for file in files {
+            let metadata = NextcloudItemMetadataTable.fromNKFile(file, account: account)
+
+            if metadatas.isEmpty && !directoryMetadataSet {
+                assert(metadata.directory) // In directory read first metadata will always be a dir
+                directoryMetadata = metadata;
+                directoryMetadataSet = true;
+            } else {
+                metadatas.append(metadata)
+                if metadata.directory {
+                    childDirectoriesMetadatas.append(metadata)
+                }
+            }
+        }
+
+        completionHandler(directoryMetadata, childDirectoriesMetadatas, metadatas)
+    }
+}
index 0ac14095d49817c2b7488d82c1db09cf52ccbc36..3f76da4e0e1a18a32eec9db55798d256702d155d 100644 (file)
@@ -43,29 +43,6 @@ class NextcloudItemMetadataTable: Object {
         case maxFolderShare = 31
     }
 
-    override func isEqual(_ object: Any?) -> Bool {
-        if let object = object as? NextcloudItemMetadataTable {
-            return self.fileId == object.fileId &&
-                   self.account == object.account &&
-                   self.path == object.path &&
-                   self.fileName == object.fileName
-        }
-
-        return false
-    }
-
-    func isInSameDatabaseStoreableRemoteState(_ comparingMetadata: NextcloudItemMetadataTable) -> Bool {
-        return comparingMetadata.etag == self.etag &&
-            comparingMetadata.fileNameView == self.fileNameView &&
-            comparingMetadata.date == self.date &&
-            comparingMetadata.permissions == self.permissions &&
-            comparingMetadata.hasPreview == self.hasPreview &&
-            comparingMetadata.note == self.note &&
-            comparingMetadata.lock == self.lock &&
-            comparingMetadata.sharePermissionsCollaborationServices == self.sharePermissionsCollaborationServices &&
-            comparingMetadata.favorite == self.favorite
-    }
-
     @Persisted(primaryKey: true) var ocId: String
     @Persisted var account = ""
     @Persisted var assetLocalIdentifier = ""
@@ -192,6 +169,29 @@ class NextcloudItemMetadataTable: Object {
         status == Status.inUpload.rawValue || status == Status.uploading.rawValue
     }
 
+    override func isEqual(_ object: Any?) -> Bool {
+        if let object = object as? NextcloudItemMetadataTable {
+            return self.fileId == object.fileId &&
+                   self.account == object.account &&
+                   self.path == object.path &&
+                   self.fileName == object.fileName
+        }
+
+        return false
+    }
+
+    func isInSameDatabaseStoreableRemoteState(_ comparingMetadata: NextcloudItemMetadataTable) -> Bool {
+        return comparingMetadata.etag == self.etag &&
+            comparingMetadata.fileNameView == self.fileNameView &&
+            comparingMetadata.date == self.date &&
+            comparingMetadata.permissions == self.permissions &&
+            comparingMetadata.hasPreview == self.hasPreview &&
+            comparingMetadata.note == self.note &&
+            comparingMetadata.lock == self.lock &&
+            comparingMetadata.sharePermissionsCollaborationServices == self.sharePermissionsCollaborationServices &&
+            comparingMetadata.favorite == self.favorite
+    }
+
     /// Returns false if the user is lokced out of the file. I.e. The file is locked but by somone else
     func canUnlock(as user: String) -> Bool {
         return !lock || (lockOwner == user && lockOwnerType == 0)
index 6577dc468a5c677c94af24fb71f267a7df4ea0a9..1213aadd96fb43cc12363a092fd680b22252973f 100644 (file)
@@ -214,7 +214,7 @@ extension FileProviderEnumerator {
         let dbManager = NextcloudFilesDatabaseManager.shared
 
         DispatchQueue.global(qos: .userInitiated).async {
-            dbManager.convertNKFilesFromDirectoryReadToItemMetadatas(files, account: ncAccount.ncKitAccount) { directoryMetadata, childDirectoriesMetadata, metadatas in
+            NextcloudItemMetadataTable.metadatasFromDirectoryReadNKFiles(files, account: ncAccount.ncKitAccount) { directoryMetadata, childDirectoriesMetadata, metadatas in
 
                 // STORE DATA FOR CURRENTLY SCANNED DIRECTORY
                 // We have now scanned this directory's contents, so update with etag in order to not check again if not needed
@@ -260,15 +260,15 @@ extension FileProviderEnumerator {
                 return
             }
 
-            guard let receivedItem = files.first else {
+            guard let receivedFile = files.first else {
                 Logger.enumeration.error("Received no items from readFileOrFolder of \(serverUrl, privacy: OSLogPrivacy.auto(mask: .hash)), not much we can do...")
                 completionHandler(nil, nil, nil, nil, error.error)
                 return
             }
 
-            guard receivedItem.directory else {
+            guard receivedFile.directory else {
                 Logger.enumeration.debug("Read item is a file. Converting NKfile for serverUrl: \(serverUrl, privacy: OSLogPrivacy.auto(mask: .hash)) for user: \(ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash))")
-                let itemMetadata = dbManager.convertNKFileToItemMetadata(receivedItem, account: ncKitAccount)
+                let itemMetadata = NextcloudItemMetadataTable.fromNKFile(receivedFile, account: ncKitAccount)
                 dbManager.addItemMetadata(itemMetadata) // TODO: Return some value when it is an update
                 completionHandler([itemMetadata], nil, nil, nil, error.error)
                 return
@@ -279,7 +279,7 @@ extension FileProviderEnumerator {
 
                 let directoryEtag = directoryMetadata.etag
 
-                guard directoryEtag == "" || directoryEtag != receivedItem.etag else {
+                guard directoryEtag == "" || directoryEtag != receivedFile.etag else {
                     Logger.enumeration.debug("Read server url called with flag to stop enumerating at matching etags. Returning and providing soft error.")
 
                     let description = "Fetched directory etag is same as that stored locally. Not fetching child items."
@@ -294,7 +294,7 @@ extension FileProviderEnumerator {
 
             if depth == "0" {
                 if serverUrl != ncAccount.davFilesUrl {
-                    let metadata = dbManager.convertNKFileToItemMetadata(receivedItem, account: ncKitAccount)
+                    let metadata = NextcloudItemMetadataTable.fromNKFile(receivedFile, account: ncKitAccount)
                     let isNew = dbManager.itemMetadataFromOcId(metadata.ocId) == nil
                     let updatedMetadatas = isNew ? [] : [metadata]
                     let newMetadatas = isNew ? [metadata] : []
index a448c488b9c5b8defd2d26c8449a96bf5f7c706a..1a8bb0ba1e78341f05f714ab6eea87a657d644cf 100644 (file)
@@ -267,7 +267,7 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKComm
                     }
 
                     DispatchQueue.global().async {
-                        dbManager.convertNKFilesFromDirectoryReadToItemMetadatas(files, account: account) { directoryMetadata, childDirectoriesMetadata, metadatas in
+                        NextcloudItemMetadataTable.metadatasFromDirectoryReadNKFiles(files, account: account) { directoryMetadata, childDirectoriesMetadata, metadatas in
 
                             dbManager.addItemMetadata(directoryMetadata)
 
index 84a3cca0b253cb3bfd00eb412ee2cfbe22dd9f37..3fac888d440b860732abf4f5244a99ea477c9729 100644 (file)
@@ -37,6 +37,7 @@
                539158AC27BE71A900816F56 /* FinderSyncSocketLineProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 539158AB27BE71A900816F56 /* FinderSyncSocketLineProcessor.m */; };
                53D056312970594F00988392 /* LocalFilesUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D056302970594F00988392 /* LocalFilesUtils.swift */; };
                53ED472029C5E64200795DB1 /* FileProviderEnumerator+SyncEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53ED471F29C5E64200795DB1 /* FileProviderEnumerator+SyncEngine.swift */; };
+               53ED472829C88E7000795DB1 /* NextcloudItemMetadataTable+NKFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53ED472729C88E7000795DB1 /* NextcloudItemMetadataTable+NKFile.swift */; };
                C2B573BA1B1CD91E00303B36 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C2B573B91B1CD91E00303B36 /* main.m */; };
                C2B573D21B1CD94B00303B36 /* main.m in Resources */ = {isa = PBXBuildFile; fileRef = C2B573B91B1CD91E00303B36 /* main.m */; };
                C2B573DE1B1CD9CE00303B36 /* FinderSync.m in Sources */ = {isa = PBXBuildFile; fileRef = C2B573DD1B1CD9CE00303B36 /* FinderSync.m */; };
                539158B227BEC98A00816F56 /* LocalSocketClient.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LocalSocketClient.m; sourceTree = "<group>"; };
                53D056302970594F00988392 /* LocalFilesUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalFilesUtils.swift; sourceTree = "<group>"; };
                53ED471F29C5E64200795DB1 /* FileProviderEnumerator+SyncEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileProviderEnumerator+SyncEngine.swift"; sourceTree = "<group>"; };
+               53ED472729C88E7000795DB1 /* NextcloudItemMetadataTable+NKFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NextcloudItemMetadataTable+NKFile.swift"; sourceTree = "<group>"; };
                C2B573B11B1CD91E00303B36 /* desktopclient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = desktopclient.app; sourceTree = BUILT_PRODUCTS_DIR; };
                C2B573B51B1CD91E00303B36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
                C2B573B91B1CD91E00303B36 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
                        children = (
                                5307A6F129675346001E0C6A /* NextcloudFilesDatabaseManager.swift */,
                                5318AD9029BF42FB00CBB71C /* NextcloudItemMetadataTable.swift */,
+                               53ED472729C88E7000795DB1 /* NextcloudItemMetadataTable+NKFile.swift */,
                                5318AD9429BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift */,
                        );
                        path = Database;
                                536EFBF7295CF58100F4CB13 /* FileProviderSocketLineProcessor.swift in Sources */,
                                53ED472029C5E64200795DB1 /* FileProviderEnumerator+SyncEngine.swift in Sources */,
                                5318AD9929BF58D000CBB71C /* NKError+Extensions.swift in Sources */,
+                               53ED472829C88E7000795DB1 /* NextcloudItemMetadataTable+NKFile.swift in Sources */,
                                5318AD9529BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift in Sources */,
                                535AE30E29C0A2CC0042A9BA /* Logger+Extensions.swift in Sources */,
                                5307A6F229675346001E0C6A /* NextcloudFilesDatabaseManager.swift in Sources */,