marinofaggiana 4 years ago
parent
commit
0fd2a3d698

+ 1 - 1
iOSClient/Data/NCDatabase.swift

@@ -172,7 +172,7 @@ class tableCapabilities: Object {
 class tableChunk: Object {
     
     @objc dynamic var account = ""
-    @objc dynamic var directory = ""
+    @objc dynamic var folderChunk = ""
     @objc dynamic var index = ""
     @objc dynamic var fileName = ""
     @objc dynamic var ocId = ""

+ 13 - 2
iOSClient/Data/NCManageDatabase.swift

@@ -990,6 +990,17 @@ class NCManageDatabase: NSObject {
     //MARK: -
     //MARK: Table Chunk
     
+    func getFolderChunk(account: String, ocId: String) -> String {
+        
+        let realm = try! Realm()
+
+        if let result = realm.objects(tableChunk.self).filter("account == %@ AND ocId == %@", account, ocId).first {
+            return result.folderChunk
+        }
+        
+        return NSUUID().uuidString
+    }
+    
     func existsChunks(account: String, ocId: String) -> Bool {
         
         let realm = try! Realm()
@@ -1012,7 +1023,7 @@ class NCManageDatabase: NSObject {
         return false
     }
     
-    func addChunks(account: String, ocId: String, directory: String, fileNames: [String]) {
+    func addChunks(account: String, ocId: String, folderChunk: String, fileNames: [String]) {
         
         let realm = try! Realm()
         
@@ -1024,7 +1035,7 @@ class NCManageDatabase: NSObject {
                     let object = tableChunk()
                     
                     object.account = account
-                    object.directory = directory
+                    object.folderChunk = folderChunk
                     object.index = ocId + fileName
                     object.fileName = fileName
                     object.ocId = ocId

+ 26 - 13
iOSClient/Networking/NCNetworking.swift

@@ -450,7 +450,7 @@ import Queuer
     private func uploadChunkFile(metadata: tableMetadata, account: tableAccount, completion: @escaping (_ errorCode: Int, _ errorDescription: String)->()) {
         
         let serverUrl = metadata.serverUrl
-        let folderChunk = NSUUID().uuidString
+        let folderChunk = NCManageDatabase.shared.getFolderChunk(account: metadata.account, ocId: metadata.ocId)
         let directoryProviderStorageOcId = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId)!
         let uploadFolder = metadata.urlBase + "/" + NCUtilityFileSystem.shared.getDAV() + "/uploads/" + account.userId + "/" + folderChunk
         let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
@@ -461,6 +461,10 @@ import Queuer
         
         if let filesNames = NCCommunicationCommon.shared.fileChunks(path: directoryProviderStorageOcId, fileName: metadata.fileName, pathChunks: directoryProviderStorageOcId, sizeInMB: chunkSize) {
         
+            if !NCManageDatabase.shared.existsChunks(account: metadata.account, ocId: metadata.ocId) {
+                NCManageDatabase.shared.addChunks(account: metadata.account, ocId: metadata.ocId, folderChunk: folderChunk, fileNames: filesNames)
+            }
+            
             NCContentPresenter.shared.messageNotification("_info_", description: "_upload_chunk_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.info, errorCode:0, forced: false)
             
             NCCommunication.shared.createFolder(uploadFolder) { (_, _, _, errorCode, errorDescription) in
@@ -472,7 +476,11 @@ import Queuer
                         NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadStartFile, userInfo: ["ocId": metadata.ocId])
                             
                         for fileName in filesNames {
-                                                        
+                                                    
+                            if !NCManageDatabase.shared.existsChunk(account: metadata.account, ocId: metadata.ocId, fileName: fileName) {
+                                continue
+                            }
+                            
                             let serverUrlFileName = uploadFolder + "/" + fileName
                             let fileNameChunkLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: fileName)!
                             let semaphore = Semaphore()
@@ -505,7 +513,11 @@ import Queuer
                                 
                             semaphore.wait()
                                 
-                            if uploadErrorCode != 0 { break }
+                            if uploadErrorCode == 0 {
+                                NCManageDatabase.shared.deleteChunk(account: metadata.account, ocId: metadata.ocId, fileName: fileName)
+                            } else {
+                                break
+                            }
                         }
                             
                         if uploadErrorCode == 0 {
@@ -522,13 +534,13 @@ import Queuer
                             addCustomHeaders["X-OC-CTime"] = creationDate
                             addCustomHeaders["X-OC-MTime"] = modificationDate
 
-                            NCCommunication.shared.moveFileOrFolder(serverUrlFileNameSource: serverUrlFileNameSource, serverUrlFileNameDestination: serverUrlFileNameDestination, overwrite: true, addCustomHeaders: addCustomHeaders) { (account, errorCode, errorDescription) in
+                            NCCommunication.shared.moveFileOrFolder(serverUrlFileNameSource: serverUrlFileNameSource, serverUrlFileNameDestination: serverUrlFileNameDestination, overwrite: true, addCustomHeaders: addCustomHeaders) { (_, errorCode, errorDescription) in
                                                         
                                 if errorCode == 0 {
                                     
                                     NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
                                     NCUtilityFileSystem.shared.deleteFile(filePath: directoryProviderStorageOcId)
-                                    self.readFile(serverUrlFileName: serverUrlFileNameDestination, account: account) { (_, metadata, _, _) in
+                                    self.readFile(serverUrlFileName: serverUrlFileNameDestination, account: metadata.account) { (_, metadata, _, _) in
                                             
                                         if errorCode == 0, let metadata = metadata {
                                             
@@ -543,7 +555,7 @@ import Queuer
                                     
                                 } else {
                                     
-                                    self.uploadChunkFileError(ocId: metadata.ocId, serverUrl: serverUrl, uploadFolder: uploadFolder, errorCode: errorCode, errorDescription: errorDescription)
+                                    self.uploadChunkFileError(metadata: metadata, uploadFolder: uploadFolder, errorCode: errorCode, errorDescription: errorDescription)
                                 }
                             }
                                                             
@@ -551,14 +563,14 @@ import Queuer
                                 
                             NCCommunication.shared.deleteFileOrFolder(uploadFolder) { (_, _, _) in
                                     
-                                self.uploadChunkFileError(ocId: metadata.ocId, serverUrl: serverUrl, uploadFolder: uploadFolder, errorCode: uploadErrorCode, errorDescription: uploadErrorDescription)
+                                self.uploadChunkFileError(metadata: metadata, uploadFolder: uploadFolder, errorCode: uploadErrorCode, errorDescription: uploadErrorDescription)
                             }
                         }
                     }
                     
                 } else {
                     
-                    self.uploadChunkFileError(ocId: metadata.ocId, serverUrl: serverUrl, uploadFolder: uploadFolder, errorCode: errorCode, errorDescription: errorDescription)
+                    self.uploadChunkFileError(metadata: metadata, uploadFolder: uploadFolder, errorCode: errorCode, errorDescription: errorDescription)
                 }
             }
             
@@ -568,26 +580,27 @@ import Queuer
         }
     }
     
-    private func uploadChunkFileError(ocId: String, serverUrl: String, uploadFolder: String,errorCode: Int, errorDescription: String) {
+    private func uploadChunkFileError(metadata: tableMetadata, uploadFolder: String, errorCode: Int, errorDescription: String) {
         
         if errorCode == NSURLErrorCancelled || errorCode == NCGlobal.shared.ErrorRequestExplicityCancelled {
             
-            let directoryProviderStorageOcId = CCUtility.getDirectoryProviderStorageOcId(ocId)!
+            let directoryProviderStorageOcId = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId)!
 
-            NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", ocId))
+            NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+            NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId)
             NCUtilityFileSystem.shared.deleteFile(filePath: directoryProviderStorageOcId)
             
             NCCommunication.shared.deleteFileOrFolder(uploadFolder) { (_, _, _) in }
             
         } else {
                         
-            NCManageDatabase.shared.setMetadataSession(ocId: ocId, session: nil, sessionError: errorDescription, sessionTaskIdentifier: 0, status: NCGlobal.shared.metadataStatusUploadError)
+            NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, session: nil, sessionError: errorDescription, sessionTaskIdentifier: 0, status: NCGlobal.shared.metadataStatusUploadError)
             
             let description = errorDescription + " code: \(errorCode)"
             NCContentPresenter.shared.messageNotification("_error_", description: description, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.ErrorInternalError, forced: true)
         }
         
-        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl":serverUrl])
+        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl":metadata.serverUrl])
     }
     
     private func uploadFileInBackground(metadata: tableMetadata, account: tableAccount, completion: @escaping (_ errorCode: Int, _ errorDescription: String)->()) {