marinofaggiana 3 éve
szülő
commit
5745747cfd

+ 8 - 0
Nextcloud.xcodeproj/project.pbxproj

@@ -274,6 +274,9 @@
 		F7B3A9A92618658200D76AD9 /* NCContentPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F765608E23BF813500765969 /* NCContentPresenter.swift */; };
 		F7B7504B2397D38F004E13EC /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B7504A2397D38E004E13EC /* UIImage+Extensions.swift */; };
 		F7B8B83025681C3400967775 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F7B8B82F25681C3400967775 /* GoogleService-Info.plist */; };
+		F7B8CD91261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B8CD90261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift */; };
+		F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B8CD90261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift */; };
+		F7B8CD9B261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B8CD90261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift */; };
 		F7BAADC81ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB41ED5A87C00B7EAD4 /* NCDatabase.swift */; };
 		F7BAADC91ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB41ED5A87C00B7EAD4 /* NCDatabase.swift */; };
 		F7BAADCB1ED5A87C00B7EAD4 /* NCManageDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */; };
@@ -639,6 +642,7 @@
 		F7B1A7761EBB3C8000BFB6D1 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7B7504A2397D38E004E13EC /* UIImage+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extensions.swift"; sourceTree = "<group>"; };
 		F7B8B82F25681C3400967775 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; };
+		F7B8CD90261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCNetworkingChunkedUpload.swift; sourceTree = "<group>"; };
 		F7BAADB41ED5A87C00B7EAD4 /* NCDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCDatabase.swift; sourceTree = "<group>"; };
 		F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCManageDatabase.swift; sourceTree = "<group>"; };
 		F7BB04851FD58ACB00BBFD2A /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/Localizable.strings"; sourceTree = "<group>"; };
@@ -1002,6 +1006,7 @@
 			children = (
 				F72CD63925C19EBF00F46F9A /* NCAutoUpload.swift */,
 				F75A9EE523796C6F0044CFCE /* NCNetworking.swift */,
+				F7B8CD90261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift */,
 				F70D8D8024A4A9BF000A5756 /* NCNetworkingProcessUpload.swift */,
 				F7D96FCB246ED7E100536D73 /* NCNetworkingCheckRemoteUser.swift */,
 				F785EE9C246196DF00B3F945 /* NCNetworkingE2EE.swift */,
@@ -1972,6 +1977,7 @@
 				F765609023BF813600765969 /* NCContentPresenter.swift in Sources */,
 				F75A9EE723796C6F0044CFCE /* NCNetworking.swift in Sources */,
 				F7A76DC8256A71CD00119AB3 /* UIImage+Extensions.swift in Sources */,
+				F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F7BAADC91ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */,
 				F780710A1EDAB65800EAFFF6 /* NSNotificationCenter+MainThread.m in Sources */,
 				F78B9685234F785300F54315 /* NCSelectDestination.m in Sources */,
@@ -2000,6 +2006,7 @@
 				F70460542499095400BB98A7 /* NotificationCenter+MainThread.swift in Sources */,
 				F785EEA42461A4A600B3F945 /* NCUtility.swift in Sources */,
 				F771E3F320E239A600AFB62D /* FileProviderData.swift in Sources */,
+				F7B8CD9B261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F7A0D1372591FBC5008F8A13 /* String+Extensions.swift in Sources */,
 				F771E3D720E2392D00AFB62D /* FileProviderEnumerator.swift in Sources */,
 				F74AF3A6247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */,
@@ -2064,6 +2071,7 @@
 				F7BAADC81ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */,
 				F75C0C4823D1FAE300163CC8 /* NCRichWorkspaceCommon.swift in Sources */,
 				F78ACD4A21903F850088454D /* NCTrashListCell.swift in Sources */,
+				F7B8CD91261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F760329F252F0F8E0015A421 /* NCTransferCell.swift in Sources */,
 				F7682FE023C36B0500983A04 /* NCMainTabBar.swift in Sources */,
 				F7A0D1352591FBC5008F8A13 /* String+Extensions.swift in Sources */,

+ 1 - 1
iOSClient/Data/NCDatabase.swift

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

+ 4 - 4
iOSClient/Data/NCManageDatabase.swift

@@ -990,12 +990,12 @@ class NCManageDatabase: NSObject {
     //MARK: -
     //MARK: Table Chunk
     
-    func getFolderChunk(account: String, ocId: String) -> String {
+    func getChunkFolder(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 result.chunkFolder
         }
         
         return NSUUID().uuidString
@@ -1014,7 +1014,7 @@ class NCManageDatabase: NSObject {
         return filesNames
     }
     
-    func addChunks(account: String, ocId: String, folderChunk: String, fileNames: [String]) {
+    func addChunks(account: String, ocId: String, chunkFolder: String, fileNames: [String]) {
         
         let realm = try! Realm()
         
@@ -1026,7 +1026,7 @@ class NCManageDatabase: NSObject {
                     let object = tableChunk()
                     
                     object.account = account
-                    object.folderChunk = folderChunk
+                    object.chunkFolder = chunkFolder
                     object.index = ocId + fileName
                     object.fileName = fileName
                     object.ocId = ocId

+ 1 - 1
iOSClient/NCGlobal.swift

@@ -59,7 +59,7 @@ class NCGlobal: NSObject {
 
     // Database Realm
     let databaseDefault                             = "nextcloud.realm"
-    let databaseSchemaVersion: UInt64               = 170
+    let databaseSchemaVersion: UInt64               = 171
     
     // Intro selector
     @objc let introLogin: Int                       = 0

+ 0 - 160
iOSClient/Networking/NCNetworking.swift

@@ -447,166 +447,6 @@ import Queuer
         }
     }
     
-    private func uploadChunkFile(metadata: tableMetadata, account: tableAccount, completion: @escaping (_ errorCode: Int, _ errorDescription: String)->()) {
-        
-        let serverUrl = metadata.serverUrl
-        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)!
-        var uploadErrorCode: Int = 0
-        var uploadErrorDescription: String = ""
-        var counterFileNameInUpload: Int = 0
-        let chunkSize = CCUtility.getChunkSize()
-        var filesNames = NCManageDatabase.shared.getChunks(account: metadata.account, ocId: metadata.ocId)
-        
-        if filesNames.count == 0 {
-            
-            if let chunkedFilesNames = NCCommunicationCommon.shared.fileChunks(path: directoryProviderStorageOcId, fileName: metadata.fileName, pathChunks: directoryProviderStorageOcId, sizeInMB: chunkSize) {
-                filesNames = chunkedFilesNames
-                NCManageDatabase.shared.addChunks(account: metadata.account, ocId: metadata.ocId, folderChunk: folderChunk, fileNames: filesNames)
-                
-            } else {
-                
-                NCContentPresenter.shared.messageNotification("_error_", description: "_err_file_not_found_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode:NCGlobal.shared.errorReadFile, forced: true)
-                
-                NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
-                return
-            }
-        }
-        
-        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
-        
-            if errorCode == 0 || errorCode == NCGlobal.shared.errordMethodNotSupported { // errordMethodNotSupported = already exists
-                    
-                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadStartFile, userInfo: ["ocId": metadata.ocId])
-                
-                DispatchQueue.global(qos: .background).async {                   
-                        
-                    for fileName in filesNames {
-                                                
-                        let serverUrlFileName = uploadFolder + "/" + fileName
-                        let fileNameChunkLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: fileName)!
-                        let semaphore = Semaphore()
-                                                    
-                        NCCommunication.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameChunkLocalPath, requestHandler: { (request) in
-                                
-                            self.uploadRequest[fileNameLocalPath] = request
-                            
-                            counterFileNameInUpload += 1
-
-                            let progress: Float = Float(counterFileNameInUpload) / Float(filesNames.count)
-                            let totalBytes: Int64 = (metadata.size / Int64(filesNames.count)) * Int64(counterFileNameInUpload)
-                            let totalBytesExpected: Int64 = metadata.size
-
-                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterProgressTask, userInfo: ["account":metadata.account, "ocId":metadata.ocId, "serverUrl":metadata.serverUrl, "status":NSNumber(value: NCGlobal.shared.metadataStatusInUpload), "progress":NSNumber(value: progress), "totalBytes":NSNumber(value: totalBytes), "totalBytesExpected":NSNumber(value: totalBytesExpected)])
-                            
-                        }, taskHandler: { (task) in
-                            
-                            NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, sessionError: "", sessionTaskIdentifier: task.taskIdentifier, status: NCGlobal.shared.metadataStatusUploading)
-                           
-                        }, progressHandler: { (_) in
-                            
-                        }) { (_, _, _, _, _, _, _, errorCode, errorDescription) in
-                               
-                            self.uploadRequest[fileNameLocalPath] = nil
-                            uploadErrorCode = errorCode
-                            uploadErrorDescription = errorDescription
-                            semaphore.continue()
-                        }
-                            
-                        semaphore.wait()
-                            
-                        if uploadErrorCode == 0 {
-                            NCManageDatabase.shared.deleteChunk(account: metadata.account, ocId: metadata.ocId, fileName: fileName)
-                        } else {
-                            break
-                        }
-                    }
-                        
-                    if uploadErrorCode == 0 {
-                            
-                        // Assembling the chunks
-                            
-                        let serverUrlFileNameSource = uploadFolder + "/.file"
-                        let pathServerUrl = CCUtility.returnPathfromServerUrl(serverUrl, urlBase: metadata.urlBase, account: metadata.account)!
-                        let serverUrlFileNameDestination = metadata.urlBase + "/" + NCUtilityFileSystem.shared.getDAV() + "/files/" + account.userId + pathServerUrl + "/" + metadata.fileName
-                        
-                        var addCustomHeaders: [String:String] = [:]
-                        let creationDate = "\(metadata.creationDate.timeIntervalSince1970)"
-                        let modificationDate = "\(metadata.date.timeIntervalSince1970)"
-                            
-                        addCustomHeaders["X-OC-CTime"] = creationDate
-                        addCustomHeaders["X-OC-MTime"] = modificationDate
-
-                        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))
-                                NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId)
-                                NCUtilityFileSystem.shared.deleteFile(filePath: directoryProviderStorageOcId)
-                                
-                                self.readFile(serverUrlFileName: serverUrlFileNameDestination, account: metadata.account) { (_, metadata, _, _) in
-                                        
-                                    if errorCode == 0, let metadata = metadata {
-                                        
-                                        NCManageDatabase.shared.addMetadata(metadata)
-                                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl":serverUrl])
-                                        
-                                    } else {
-                                        
-                                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSourceNetworkForced, userInfo: ["serverUrl": serverUrl])
-                                    }
-                                }
-                                
-                            } else {
-                                
-                                self.uploadChunkFileError(metadata: metadata, uploadFolder: uploadFolder, errorCode: errorCode, errorDescription: errorDescription)
-                            }
-                        }
-                                                        
-                    } else {
-                            
-                        NCCommunication.shared.deleteFileOrFolder(uploadFolder) { (_, _, _) in
-                                
-                            self.uploadChunkFileError(metadata: metadata, uploadFolder: uploadFolder, errorCode: uploadErrorCode, errorDescription: uploadErrorDescription)
-                        }
-                    }
-                }
-                
-            } else {
-                
-                self.uploadChunkFileError(metadata: metadata, uploadFolder: uploadFolder, errorCode: errorCode, errorDescription: errorDescription)
-            }
-        }
-    }
-    
-    private func uploadChunkFileError(metadata: tableMetadata, uploadFolder: String, errorCode: Int, errorDescription: String) {
-        
-        if errorCode == NSURLErrorCancelled || errorCode == NCGlobal.shared.errorRequestExplicityCancelled {
-            
-            let directoryProviderStorageOcId = CCUtility.getDirectoryProviderStorageOcId(metadata.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: 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":metadata.serverUrl])
-    }
-    
     private func uploadFileInBackground(metadata: tableMetadata, account: tableAccount, completion: @escaping (_ errorCode: Int, _ errorDescription: String)->()) {
         
         var session: URLSession?

+ 190 - 0
iOSClient/Networking/NCNetworkingChunkedUpload.swift

@@ -0,0 +1,190 @@
+//
+//  NCNetworkingUploadChunk.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 05/04/21.
+//  Copyright © 2021 Marino Faggiana. All rights reserved.
+//
+
+import Foundation
+import NCCommunication
+import Queuer
+
+extension NCNetworking {
+    
+    func uploadChunkFile(metadata: tableMetadata, account: tableAccount, completion: @escaping (_ errorCode: Int, _ errorDescription: String)->()) {
+        
+        let serverUrl = metadata.serverUrl
+        let directoryProviderStorageOcId = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId)!
+        let chunkFolder = NCManageDatabase.shared.getChunkFolder(account: metadata.account, ocId: metadata.ocId)
+        let chunkFolderPath = metadata.urlBase + "/" + NCUtilityFileSystem.shared.getDAV() + "/uploads/" + account.userId + "/" + chunkFolder
+        let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
+        var uploadErrorCode: Int = 0
+        var uploadErrorDescription: String = ""
+        var counterFileNameInUpload: Int = 0
+        let chunkSize = CCUtility.getChunkSize()
+        var filesNames = NCManageDatabase.shared.getChunks(account: metadata.account, ocId: metadata.ocId)
+        
+        if filesNames.count == 0 {
+            
+            if let chunkedFilesNames = NCCommunicationCommon.shared.fileChunks(path: directoryProviderStorageOcId, fileName: metadata.fileName, pathChunks: directoryProviderStorageOcId, sizeInMB: chunkSize) {
+                filesNames = chunkedFilesNames
+                NCManageDatabase.shared.addChunks(account: metadata.account, ocId: metadata.ocId, chunkFolder: chunkFolder, fileNames: filesNames)
+                
+            } else {
+                
+                NCContentPresenter.shared.messageNotification("_error_", description: "_err_file_not_found_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode:NCGlobal.shared.errorReadFile, forced: true)
+                
+                NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+                return
+            }
+        }
+        
+        NCContentPresenter.shared.messageNotification("_info_", description: "_upload_chunk_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.info, errorCode:0, forced: false)
+        
+        createChunkFolder(chunkFolderPath: chunkFolderPath, account: metadata.account) { (errorCode, errorDescription) in
+            
+            if errorCode == 0 || errorCode == NCGlobal.shared.errordMethodNotSupported { // errordMethodNotSupported = already exists
+                    
+                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadStartFile, userInfo: ["ocId": metadata.ocId])
+                
+                DispatchQueue.global(qos: .background).async {
+                        
+                    for fileName in filesNames {
+                                                
+                        let serverUrlFileName = chunkFolderPath + "/" + fileName
+                        let fileNameChunkLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: fileName)!
+                        let semaphore = Semaphore()
+                                                    
+                        NCCommunication.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameChunkLocalPath, requestHandler: { (request) in
+                                
+                            self.uploadRequest[fileNameLocalPath] = request
+                            
+                            counterFileNameInUpload += 1
+
+                            let progress: Float = Float(counterFileNameInUpload) / Float(filesNames.count)
+                            let totalBytes: Int64 = (metadata.size / Int64(filesNames.count)) * Int64(counterFileNameInUpload)
+                            let totalBytesExpected: Int64 = metadata.size
+
+                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterProgressTask, userInfo: ["account":metadata.account, "ocId":metadata.ocId, "serverUrl":metadata.serverUrl, "status":NSNumber(value: NCGlobal.shared.metadataStatusInUpload), "progress":NSNumber(value: progress), "totalBytes":NSNumber(value: totalBytes), "totalBytesExpected":NSNumber(value: totalBytesExpected)])
+                            
+                        }, taskHandler: { (task) in
+                            
+                            NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, sessionError: "", sessionTaskIdentifier: task.taskIdentifier, status: NCGlobal.shared.metadataStatusUploading)
+                           
+                        }, progressHandler: { (_) in
+                            
+                        }) { (_, _, _, _, _, _, _, errorCode, errorDescription) in
+                               
+                            self.uploadRequest[fileNameLocalPath] = nil
+                            uploadErrorCode = errorCode
+                            uploadErrorDescription = errorDescription
+                            semaphore.continue()
+                        }
+                            
+                        semaphore.wait()
+                            
+                        if uploadErrorCode == 0 {
+                            NCManageDatabase.shared.deleteChunk(account: metadata.account, ocId: metadata.ocId, fileName: fileName)
+                        } else {
+                            break
+                        }
+                    }
+                        
+                    if uploadErrorCode == 0 {
+                            
+                        // Assembling the chunks
+                            
+                        let serverUrlFileNameSource = chunkFolderPath + "/.file"
+                        let pathServerUrl = CCUtility.returnPathfromServerUrl(serverUrl, urlBase: metadata.urlBase, account: metadata.account)!
+                        let serverUrlFileNameDestination = metadata.urlBase + "/" + NCUtilityFileSystem.shared.getDAV() + "/files/" + account.userId + pathServerUrl + "/" + metadata.fileName
+                        
+                        var addCustomHeaders: [String:String] = [:]
+                        let creationDate = "\(metadata.creationDate.timeIntervalSince1970)"
+                        let modificationDate = "\(metadata.date.timeIntervalSince1970)"
+                            
+                        addCustomHeaders["X-OC-CTime"] = creationDate
+                        addCustomHeaders["X-OC-MTime"] = modificationDate
+
+                        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))
+                                NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId)
+                                NCUtilityFileSystem.shared.deleteFile(filePath: directoryProviderStorageOcId)
+                                
+                                self.readFile(serverUrlFileName: serverUrlFileNameDestination, account: metadata.account) { (_, metadata, _, _) in
+                                        
+                                    if errorCode == 0, let metadata = metadata {
+                                        
+                                        NCManageDatabase.shared.addMetadata(metadata)
+                                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl":serverUrl])
+                                        
+                                    } else {
+                                        
+                                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSourceNetworkForced, userInfo: ["serverUrl": serverUrl])
+                                    }
+                                }
+                                
+                            } else {
+                                
+                                self.uploadChunkFileError(metadata: metadata, chunkFolderPath: chunkFolderPath, errorCode: errorCode, errorDescription: errorDescription)
+                            }
+                        }
+                                                        
+                    } else {
+                            
+                        NCCommunication.shared.deleteFileOrFolder(chunkFolderPath) { (_, _, _) in
+                                
+                            self.uploadChunkFileError(metadata: metadata, chunkFolderPath: chunkFolderPath, errorCode: uploadErrorCode, errorDescription: uploadErrorDescription)
+                        }
+                    }
+                }
+                
+            } else {
+                
+                self.uploadChunkFileError(metadata: metadata, chunkFolderPath: chunkFolderPath, errorCode: errorCode, errorDescription: errorDescription)
+            }
+        }
+    }
+    
+    private func createChunkFolder(chunkFolderPath: String, account: String, completion: @escaping (_ errorCode: Int, _ errorDescription: String)->()) {
+        
+        NCCommunication.shared.readFileOrFolder(serverUrlFileName: chunkFolderPath, depth: "0", showHiddenFiles: CCUtility.getShowHiddenFiles()) { (_, _, _, errorCode, errorDescription) in
+        
+            if errorCode == 0 {
+                completion(0, "")
+            } else if errorCode == NCGlobal.shared.errorResourceNotFound {
+                NCCommunication.shared.createFolder(chunkFolderPath) { (_, _, _, errorCode, errorDescription) in
+                    completion(errorCode, errorDescription)
+                }
+            } else {
+                completion(errorCode, errorDescription)
+            }
+        }
+    }
+
+    private func uploadChunkFileError(metadata: tableMetadata, chunkFolderPath: String, errorCode: Int, errorDescription: String) {
+        
+        if errorCode == NSURLErrorCancelled || errorCode == NCGlobal.shared.errorRequestExplicityCancelled {
+            
+            let directoryProviderStorageOcId = CCUtility.getDirectoryProviderStorageOcId(metadata.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(chunkFolderPath) { (_, _, _) in }
+            
+        } else {
+                        
+            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":metadata.serverUrl])
+    }
+}