marinofaggiana 4 years ago
parent
commit
460cef573b

+ 11 - 2
File Provider Extension/FileProviderExtension.swift

@@ -23,6 +23,7 @@
 
 import FileProvider
 import NCCommunication
+import Alamofire
 
 /* -----------------------------------------------------------------------------------------------------------------------------------------------
                                                             STRUCT item
@@ -202,6 +203,8 @@ class FileProviderExtension: NSFileProviderExtension {
         
         let pathComponents = url.pathComponents
         let identifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
+        var downloadRequest: DownloadRequest?
+        var task: URLSessionTask?
         
         if let _ = outstandingSessionTasks[url] {
             completionHandler(nil)
@@ -221,15 +224,21 @@ class FileProviderExtension: NSFileProviderExtension {
         let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
         let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileName)!
         
-        NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath,  taskHandler: { (task) in
+        NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath,  requestHandler: { (request) in
             
             metadata.status = Int(k_metadataStatusDownloading)
             if let result = NCManageDatabase.sharedInstance.addMetadata(metadata) { metadata = result }
+            downloadRequest = request
             self.outstandingSessionTasks[url] = task
-            NSFileProviderManager.default.register(task, forItemWithIdentifier: NSFileProviderItemIdentifier(identifier.rawValue)) { (error) in }
             
         }, progressHandler: { (progress) in
             
+            if task == nil && downloadRequest?.task != nil {
+                task = downloadRequest?.task
+                self.outstandingSessionTasks[url] = task
+                NSFileProviderManager.default.register(task!, forItemWithIdentifier: NSFileProviderItemIdentifier(identifier.rawValue)) { (error) in }
+            }
+            
         }) { (account, etag, date, length, errorCode, errorDescription) in
             
             self.outstandingSessionTasks.removeValue(forKey: url)

+ 1 - 3
Share/ShareViewController.m

@@ -271,9 +271,7 @@
         NSString *fileNameForUpload = [[NCUtility sharedInstance] createFileName:fileName serverUrl:self.serverUrl account:self.activeAccount];
         NSString *fileNameServer = [NSString stringWithFormat:@"%@/%@", self.serverUrl, fileNameForUpload];
         
-        [[NCCommunication shared] uploadWithServerUrlFileName:fileNameServer fileNameLocalPath:fileNameLocal dateCreationFile:nil dateModificationFile:nil customUserAgent:nil addCustomHeaders:nil taskHandler:^(NSURLSessionTask *task) {
-            
-        } progressHandler:^(NSProgress * progress) {
+        [[NCCommunication shared] uploadWithServerUrlFileName:fileNameServer fileNameLocalPath:fileNameLocal dateCreationFile:nil dateModificationFile:nil customUserAgent:nil addCustomHeaders:nil progressHandler:^(NSProgress * progress) {
             [self.hud progress:progress.fractionCompleted];
         } completionHandler:^(NSString *account, NSString *ocId, NSString *etag, NSDate *date, int64_t size, NSInteger errorCode, NSString *errorDescription) {
             [self.hud hideHud];

+ 2 - 2
iOSClient/Activity/NCActivity.swift

@@ -394,9 +394,9 @@ extension activityTableViewCell: UICollectionViewDelegate {
             
             NCUtility.sharedInstance.startActivityIndicator(view: (appDelegate.window.rootViewController?.view)!, bottom: 0)
             
-            NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, taskHandler: { (task) in
+            NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, requestHandler: { (_) in
                 
-            }, progressHandler: { (progress) in
+            }, progressHandler: { (_) in
                 
             }) { (account, etag, date, lenght, errorCode, errorDescription) in
                 

+ 0 - 11
iOSClient/AppDelegate.m

@@ -261,17 +261,6 @@
             
     [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:k_notificationCenter_applicationDidEnterBackground object:nil];
     [self passcodeWithAutomaticallyPromptForBiometricValidation:false];
-    
-    /*
-    __block UIBackgroundTaskIdentifier background_task;
-        
-    background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
-            
-        //Clean up code. Tell the system that we are done.
-        [application endBackgroundTask: background_task];
-        background_task = UIBackgroundTaskInvalid;
-    }];
-    */
 }
 
 //

+ 1 - 1
iOSClient/CCGlobal.h

@@ -321,7 +321,7 @@
 
 #define k_notificationCenter_uploadFileStart            @"uploadFileStart"                  // userInfo: ocId, task, serverUrl, account
 #define k_notificationCenter_uploadedFile               @"uploadedFile"                     // userInfo: metadata, errorCode, errorDescription
-#define k_notificationCenter_downloadFileStart          @"downloadFileStart"                // userInfo: ocId, task, serverUrl, account
+#define k_notificationCenter_downloadFileStart          @"downloadFileStart"                // userInfo: ocId, serverUrl, account
 #define k_notificationCenter_downloadedFile             @"downloadedFile"                   // userInfo: metadata, selector, errorCode, errorDescription
 #define k_notificationCenter_progressTask               @"progressTask"                     // userInfo: account, ocId, serverUrl, status, progress, totalBytes, totalBytesExpected
 #define k_notificationCenter_createFolder               @"createFolder"                     // userInfo: fileName, serverUrl, errorCode, errorDescription

+ 2 - 2
iOSClient/Main/Create cloud/NCCreateFormUploadDocuments.swift

@@ -495,9 +495,9 @@ import NCCommunication
         
         let fileNameLocalPath = CCUtility.getDirectoryUserData() + "/" + name + ".png"
 
-        NCCommunication.shared.download(serverUrlFileName: preview, fileNameLocalPath: fileNameLocalPath, taskHandler: { (task) in
+        NCCommunication.shared.download(serverUrlFileName: preview, fileNameLocalPath: fileNameLocalPath, requestHandler: { (_) in
             
-        }, progressHandler: { (progress) in
+        }, progressHandler: { (_) in
             
         }) { (account, etag, date, lenght, errorCode, errorDescription) in
             

+ 2 - 2
iOSClient/Main/NCDetailViewController.swift

@@ -692,7 +692,7 @@ extension NCDetailViewController: NCViewerImageViewControllerDelegate, NCViewerI
             
             metadata.status = Int(k_metadataStatusInDownload)
             
-            NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, taskHandler: { (task) in
+            NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, requestHandler: { (_) in
                 
                 metadata.status = Int(k_metadataStatusDownloading)
                 
@@ -807,7 +807,7 @@ extension NCDetailViewController: NCViewerImageViewControllerDelegate, NCViewerI
                 let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileNameView
                 let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
                                 
-                NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, taskHandler: { (task) in
+                NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, requestHandler: { (_) in
                     
                 }, progressHandler: { (progress) in
                                     

+ 4 - 20
iOSClient/Main/NCMainCommon.swift

@@ -102,7 +102,7 @@ class NCMainCommon: NSObject, NCAudioRecorderViewControllerDelegate, UIDocumentI
         let account = dic["account"] as? NSString ?? ""
         let ocId = dic["ocId"] as? NSString ?? ""
         let serverUrl = dic["serverUrl"] as? String ?? ""
-        let status = dic["status"] as? Int ?? Int(k_taskIdentifierDone)
+        let status = dic["status"] as? Int ?? Int(k_metadataStatusNormal)
         let progress = dic["progress"] as? CGFloat ?? 0
         let totalBytes = dic["totalBytes"] as? Double ?? 0
         let totalBytesExpected = dic["totalBytesExpected"] as? Double ?? 0
@@ -142,27 +142,11 @@ class NCMainCommon: NSObject, NCAudioRecorderViewControllerDelegate, UIDocumentI
     @objc func cancelTransferMetadata(_ metadata: tableMetadata, reloadDatasource: Bool, uploadStatusForcedStart: Bool) {
         
         if metadata.session.count == 0 { return }
-        let serverUrl = metadata.serverUrl
 
         if metadata.session == NCCommunicationCommon.shared.sessionIdentifierDownload {
-            
-            NCCommunication.shared.getDownloadTask(taskIdentifier: metadata.sessionTaskIdentifier) { (task) in
-                if task != nil {
-                    task?.cancel()
-                } else {
-                    if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) {
-                        
-                        metadata.session = ""
-                        metadata.sessionError = ""
-                        metadata.sessionTaskIdentifier = Int(k_taskIdentifierDone)
-                        metadata.status = Int(k_metadataStatusNormal)
-                        
-                        NCManageDatabase.sharedInstance.addMetadata(metadata)
-                    }
-                }
-                NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_clearDateReadDataSource), object: nil, userInfo: ["serverUrl":serverUrl])
-            }
-            
+            NCNetworking.shared.cancelDownload(metadata: metadata)
+        } else if metadata.session == NCCommunicationCommon.shared.sessionIdentifierUpload {
+            NCNetworking.shared.cancelUpload(metadata: metadata)
         } else {
         
             var actionReloadDatasource = k_action_NULL

+ 44 - 8
iOSClient/Networking/NCNetworking.swift

@@ -24,6 +24,7 @@
 import Foundation
 import OpenSSL
 import NCCommunication
+import Alamofire
 
 @objc public protocol NCNetworkingDelegate {
     @objc optional func downloadProgress(_ progress: Double, fileName: String, ServerUrl: String, session: URLSession, task: URLSessionTask)
@@ -38,10 +39,11 @@ import NCCommunication
         return instance
     }()
         
-    // Protocol
     var delegate: NCNetworkingDelegate?
     var lastReachability: Bool = true
-        
+    var downloadRequest = [String:DownloadRequest]()
+    var uploadRequest = [String:UploadRequest]()
+
     //MARK: - Communication Delegate
        
     func networkReachabilityObserver(_ typeReachability: NCCommunicationCommon.typeReachability) {
@@ -169,6 +171,27 @@ import NCCommunication
     
     //MARK: - Transfer
     
+    @objc func cancelDownload(metadata: tableMetadata) {
+        
+        guard let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileName) else { return }
+        let serverUlr = metadata.serverUrl
+        
+        if let request = downloadRequest[fileNameLocalPath] {
+            request.cancel()
+        } else {
+            if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) {
+                
+                metadata.session = ""
+                metadata.sessionError = ""
+                metadata.status = Int(k_metadataStatusNormal)
+                
+                NCManageDatabase.sharedInstance.addMetadata(metadata)
+            }
+        }
+        
+        NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_clearDateReadDataSource), object: nil, userInfo: ["serverUrl":serverUlr])
+    }
+    
     @objc func download(metadata: tableMetadata, selector: String, setFavorite: Bool = false) {
         
         var metadata = metadata
@@ -181,13 +204,13 @@ import NCCommunication
         metadata.session = NCCommunicationCommon.shared.sessionIdentifierDownload
         if let result = NCManageDatabase.sharedInstance.addMetadata(metadata) { metadata = result }
         
-        NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, taskHandler: { (task) in
+        NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, requestHandler: { (request) in
             
+            self.downloadRequest[fileNameLocalPath] = request
             metadata.status = Int(k_metadataStatusDownloading)
-            metadata.sessionTaskIdentifier = task.taskIdentifier
             if let result = NCManageDatabase.sharedInstance.addMetadata(metadata) { metadata = result }
             
-            NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_downloadFileStart), object: nil, userInfo: ["ocId":metadata.ocId, "task":task, "serverUrl":metadata.serverUrl, "account":metadata.account])
+            NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_downloadFileStart), object: nil, userInfo: ["ocId":metadata.ocId, "serverUrl":metadata.serverUrl, "account":metadata.account])
             
         }, progressHandler: { (progress) in
             
@@ -195,6 +218,7 @@ import NCCommunication
             
         }) { (account, etag, date, length, errorCode, errorDescription) in
             
+            self.downloadRequest[fileNameLocalPath] = nil
             var errorCode = errorCode
             var errorDescription = errorDescription ?? ""
             
@@ -206,7 +230,6 @@ import NCCommunication
                 
                 metadata.session = ""
                 metadata.sessionError = ""
-                metadata.sessionTaskIdentifier = Int(k_taskIdentifierDone)
                 metadata.status = Int(k_metadataStatusNormal)
 
                 #if !EXTENSION
@@ -224,7 +247,6 @@ import NCCommunication
                 
                 metadata.session = ""
                 metadata.sessionError = ""
-                metadata.sessionTaskIdentifier = Int(k_taskIdentifierDone)
                 metadata.status = Int(k_metadataStatusNormal)
 
                 NCManageDatabase.sharedInstance.addLocalFile(metadata: metadata)
@@ -233,7 +255,6 @@ import NCCommunication
                 
                 metadata.session = ""
                 metadata.sessionError = errorDescription
-                metadata.sessionTaskIdentifier = Int(k_taskIdentifierDone)
                 metadata.status = Int(k_metadataStatusDownloadError)
 
                 #if !EXTENSION
@@ -251,6 +272,21 @@ import NCCommunication
         }
     }
     
+    @objc func cancelUpload(metadata: tableMetadata) {
+        
+        guard let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileName) else { return }
+        let serverUlr = metadata.serverUrl
+        
+        if let request = uploadRequest[fileNameLocalPath] {
+            request.cancel()
+        } else {
+            CCUtility.removeFile(atPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId))
+            NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+        }
+
+        NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_clearDateReadDataSource), object: nil, userInfo: ["serverUrl":serverUlr])
+    }
+    
     @objc func upload(metadata: tableMetadata, e2eEncrypted: Bool) {
            
         var metadataForUpload: tableMetadata?

+ 5 - 5
iOSClient/Networking/NCNetworkingE2EE.swift

@@ -233,13 +233,13 @@ import CFNetwork
                 metadata.session = NCCommunicationCommon.shared.sessionIdentifierUpload
                 if let result = NCManageDatabase.sharedInstance.addMetadata(metadata) { metadata = result }
                 
-                NCCommunication.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, dateCreationFile: metadata.date as Date, dateModificationFile: metadata.date as Date, addCustomHeaders: ["e2e-token":e2eToken!], taskHandler: { (task) in
+                NCCommunication.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, dateCreationFile: metadata.date as Date, dateModificationFile: metadata.date as Date, addCustomHeaders: ["e2e-token":e2eToken!], requestHandler: { (request) in
                     
+                    NCNetworking.shared.uploadRequest[fileNameLocalPath] = request
                     metadata.status = Int(k_metadataStatusUploading)
-                    metadata.sessionTaskIdentifier = task.taskIdentifier
                     if let result = NCManageDatabase.sharedInstance.addMetadata(metadata) { metadata = result }
                     
-                    NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_uploadFileStart), object: nil, userInfo: ["ocId":metadata.ocId, "task":task, "serverUrl":serverUrl, "account": metadata.account])
+                    NotificationCenter.default.post(name: Notification.Name.init(rawValue: k_notificationCenter_uploadFileStart), object: nil, userInfo: ["ocId":metadata.ocId, "serverUrl":serverUrl, "account": metadata.account])
                     
                 }, progressHandler: { (progress) in
                     
@@ -247,6 +247,8 @@ import CFNetwork
                     
                 }) { (account, ocId, etag, date, size, errorCode, errorDescription) in
                 
+                    NCNetworking.shared.uploadRequest[fileNameLocalPath] = nil
+                    
                     if (errorCode == 0 && date != nil && etag != nil && ocId != nil) {
                             
                         CCUtility.moveFile(atPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId), toPath:  CCUtility.getDirectoryProviderStorageOcId(ocId))
@@ -258,7 +260,6 @@ import CFNetwork
                         
                         metadata.session = ""
                         metadata.sessionError = ""
-                        metadata.sessionTaskIdentifier = Int(k_taskIdentifierDone)
                         metadata.status = Int(k_metadataStatusNormal)
                                                     
                         if let result = NCManageDatabase.sharedInstance.addMetadata(metadata) { metadata = result }
@@ -297,7 +298,6 @@ import CFNetwork
                         
                         metadata.session = ""
                         metadata.sessionError = errorDescription ?? ""
-                        metadata.sessionTaskIdentifier = Int(k_taskIdentifierDone)
                         metadata.status = Int(k_metadataStatusUploadError)
                        
                         if let result = NCManageDatabase.sharedInstance.addMetadata(metadata) { metadata = result }

+ 1 - 1
iOSClient/Networking/NCNetworkingNotificationCenter.swift

@@ -44,7 +44,7 @@ import Foundation
     @objc func downloadFileStart(_ notification: NSNotification) {
         
         if let userInfo = notification.userInfo as NSDictionary? {
-            if let ocId = userInfo["ocId"] as? String, let serverUrl = userInfo["serverUrl"] as? String, let _ = userInfo["task"] as? URLSessionDownloadTask {
+            if let ocId = userInfo["ocId"] as? String, let serverUrl = userInfo["serverUrl"] as? String {
                 
                 NCMainCommon.sharedInstance.reloadDatasource(ServerUrl: serverUrl, ocId: ocId, action: Int32(k_action_MOD))
                 appDelegate.updateApplicationIconBadgeNumber()

+ 1 - 1
iOSClient/Transfers/CCTransfers.m

@@ -274,7 +274,7 @@
         
         CCSectionDataSourceMetadata *sectionDataSourceTemp = [CCSectionDataSourceMetadata new];
         
-        sectionDataSourceTemp  = [CCSectionMetadata creataDataSourseSectionMetadata:recordsTableMetadata listProgressMetadata:appDelegate.listProgressMetadata groupByField:@"session" filterTypeFileImage:NO filterTypeFileVideo:NO sorted:@"sessionTaskIdentifier" ascending:NO activeAccount:appDelegate.activeAccount];
+        sectionDataSourceTemp  = [CCSectionMetadata creataDataSourseSectionMetadata:recordsTableMetadata listProgressMetadata:appDelegate.listProgressMetadata groupByField:@"session" filterTypeFileImage:NO filterTypeFileVideo:NO sorted:@"fileName" ascending:NO activeAccount:appDelegate.activeAccount];
         
         dispatch_async(dispatch_get_main_queue(), ^{
             sectionDataSource = sectionDataSourceTemp;

+ 2 - 2
iOSClient/Viewer/NCViewerRichdocument.swift

@@ -145,9 +145,9 @@ class NCViewerRichdocument: WKWebView, WKNavigationDelegate, WKScriptMessageHand
                             NCUtility.sharedInstance.startActivityIndicator(view: self, bottom: 0)
                         }
                         
-                        NCCommunication.shared.download(serverUrlFileName: urlString, fileNameLocalPath: fileNameLocalPath, taskHandler: { (task) in
+                        NCCommunication.shared.download(serverUrlFileName: urlString, fileNameLocalPath: fileNameLocalPath, requestHandler: { (_) in
                             
-                        }, progressHandler: { (progress) in
+                        }, progressHandler: { (_) in
                             
                         }, completionHandler: { (account, etag, date, lenght, errorCode, errorDescription) in