Marino Faggiana 1 年間 前
コミット
0a12253781

+ 0 - 10
Nextcloud.xcodeproj/project.pbxproj

@@ -505,7 +505,6 @@
 		F793E59E28B763C2005E4B02 /* NCAskAuthorization.swift in Sources */ = {isa = PBXBuildFile; fileRef = F733598025C1C188002ABA72 /* NCAskAuthorization.swift */; };
 		F793E59F28B764F6005E4B02 /* NCContentPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F765608E23BF813500765969 /* NCContentPresenter.swift */; };
 		F793E5A128B76541005E4B02 /* NotificationCenter+MainThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70460512499061800BB98A7 /* NotificationCenter+MainThread.swift */; };
-		F793E5A228B76580005E4B02 /* NCNetworkingChunkedUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B8CD90261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift */; };
 		F798F0E225880608000DAFFD /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70CEF5523E9C7E50007035B /* UIColor+Extension.swift */; };
 		F798F0E725880609000DAFFD /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70CEF5523E9C7E50007035B /* UIColor+Extension.swift */; };
 		F798F0EC2588060A000DAFFD /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70CEF5523E9C7E50007035B /* UIColor+Extension.swift */; };
@@ -563,9 +562,6 @@
 		F7B6B70427C4E7FA00A7F6EB /* NCScan+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B6B70327C4E7FA00A7F6EB /* NCScan+CollectionView.swift */; };
 		F7B7504B2397D38F004E13EC /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B7504A2397D38E004E13EC /* UIImage+Extension.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 */; };
@@ -1213,7 +1209,6 @@
 		F7B6B70327C4E7FA00A7F6EB /* NCScan+CollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCScan+CollectionView.swift"; sourceTree = "<group>"; };
 		F7B7504A2397D38E004E13EC /* UIImage+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.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>"; };
@@ -1853,7 +1848,6 @@
 				F72CD63925C19EBF00F46F9A /* NCAutoUpload.swift */,
 				F75A9EE523796C6F0044CFCE /* NCNetworking.swift */,
 				F7D96FCB246ED7E100536D73 /* NCNetworkingCheckRemoteUser.swift */,
-				F7B8CD90261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift */,
 				F70D8D8024A4A9BF000A5756 /* NCNetworkingProcessUpload.swift */,
 				F72A47EB2487B06B005AD489 /* NCOperationQueue.swift */,
 				F755BD9A20594AC7008C5FBB /* NCService.swift */,
@@ -3448,7 +3442,6 @@
 				F72FD3B8297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */,
 				F7EDE4E0262D7BAF00414FE6 /* NCGridCell.swift in Sources */,
 				F7A76DC8256A71CD00119AB3 /* UIImage+Extension.swift in Sources */,
-				F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F763D2A02A249C4500A3C901 /* NCManageDatabase+Capabilities.swift in Sources */,
 				F757CC8529E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
 				F7BAADC91ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */,
@@ -3512,7 +3505,6 @@
 				F78302FB28B4C3EE00B84583 /* NCManageDatabase+Video.swift in Sources */,
 				F72EA95228B7BA2A00C88F0C /* DashboardWidgetProvider.swift in Sources */,
 				F343A4BC2A1E734600DDA874 /* Optional+Extension.swift in Sources */,
-				F793E5A228B76580005E4B02 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F783031228B4C8EC00B84583 /* CCUtility.m in Sources */,
 				F72EA95828B7BC4F00C88F0C /* FilesData.swift in Sources */,
 				F793E59E28B763C2005E4B02 /* NCAskAuthorization.swift in Sources */,
@@ -3561,7 +3553,6 @@
 				F749B64E297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				AF817EF3274BC781009ED85B /* NCUserBaseUrl.swift in Sources */,
 				F771E3F320E239A600AFB62D /* FileProviderData.swift in Sources */,
-				F7B8CD9B261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F7A0D1372591FBC5008F8A13 /* String+Extension.swift in Sources */,
 				F771E3D720E2392D00AFB62D /* FileProviderEnumerator.swift in Sources */,
 				F74AF3A6247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */,
@@ -3646,7 +3637,6 @@
 				F7BAADC81ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */,
 				F75C0C4823D1FAE300163CC8 /* NCRichWorkspaceCommon.swift in Sources */,
 				F78ACD4A21903F850088454D /* NCTrashListCell+NCTrashCellProtocol.swift in Sources */,
-				F7B8CD91261AF3F7007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
 				F757CC8D29E82D0500F31428 /* NCGroupfolders.swift in Sources */,
 				F760329F252F0F8E0015A421 /* NCTransferCell.swift in Sources */,
 				F3BB46542A3A1E9D00461F6E /* CCCellMore.swift in Sources */,

+ 12 - 45
iOSClient/Data/NCManageDatabase.swift

@@ -274,45 +274,39 @@ class NCManageDatabase: NSObject {
         return NSUUID().uuidString
     }
 
-    func getChunks(account: String, ocId: String) -> [String] {
+    func getChunks(account: String, ocId: String) -> Array<(fileName: String, size: Int64)> {
 
-        var filesNames: [String] = []
+        var filesChunk: Array<(fileName: String, size: Int64)> = []
 
         do {
             let realm = try Realm()
             realm.refresh()
-            let results = realm.objects(tableChunk.self).filter("account == %@ AND ocId == %@", account, ocId).sorted(byKeyPath: "fileName", ascending: true)
+            let results =  realm.objects(tableChunk.self).filter("account == %@ AND ocId == %@", account, ocId).sorted(byKeyPath: "fileName", ascending: true)
             for result in results {
-                filesNames.append(result.fileName)
+                filesChunk.append((fileName: result.fileName, size: result.size))
             }
-            return filesNames
         } catch let error as NSError {
             NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")
         }
 
-        return filesNames
+        return filesChunk
     }
 
-    func addChunks(account: String, ocId: String, chunkFolder: String, fileNames: [String]) {
-
-        var size: Int64 = 0
+    func addChunks(account: String, ocId: String, chunkFolder: String, filesChunk: Array<(fileName: String, size: Int64)>) {
 
         do {
             let realm = try Realm()
             try realm.write {
-
-                for fileName in fileNames {
-
+                let results = realm.objects(tableChunk.self).filter(NSPredicate(format: "account == %@ AND ocId == %@", account, ocId))
+                realm.delete(results)
+                for fileChunk in filesChunk {
                     let object = tableChunk()
-                    size += NCUtilityFileSystem.shared.getFileSize(filePath: CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)!)
-
                     object.account = account
                     object.chunkFolder = chunkFolder
-                    object.fileName = fileName
-                    object.index = ocId + fileName
+                    object.fileName = fileChunk.fileName
+                    object.index = ocId + fileChunk.fileName
                     object.ocId = ocId
-                    object.size = size
-
+                    object.size = fileChunk.size
                     realm.add(object, update: .all)
                 }
             }
@@ -321,33 +315,6 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    func getChunk(account: String, fileName: String) -> tableChunk? {
-
-        do {
-            let realm = try Realm()
-            realm.refresh()
-            guard let result = realm.objects(tableChunk.self).filter("account == %@ AND fileName == %@", account, fileName).first else { return nil }
-            return tableChunk.init(value: result)
-        } catch let error as NSError {
-            NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")
-        }
-
-        return nil
-    }
-
-    func deleteChunk(account: String, ocId: String, fileName: String) {
-
-        do {
-            let realm = try Realm()
-            try realm.write {
-                let result = realm.objects(tableChunk.self).filter(NSPredicate(format: "account == %@ AND ocId == %@ AND fileName == %@", account, ocId, fileName))
-                realm.delete(result)
-            }
-        } catch let error {
-            NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")
-        }
-    }
-
     func deleteChunks(account: String, ocId: String) {
 
         do {

+ 62 - 1
iOSClient/Networking/NCNetworking.swift

@@ -418,7 +418,7 @@ class NCNetworking: NSObject, NKCommonDelegate {
             }
 #endif
         } else if metadata.chunk {
-            uploadChunkedFile(metadata: metadata, start: start, progressHandler: progressHandler) { error in
+            uploadChunkFile(metadata: metadata, start: start, progressHandler: progressHandler) { error in
                 completion(error)
             }
         } else if metadata.session == NextcloudKit.shared.nkCommonInstance.sessionIdentifierUpload {
@@ -479,6 +479,65 @@ class NCNetworking: NSObject, NKCommonDelegate {
         }
     }
 
+    private func uploadChunkFile(metadata: tableMetadata,
+                                 start: @escaping () -> () = { },
+                                 progressHandler: @escaping (_ totalBytesExpected: Int64, _ totalBytes: Int64, _ fractionCompleted: Double) -> () = { _, _, _ in },
+                                 completion: @escaping (_ error: NKError) -> Void) {
+
+
+        let directory = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId)!
+        let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
+        let chunkFolderServer = NCManageDatabase.shared.getChunkFolder(account: metadata.account, ocId: metadata.ocId)
+        let filesChunk = NCManageDatabase.shared.getChunks(account: metadata.account, ocId: metadata.ocId)
+
+        NextcloudKit.shared.uploadChunk(directory: directory,
+                                        fileName: metadata.fileName,
+                                        date: metadata.date as Date,
+                                        creationDate: metadata.creationDate as Date,
+                                        serverUrl: metadata.serverUrl,
+                                        chunkFolderServer: chunkFolderServer,
+                                        filesChunk: filesChunk,
+                                        chunkSizeInMB: 10) {
+
+            start()
+
+        } requestHandler: { request in
+
+            self.uploadRequest[fileNameLocalPath] = request
+
+        } taskHandler: { task in
+
+            NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, sessionError: "", sessionTaskIdentifier: task.taskIdentifier, status: NCGlobal.shared.metadataStatusUploading)
+
+        } progressHandler: { totalBytesExpected, totalBytes, fractionCompleted in
+
+            NotificationCenter.default.postOnMainThread(
+                name: NCGlobal.shared.notificationCenterProgressTask,
+                object: nil,
+                userInfo: [
+                    "account": metadata.account,
+                    "ocId": metadata.ocId,
+                    "fileName": metadata.fileName,
+                    "serverUrl": metadata.serverUrl,
+                    "status": NSNumber(value: NCGlobal.shared.metadataStatusInUpload),
+                    "chunk": metadata.chunk,
+                    "e2eEncrypted": metadata.e2eEncrypted,
+                    "progress": NSNumber(value: fractionCompleted),
+                    "totalBytes": NSNumber(value: totalBytes),
+                    "totalBytesExpected": NSNumber(value: totalBytesExpected)])
+
+            progressHandler(totalBytesExpected, totalBytes, fractionCompleted)
+
+        } completion: { account, filesChunk, file, error in
+
+            self.uploadRequest.removeValue(forKey: fileNameLocalPath)
+            
+            if error == .success {
+                NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId)
+            }
+        }
+    }
+
     private func uploadFileInBackground(metadata: tableMetadata,
                                         start: @escaping () -> () = { },
                                         completion: @escaping (_ error: NKError) -> Void) {
@@ -663,6 +722,8 @@ class NCNetworking: NSObject, NKCommonDelegate {
         })
     }
 
+
+
     // MARK: - Transfer (Download Upload)
 
     @objc func cancelTransferMetadata(_ metadata: tableMetadata, completion: @escaping () -> Void) {

+ 0 - 287
iOSClient/Networking/NCNetworkingChunkedUpload.swift

@@ -1,287 +0,0 @@
-//
-//  NCNetworkingUploadChunk.swift
-//  Nextcloud
-//
-//  Created by Marino Faggiana on 05/04/21.
-//  Copyright © 2021 Marino Faggiana. All rights reserved.
-//
-//  Author Marino Faggiana <marino.faggiana@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 3 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.
-//
-//  You should have received a copy of the GNU General Public License
-//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-//
-
-import UIKit
-import NextcloudKit
-
-extension NCNetworking {
-
-    internal func uploadChunkedFile(metadata: tableMetadata,
-                                    start: @escaping () -> () = { },
-                                    progressHandler: @escaping (_ totalBytesExpected: Int64, _ totalBytes: Int64, _ fractionCompleted: Double) -> () = { _, _, _ in },
-                                    completion: @escaping (_ error: NKError) -> Void) {
-
-        let directoryProviderStorageOcId = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId)!
-        let chunkFolder = NCManageDatabase.shared.getChunkFolder(account: metadata.account, ocId: metadata.ocId)
-        let chunkFolderPath = metadata.urlBase + "/" + NextcloudKit.shared.nkCommonInstance.dav + "/uploads/" + metadata.userId + "/" + chunkFolder
-        let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
-        let chunkSize = CCUtility.getChunkSize()
-        let fileSizeInGB = Double(metadata.size) / 1e9
-        let ocIdTemp = metadata.ocId
-        let selector = metadata.sessionSelector
-        var uploadError = NKError()
-
-        var filesNames = NCManageDatabase.shared.getChunks(account: metadata.account, ocId: metadata.ocId)
-
-        if filesNames.count == 0 {
-            filesNames = NextcloudKit.shared.nkCommonInstance.chunkedFile(inputDirectory: directoryProviderStorageOcId, outputDirectory: directoryProviderStorageOcId, fileName: metadata.fileName, chunkSizeMB: chunkSize)
-            if filesNames.count > 0 {
-                NCManageDatabase.shared.addChunks(account: metadata.account, ocId: metadata.ocId, chunkFolder: chunkFolder, fileNames: filesNames)
-            } else {
-                NCContentPresenter.shared.dismiss()
-                let error = NKError(errorCode: NCGlobal.shared.errorReadFile, errorDescription: "_err_file_not_found_")
-                NCContentPresenter.shared.showError(error: error)
-                NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
-                return completion(uploadError)
-            }
-        } else {
-            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl": metadata.serverUrl])
-        }
-
-        let pathServerUrl = CCUtility.returnPathfromServerUrl(metadata.serverUrl, urlBase: metadata.urlBase, userId: metadata.userId, account: metadata.account)!
-        let serverUrlFileNameDestination = metadata.urlBase + "/" + NextcloudKit.shared.nkCommonInstance.dav + "/files/" + metadata.userId + pathServerUrl + "/" + metadata.fileName
-
-        let destinationHeader: [String: String] = ["Destination" : serverUrlFileNameDestination]
-
-        // Create folder for chunks
-        createChunkedFolder(customHeaders: destinationHeader, chunkFolderPath: chunkFolderPath, account: metadata.account) { error in
-
-            NCContentPresenter.shared.dismiss(after: NCGlobal.shared.dismissAfterSecond)
-
-            guard error == .success else {
-                self.uploadChunkFileError(metadata: metadata, chunkFolderPath: chunkFolderPath, directoryProviderStorageOcId: directoryProviderStorageOcId, error: error)
-                completion(error)
-                return
-            }
-
-            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadStartFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "fileName": metadata.fileName, "sessionSelector": metadata.sessionSelector])
-
-            start()
-
-            // Upload the chunks
-            for fileName in filesNames {
-
-                let serverUrlFileName = chunkFolderPath + "/" + fileName
-                let fileSize = CCUtility.fileProviderStorageSize(metadata.ocId, fileNameView: fileName)
-                // ops! the upload has probably been cancelled
-                if fileSize == 0 {
-                    CCUtility.removeFile(atPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId))
-                    NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId)
-                    NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
-                    return completion(NKError())
-                }
-                let fileNameChunkLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: fileName)!
-
-                var size: Int64?
-                if let tableChunk = NCManageDatabase.shared.getChunk(account: metadata.account, fileName: fileName) {
-                    size = tableChunk.size - NCUtilityFileSystem.shared.getFileSize(filePath: fileNameChunkLocalPath)
-                }
-
-                let semaphore = DispatchSemaphore(value: 0)
-
-                NextcloudKit.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameChunkLocalPath, addCustomHeaders: destinationHeader, requestHandler: { request in
-
-                    self.uploadRequest[fileNameLocalPath] = request
-
-                }, taskHandler: { task in
-
-                    NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, sessionError: "", sessionTaskIdentifier: task.taskIdentifier, status: NCGlobal.shared.metadataStatusUploading)
-                    NextcloudKit.shared.nkCommonInstance.writeLog("[INFO] Upload chunk: " + fileName)
-
-                }, progressHandler: { progress in
-
-                    if let size = size {
-                        let totalBytesExpected = metadata.size
-                        let totalBytes = size
-                        let fractionCompleted = Double(totalBytes) / Double(totalBytesExpected)
-
-                        NotificationCenter.default.postOnMainThread(
-                            name: NCGlobal.shared.notificationCenterProgressTask,
-                            object: nil,
-                            userInfo: [
-                                "account": metadata.account,
-                                "ocId": metadata.ocId,
-                                "fileName": metadata.fileName,
-                                "serverUrl": metadata.serverUrl,
-                                "status": NSNumber(value: NCGlobal.shared.metadataStatusInUpload),
-                                "chunk": metadata.chunk,
-                                "e2eEncrypted": metadata.e2eEncrypted,
-                                "progress": NSNumber(value: fractionCompleted),
-                                "totalBytes": NSNumber(value: totalBytes),
-                                "totalBytesExpected": NSNumber(value: totalBytesExpected)])
-
-                        progressHandler(totalBytesExpected, totalBytes, fractionCompleted)
-                    }
-
-                }) { _, _, _, _, _, _, _, error in
-
-                    self.uploadRequest.removeValue(forKey: fileNameLocalPath)
-                    uploadError = error
-                    semaphore.signal()
-                }
-
-                semaphore.wait()
-
-                if uploadError == .success {
-                    NCManageDatabase.shared.deleteChunk(account: metadata.account, ocId: metadata.ocId, fileName: fileName)
-                } else {
-                    break
-                }
-            }
-
-            guard uploadError == .success else {
-                self.uploadChunkFileError(metadata: metadata, chunkFolderPath: chunkFolderPath, directoryProviderStorageOcId: directoryProviderStorageOcId, error: uploadError)
-                completion(error)
-                return
-            }
-
-            // Assemble the chunks
-            let serverUrlFileNameSource = chunkFolderPath + "/.file"
-
-            var customHeaders: [String: String] = [:]
-
-            if metadata.creationDate.timeIntervalSince1970 > 0 {
-                customHeaders["X-OC-CTime"] = "\(metadata.creationDate.timeIntervalSince1970)"
-            }
-
-            if metadata.date.timeIntervalSince1970 > 0 {
-                customHeaders["X-OC-MTime"] = "\(metadata.date.timeIntervalSince1970)"
-            }
-
-            destinationHeader.forEach { customHeaders[$0] = $1 }
-
-            // Calculate Assemble Timeout
-            let ASSEMBLE_TIME_PER_GB: Double    = 3 * 60            // 3  min
-            let ASSEMBLE_TIME_MIN: Double       = 60                // 60 sec
-            let ASSEMBLE_TIME_MAX: Double       = 30 * 60           // 30 min
-            let timeout = max(ASSEMBLE_TIME_MIN, min(ASSEMBLE_TIME_PER_GB * fileSizeInGB, ASSEMBLE_TIME_MAX))
-
-            let options = NKRequestOptions(customHeader: customHeaders, timeout: timeout, queue: DispatchQueue.global())
-            
-            NextcloudKit.shared.moveFileOrFolder(serverUrlFileNameSource: serverUrlFileNameSource, serverUrlFileNameDestination: serverUrlFileNameDestination, overwrite: true, options: options) { _, error in
-
-                NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Assembling chunk with error code: \(error.errorCode)")
-
-                guard error == .success else {
-                    self.uploadChunkFileError(metadata: metadata, chunkFolderPath: chunkFolderPath, directoryProviderStorageOcId: directoryProviderStorageOcId, error: error)
-                    completion(error)
-                    return
-                }
-
-                let serverUrl = metadata.serverUrl
-                let assetLocalIdentifier = metadata.assetLocalIdentifier
-                let isLivePhoto = metadata.livePhoto
-                let account = metadata.account
-                let fileName = metadata.fileName
-
-                NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", ocIdTemp))
-                NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: ocIdTemp)
-
-                self.readFile(serverUrlFileName: serverUrlFileNameDestination) { (_, metadata, _) in
-
-                    if error == .success, let metadata = metadata {
-
-                        metadata.assetLocalIdentifier = assetLocalIdentifier
-                        metadata.livePhoto = isLivePhoto
-
-                        // Delete Asset on Photos album
-                        if CCUtility.getRemovePhotoCameraRoll() && !metadata.assetLocalIdentifier.isEmpty {
-                            metadata.deleteAssetLocalIdentifier = true
-                        }
-                        NCManageDatabase.shared.addMetadata(metadata)
-
-                        if selector == NCGlobal.shared.selectorUploadFileNODelete {
-                            NCUtilityFileSystem.shared.moveFile(atPath: CCUtility.getDirectoryProviderStorageOcId(ocIdTemp, fileNameView: fileName), toPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: fileName))
-                            NCManageDatabase.shared.addLocalFile(metadata: metadata)
-                        }
-                        NCUtilityFileSystem.shared.deleteFile(filePath: directoryProviderStorageOcId)
-
-                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl": serverUrl])
-                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadedFile, userInfo: ["ocId": metadata.ocId, "serverUrl": serverUrl, "account": account, "fileName": fileName, "ocIdTemp": ocIdTemp, "error": error])
-
-                    } else {
-
-                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSourceNetworkForced)
-                        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadedFile, userInfo: ["ocId": ocIdTemp, "serverUrl": serverUrl, "account": account, "fileName": fileName, "ocIdTemp": ocIdTemp, "error": error])
-                    }
-
-                    completion(error)
-                }
-            }
-        }
-    }
-
-    private func createChunkedFolder(customHeaders: [String : String], chunkFolderPath: String, account: String, completion: @escaping (_ errorCode: NKError) -> Void) {
-
-        let options = NKRequestOptions(customHeader: customHeaders, queue: NextcloudKit.shared.nkCommonInstance.backgroundQueue)
-
-        NextcloudKit.shared.readFileOrFolder(serverUrlFileName: chunkFolderPath, depth: "0", showHiddenFiles: CCUtility.getShowHiddenFiles(), options: options) { _, _, _, error in
-
-            if error == .success {
-                completion(NKError())
-            } else if error.errorCode == NCGlobal.shared.errorResourceNotFound {
-                NextcloudKit.shared.createFolder(serverUrlFileName: chunkFolderPath, options: options) { _, _, _, error in
-                    completion(error)
-                }
-            } else {
-                completion(error)
-            }
-        }
-    }
-
-    private func uploadChunkFileError(metadata: tableMetadata, chunkFolderPath: String, directoryProviderStorageOcId: String, error: NKError) {
-
-        var errorDescription = error.errorDescription
-
-        NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Upload chunk error code: \(error.errorCode)")
-
-        if error.errorCode == NSURLErrorCancelled || error.errorCode == NCGlobal.shared.errorRequestExplicityCancelled {
-
-            // Delete chunk folder
-            NextcloudKit.shared.deleteFileOrFolder(serverUrlFileName: chunkFolderPath) { _, _ in }
-
-            NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
-            NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId)
-            NCUtilityFileSystem.shared.deleteFile(filePath: directoryProviderStorageOcId)
-
-            NextcloudKit.shared.deleteFileOrFolder(serverUrlFileName: chunkFolderPath) { _, _ in }
-
-            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadCancelFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account])
-
-        } else {
-
-            // NO report for the connection lost
-            if error.errorCode == NCGlobal.shared.errorConnectionLost {
-                errorDescription = ""
-            } else {
-                let description = errorDescription + " code: \(error.errorCode)"
-                let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: description)
-                NCContentPresenter.shared.showError(error: error)
-            }
-
-            NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, session: nil, sessionError: errorDescription, sessionTaskIdentifier: NCGlobal.shared.metadataStatusNormal, status: NCGlobal.shared.metadataStatusUploadError)
-        }
-
-        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadedFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "fileName": metadata.fileName, "ocIdTemp": metadata.ocId, "error": error])
-    }
-}