Просмотр исходного кода

Merge pull request #2199 from nextcloud/improved_code

improved code share
Marino Faggiana 2 лет назад
Родитель
Сommit
4b29302b54

+ 2 - 2
Nextcloud.xcodeproj/project.pbxproj

@@ -3607,7 +3607,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 18;
+				CURRENT_PROJECT_VERSION = 19;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -3670,7 +3670,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 18;
+				CURRENT_PROJECT_VERSION = 19;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;

+ 59 - 52
iOSClient/Data/NCManageDatabase.swift

@@ -1377,60 +1377,67 @@ class NCManageDatabase: NSObject {
     @objc func addShare(urlBase: String, account: String, shares: [NKShare]) {
 
         let realm = try! Realm()
-        realm.beginWrite()
-
-        for share in shares {
-
-            let addObject = tableShare()
-            let fullPath = NCUtilityFileSystem.shared.getHomeServer(account: account) + share.path
-            let serverUrl = NCUtilityFileSystem.shared.deletingLastPathComponent(account: account, serverUrl: fullPath)
-            let fileName = NSString(string: fullPath).lastPathComponent
-
-            addObject.account = account
-            addObject.fileName = fileName
-            addObject.serverUrl = serverUrl
-
-            addObject.canEdit = share.canEdit
-            addObject.canDelete = share.canDelete
-            addObject.date = share.date
-            addObject.displaynameFileOwner = share.displaynameFileOwner
-            addObject.displaynameOwner = share.displaynameOwner
-            addObject.expirationDate =  share.expirationDate
-            addObject.fileParent = share.fileParent
-            addObject.fileSource = share.fileSource
-            addObject.fileTarget = share.fileTarget
-            addObject.hideDownload = share.hideDownload
-            addObject.idShare = share.idShare
-            addObject.itemSource = share.itemSource
-            addObject.itemType = share.itemType
-            addObject.label = share.label
-            addObject.mailSend = share.mailSend
-            addObject.mimeType = share.mimeType
-            addObject.note = share.note
-            addObject.parent = share.parent
-            addObject.password = share.password
-            addObject.path = share.path
-            addObject.permissions = share.permissions
-            addObject.sendPasswordByTalk = share.sendPasswordByTalk
-            addObject.shareType = share.shareType
-            addObject.shareWith = share.shareWith
-            addObject.shareWithDisplayname = share.shareWithDisplayname
-            addObject.storage = share.storage
-            addObject.storageId = share.storageId
-            addObject.token = share.token
-            addObject.uidOwner = share.uidOwner
-            addObject.uidFileOwner = share.uidFileOwner
-            addObject.url = share.url
-            addObject.userClearAt = share.userClearAt
-            addObject.userIcon = share.userIcon
-            addObject.userMessage = share.userMessage
-            addObject.userStatus = share.userStatus
-
-            realm.add(addObject, update: .all)
-        }
+        let home = NCUtilityFileSystem.shared.getHomeServer(account: account)
 
         do {
-            try realm.commitWrite()
+            try realm.safeWrite {
+
+                let results = realm.objects(tableShare.self).filter("account == %@", account)
+                realm.delete(results)
+
+                for share in shares {
+
+                    let serverUrlPath = home + share.path
+                    guard let serverUrl = NCUtilityFileSystem.shared.deleteLastPath(serverUrlPath: serverUrlPath, home: home) else {
+                        continue
+                    }
+                    let fileName = NSString(string: serverUrlPath).lastPathComponent
+
+                    let object = tableShare()
+
+                    object.account = account
+                    object.fileName = fileName
+                    object.serverUrl = serverUrl
+
+                    object.canEdit = share.canEdit
+                    object.canDelete = share.canDelete
+                    object.date = share.date
+                    object.displaynameFileOwner = share.displaynameFileOwner
+                    object.displaynameOwner = share.displaynameOwner
+                    object.expirationDate =  share.expirationDate
+                    object.fileParent = share.fileParent
+                    object.fileSource = share.fileSource
+                    object.fileTarget = share.fileTarget
+                    object.hideDownload = share.hideDownload
+                    object.idShare = share.idShare
+                    object.itemSource = share.itemSource
+                    object.itemType = share.itemType
+                    object.label = share.label
+                    object.mailSend = share.mailSend
+                    object.mimeType = share.mimeType
+                    object.note = share.note
+                    object.parent = share.parent
+                    object.password = share.password
+                    object.path = share.path
+                    object.permissions = share.permissions
+                    object.sendPasswordByTalk = share.sendPasswordByTalk
+                    object.shareType = share.shareType
+                    object.shareWith = share.shareWith
+                    object.shareWithDisplayname = share.shareWithDisplayname
+                    object.storage = share.storage
+                    object.storageId = share.storageId
+                    object.token = share.token
+                    object.uidOwner = share.uidOwner
+                    object.uidFileOwner = share.uidFileOwner
+                    object.url = share.url
+                    object.userClearAt = share.userClearAt
+                    object.userIcon = share.userIcon
+                    object.userMessage = share.userMessage
+                    object.userStatus = share.userStatus
+
+                    realm.add(object)
+                }
+            }
         } catch let error {
             NKCommon.shared.writeLog("Could not write to database: \(error)")
         }

+ 2 - 1
iOSClient/Networking/NCService.swift

@@ -197,9 +197,10 @@ class NCService: NSObject {
             if isFilesSharingEnabled {
                 NextcloudKit.shared.readShares(parameters: NKShareParameter(), options: options) { account, shares, data, error in
                     if error == .success {
-                        NCManageDatabase.shared.deleteTableShare(account: account)
                         if let shares = shares, !shares.isEmpty {
                             NCManageDatabase.shared.addShare(urlBase: self.appDelegate.urlBase, account: account, shares: shares)
+                        } else {
+                            NCManageDatabase.shared.deleteTableShare(account: account)
                         }
                         self.appDelegate.shares = NCManageDatabase.shared.getTableShares(account: account)
                     }

+ 4 - 4
iOSClient/Shares/NCShares.swift

@@ -98,10 +98,10 @@ class NCShares: NCCollectionViewCommon {
             }
 
             if error == .success {
-
-                NCManageDatabase.shared.deleteTableShare(account: account)
-                if shares != nil {
-                    NCManageDatabase.shared.addShare(urlBase: self.appDelegate.urlBase, account: account, shares: shares!)
+                if let shares = shares, !shares.isEmpty {
+                    NCManageDatabase.shared.addShare(urlBase: self.appDelegate.urlBase, account: account, shares: shares)
+                } else {
+                    NCManageDatabase.shared.deleteTableShare(account: account)
                 }
                 self.appDelegate.shares = NCManageDatabase.shared.getTableShares(account: account)
                 self.reloadDataSource()

+ 20 - 0
iOSClient/Utility/NCUtilityFileSystem.swift

@@ -182,6 +182,26 @@ class NCUtilityFileSystem: NSObject {
         return serverUrl
     }
 
+    func deleteLastPath(serverUrlPath: String, home: String? = nil) -> String? {
+
+        var returnString: String?
+
+        if home == serverUrlPath {
+            return serverUrlPath
+        }
+        
+        if let serverUrlPath = serverUrlPath.urlEncoded, let url = URL(string: serverUrlPath) {
+            if let path = url.deletingLastPathComponent().absoluteString.removingPercentEncoding {
+                if path.last == "/" {
+                    returnString = String(path.dropLast())
+                } else {
+                    returnString = path
+                }
+            }
+        }
+        return returnString
+    }
+
     @objc func createFileName(_ fileName: String, serverUrl: String, account: String) -> String {
 
         var resultFileName = fileName