Browse Source

replace : delete

Marino Faggiana 6 years ago
parent
commit
f7b370ef18

+ 7 - 61
iOSClient/Favorites/CCFavorites.m

@@ -156,66 +156,6 @@
     return [[NSAttributedString alloc] initWithString:text attributes:attributes];
 }
 
-#pragma --------------------------------------------------------------------------------------------
-#pragma mark ===== Delete =====
-#pragma--------------------------------------------------------------------------------------------
-
-- (void)deleteFile:(NSArray *)metadatas e2ee:(BOOL)e2ee
-{
-    NSInteger numDelete = metadatas.count;
-    __block NSInteger cont = 0;
-    
-    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:appDelegate.activeUser withUserID:appDelegate.activeUserID withPassword:appDelegate.activePassword withUrl:appDelegate.activeUrl];
-    
-    for (tableMetadata *metadata in metadatas) {
-        
-        NSString *serverUrl = [[NCManageDatabase sharedInstance] getServerUrl:metadata.directoryID];
-        if (!serverUrl)
-            continue;
-        
-        [ocNetworking deleteFileOrFolder:metadata.fileName serverUrl:serverUrl completion:^(NSString *message, NSInteger errorCode) {
-            
-            if (errorCode == 0 || errorCode == 404) {
-                
-                [[NSFileManager defaultManager] removeItemAtPath:[CCUtility getDirectoryProviderStorageFileID:metadata.fileID] error:nil];
-                
-                [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID] clearDateReadDirectoryID:metadata.directoryID];
-                [[NCManageDatabase sharedInstance] deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-                [[NCManageDatabase sharedInstance] deletePhotosWithFileID:metadata.fileID];
-                [[appDelegate activePhotos].fileIDHide addObject:metadata.fileID];
-                
-                // Directory ?
-                if (metadata.directory) {
-                    [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:[CCUtility stringAppendServerUrl:serverUrl addFileName:metadata.fileName]];
-                }
-                // E2EE (if exists the record)
-                if (e2ee) {
-                    [[NCManageDatabase sharedInstance] deleteE2eEncryptionWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", metadata.account, serverUrl, metadata.fileName]];
-                }
-            }
-            
-            if (++cont == numDelete) {
-                if (e2ee) {
-                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-                        [[NCNetworkingEndToEnd sharedManager] rebuildAndSendEndToEndMetadataOnServerUrl:serverUrl account:appDelegate.activeAccount user:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl];
-                        dispatch_async(dispatch_get_main_queue(), ^{
-                            
-                            // ONLY for this View
-                            
-                            [self reloadDatasource];
-                        });
-                    });
-                } else {
-                    
-                    // ONLY for this View
-                    
-                    [self reloadDatasource];;
-                }
-            }
-        }];
-    }
-}
-
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ===== Favorite =====
 #pragma--------------------------------------------------------------------------------------------
@@ -503,7 +443,13 @@
     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
     
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_delete_", nil) style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
-        [self deleteFile:[[NSArray alloc] initWithObjects:metadata, nil] e2ee:false];
+        
+        NSString *serverUrl = [[NCManageDatabase sharedInstance] getServerUrl:metadata.directoryID];
+        tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND e2eEncrypted == 1 AND serverUrl == %@", appDelegate.activeAccount, serverUrl]];
+        
+        [[NCMainCommon sharedInstance ] deleteFileWithMetadatas:[[NSArray alloc] initWithObjects:metadata, nil] e2ee:tableDirectory.e2eEncrypted serverUrl:serverUrl folderFileID:tableDirectory.fileID completion:^(NSInteger errorCode, NSString *message) {
+            [self reloadDatasource];
+        }];
     }]];
     
     if (localFile) {

+ 47 - 119
iOSClient/Main/CCDetail.m

@@ -887,139 +887,67 @@
 
 - (void)deleteFile:(tableMetadata *)metadata
 {
-    NSArray *metadatas = [[NSArray alloc] initWithObjects:metadata, nil];
-
-    tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"directoryID == %@", metadata.directoryID]];
+    NSString *serverUrl = [[NCManageDatabase sharedInstance] getServerUrl:metadata.directoryID];
+    tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND e2eEncrypted == 1 AND serverUrl == %@", appDelegate.activeAccount, serverUrl]];
     if (!tableDirectory)
         return;
     
-    if ([CCUtility isFolderEncrypted:tableDirectory.serverUrl account:metadata.account]) {
-        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-            NSError *error = [[NCNetworkingEndToEnd sharedManager] lockEndToEndFolderEncryptedOnServerUrl:tableDirectory.serverUrl fileID:tableDirectory.fileID user:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl];
-            dispatch_async(dispatch_get_main_queue(), ^{
-                if (error == nil) {
-                    [self deleteFile:metadatas e2ee:true];
-                } else {
-                    [appDelegate messageNotification:@"_delete_" description:error.localizedDescription visible:true delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:k_CCErrorInternalError];
-                    return;
-                }
-            });
-        });
-    } else {
-        [self deleteFile:metadatas e2ee:false];
-    }
-}
-
-- (void)deleteFile:(NSArray *)metadatas e2ee:(BOOL)e2ee
-{
-    NSInteger numDelete = metadatas.count;
-    __block NSInteger cont = 0;
-    
-    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:appDelegate.activeUser withUserID:appDelegate.activeUserID withPassword:appDelegate.activePassword withUrl:appDelegate.activeUrl];
-    
-    for (tableMetadata *metadata in metadatas) {
-        
-        NSString *serverUrl = [[NCManageDatabase sharedInstance] getServerUrl:metadata.directoryID];
-        if (!serverUrl)
-            continue;
+    [[NCMainCommon sharedInstance ] deleteFileWithMetadatas:[[NSArray alloc] initWithObjects:metadata, nil] e2ee:tableDirectory.e2eEncrypted serverUrl:serverUrl folderFileID:tableDirectory.fileID completion:^(NSInteger errorCode, NSString *message) {
         
-        [ocNetworking deleteFileOrFolder:metadata.fileName serverUrl:serverUrl completion:^(NSString *message, NSInteger errorCode) {
+        if (errorCode == 0) {
             
-            if (errorCode == 0 || errorCode == 404) {
+            // reload Main
+            [appDelegate.activeMain reloadDatasource];
+            
+            // If removed document (web) or PDF close
+            if (_webView || _readerPDFViewController)
+                [self removeAllView];
+            
+            // if a message for a directory of these
+            if (![_dataSourceDirectoryID containsObject:metadata.directoryID])
+                return;
+            
+            // if we are not in browserPhoto and it's removed photo/video in preview then "< Back"
+            if (!self.photoBrowser && [self.metadataDetail.fileID isEqualToString:metadata.fileID]) {
                 
-                [[NSFileManager defaultManager] removeItemAtPath:[CCUtility getDirectoryProviderStorageFileID:metadata.fileID] error:nil];
+                NSArray *viewsToRemove = [self.view subviews];
+                for (id element in viewsToRemove) {
+                    
+                    if ([element isMemberOfClass:[UIView class]] || [element isMemberOfClass:[UIToolbar class]])
+                        [element removeFromSuperview];
+                }
                 
-                [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID] clearDateReadDirectoryID:metadata.directoryID];
-                [[NCManageDatabase sharedInstance] deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-                [[NCManageDatabase sharedInstance] deletePhotosWithFileID:metadata.fileID];
-                [[appDelegate activePhotos].fileIDHide addObject:metadata.fileID];
+                self.title = @"";
                 
-                // Directory ?
-                if (metadata.directory) {
-                    [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:[CCUtility stringAppendServerUrl:serverUrl addFileName:metadata.fileName]];
-                }
-                // E2EE (if exists the record)
-                if (e2ee) {
-                    [[NCManageDatabase sharedInstance] deleteE2eEncryptionWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", metadata.account, serverUrl, metadata.fileName]];
-                }
-            }
-            
-            if (++cont == numDelete) {
-                if (e2ee) {
-                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-                        [[NCNetworkingEndToEnd sharedManager] rebuildAndSendEndToEndMetadataOnServerUrl:serverUrl account:appDelegate.activeAccount user:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl];
-                        dispatch_async(dispatch_get_main_queue(), ^{
-                            
-                            // ONLY for this View
-                            
-                            [self deleteFile:metadata message:message errorCode:errorCode];
-                        });
-                    });
-                } else {
+                [self.navigationController popViewControllerAnimated:YES];
+                
+            } else {
+                
+                // only photoBrowser if exists
+                for (NSUInteger index=0; index < [self.dataSourceImagesVideos count] && _photoBrowser; index++ ) {
                     
-                    // ONLY for this View
+                    tableMetadata *metadataTemp = [self.dataSourceImagesVideos objectAtIndex:index];
                     
-                    [self deleteFile:metadata message:message errorCode:errorCode];
+                    if ([metadata isInvalidated] || [metadataTemp.fileID isEqualToString:metadata.fileID]) {
+                        
+                        [self.dataSourceImagesVideos removeObjectAtIndex:index];
+                        [self.photos removeObjectAtIndex:index];
+                        [self.photoBrowser reloadData];
+                        
+                        // Title
+                        if ([self.dataSourceImagesVideos count] == 0) {
+                            
+                            self.title = @"";
+                            [self.navigationController popViewControllerAnimated:YES];
+                        }
+                    }
                 }
             }
-        }];
-    }
-}
-
-- (void)deleteFile:(tableMetadata *)metadata message:(NSString *)message errorCode:(NSInteger)errorCode
-{
-    if (errorCode == 0) {
-        
-        // reload Main
-        [appDelegate.activeMain reloadDatasource];
-    
-        // If removed document (web) or PDF close
-        if (_webView || _readerPDFViewController)
-            [self removeAllView];
-        
-        // if a message for a directory of these
-        if (![_dataSourceDirectoryID containsObject:metadata.directoryID])
-            return;
-    
-        // if we are not in browserPhoto and it's removed photo/video in preview then "< Back"
-        if (!self.photoBrowser && [self.metadataDetail.fileID isEqualToString:metadata.fileID]) {
-        
-            NSArray *viewsToRemove = [self.view subviews];
-            for (id element in viewsToRemove) {
-            
-                if ([element isMemberOfClass:[UIView class]] || [element isMemberOfClass:[UIToolbar class]])
-                    [element removeFromSuperview];
-            }
-        
-            self.title = @"";
-        
-            [self.navigationController popViewControllerAnimated:YES];
-        
         } else {
-    
-            // only photoBrowser if exists
-            for (NSUInteger index=0; index < [self.dataSourceImagesVideos count] && _photoBrowser; index++ ) {
-        
-                tableMetadata *metadataTemp = [self.dataSourceImagesVideos objectAtIndex:index];
-        
-                if ([metadata isInvalidated] || [metadataTemp.fileID isEqualToString:metadata.fileID]) {
-            
-                    [self.dataSourceImagesVideos removeObjectAtIndex:index];
-                    [self.photos removeObjectAtIndex:index];
-                    [self.photoBrowser reloadData];
-            
-                    // Title
-                    if ([self.dataSourceImagesVideos count] == 0) {
-                
-                        self.title = @"";
-                        [self.navigationController popViewControllerAnimated:YES];
-                    }            
-                }
-            }
+            NSLog(@"[LOG] DeleteFileOrFolder failure error %d, %@", (int)errorCode, message);
         }
-    } else {
-        NSLog(@"[LOG] DeleteFileOrFolder failure error %d, %@", (int)errorCode, message);
-    }
+    }];
+
 }
 
 #pragma --------------------------------------------------------------------------------------------

+ 9 - 82
iOSClient/Main/CCMain.m

@@ -1766,88 +1766,15 @@
     } else {
         metadatas = [[NSArray alloc] initWithObjects:_metadata, nil];
     }
-
-    if (_metadataFolder.e2eEncrypted) {
-        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-            NSError *error = [[NCNetworkingEndToEnd sharedManager] lockEndToEndFolderEncryptedOnServerUrl:self.serverUrl fileID:_metadataFolder.fileID user:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl];
-            dispatch_async(dispatch_get_main_queue(), ^{
-                if (error == nil) {
-                    [self deleteFile:metadatas e2ee:_metadataFolder.e2eEncrypted];
-                } else {
-                    [appDelegate messageNotification:@"_delete_" description:error.localizedDescription visible:true delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:k_CCErrorInternalError];
-                    return;
-                }
-            });
-        });
-    } else {
-        [self deleteFile:metadatas e2ee:_metadataFolder.e2eEncrypted];
-    }
-}
-
-- (void)deleteFile:(NSArray *)metadatas e2ee:(BOOL)e2ee
-{
-    NSInteger numDelete = metadatas.count;
-    __block NSInteger cont = 0;
-    
-    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:appDelegate.activeUser withUserID:appDelegate.activeUserID withPassword:appDelegate.activePassword withUrl:appDelegate.activeUrl];
-    
-    for (tableMetadata *metadata in metadatas) {
-        
-        NSString *serverUrl = [[NCManageDatabase sharedInstance] getServerUrl:metadata.directoryID];
-        if (!serverUrl)
-            continue;
-        
-        [ocNetworking deleteFileOrFolder:metadata.fileName serverUrl:serverUrl completion:^(NSString *message, NSInteger errorCode) {
-            
-            if (errorCode == 0 || errorCode == 404) {
-                
-                [[NSFileManager defaultManager] removeItemAtPath:[CCUtility getDirectoryProviderStorageFileID:metadata.fileID] error:nil];
-                
-                [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID] clearDateReadDirectoryID:metadata.directoryID];
-                [[NCManageDatabase sharedInstance] deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-                [[NCManageDatabase sharedInstance] deletePhotosWithFileID:metadata.fileID];
-                [[appDelegate activePhotos].fileIDHide addObject:metadata.fileID];
-                
-                // Directory ?
-                if (metadata.directory) {
-                    [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:[CCUtility stringAppendServerUrl:serverUrl addFileName:metadata.fileName]];
-                }
-                // E2EE (if exists the record)
-                if (e2ee) {
-                    [[NCManageDatabase sharedInstance] deleteE2eEncryptionWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", metadata.account, serverUrl, metadata.fileName]];
-                }
-            }
-            
-            if (++cont == numDelete) {
-                if (e2ee) {
-                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-                        [[NCNetworkingEndToEnd sharedManager] rebuildAndSendEndToEndMetadataOnServerUrl:serverUrl account:appDelegate.activeAccount user:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl];
-                        dispatch_async(dispatch_get_main_queue(), ^{
-                            
-                            // ONLY for this View
-                            
-                            // End Select Table View
-                            [self tableViewSelect:NO];
-                            
-                            [self reloadDatasource:serverUrl];
-                        });
-                    });
-                } else {
-                    
-                    // ONLY for this View
-
-                    // End Select Table View
-                    [self tableViewSelect:NO];
-                    
-                    // Reload
-                    if (_isSearchMode)
-                        [self readFolder:serverUrl];
-                    else
-                        [self reloadDatasource:serverUrl];
-                }
-            }
-        }];
-    }
+    [[NCMainCommon sharedInstance ] deleteFileWithMetadatas:metadatas e2ee:_metadataFolder.e2eEncrypted serverUrl:self.serverUrl folderFileID:_metadataFolder.fileID completion:^(NSInteger errorCode, NSString *message) {
+        // End Select Table View
+        [self tableViewSelect:NO];
+        // Reload
+        if (_isSearchMode)
+            [self readFolder:self.serverUrl];
+        else
+            [self reloadDatasource:self.serverUrl];
+    }];
 }
 
 #pragma --------------------------------------------------------------------------------------------

+ 215 - 133
iOSClient/Main/NCMainCommon.swift

@@ -32,6 +32,143 @@ class NCMainCommon: NSObject {
     
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     
+    //MARK: -
+    
+    @objc func triggerProgressTask(_ notification: Notification, sectionDataSourceFileIDIndexPath: NSDictionary, tableView: UITableView) {
+        
+        guard let dic = notification.userInfo else {
+            return
+        }
+        
+        let fileID = dic["fileID"] as! NSString
+        _ = dic["serverUrl"] as! NSString
+        let status = dic["status"] as! Int
+        let progress = dic["progress"] as! CGFloat
+        let totalBytes = dic["totalBytes"] as! Double
+        let totalBytesExpected = dic["totalBytesExpected"] as! Double
+        
+        appDelegate.listProgressMetadata.setObject([progress as NSNumber, totalBytes as NSNumber, totalBytesExpected as NSNumber], forKey: fileID)
+        
+        guard let indexPath = sectionDataSourceFileIDIndexPath.object(forKey: fileID) else {
+            return
+        }
+        
+        if isValidIndexPath(indexPath as! IndexPath, tableView: tableView) {
+            
+            if let cell = tableView.cellForRow(at: indexPath as! IndexPath) as? CCCellMainTransfer {
+                
+                var image = ""
+                
+                if status == k_metadataStatusInDownload {
+                    image = "↓"
+                } else if status == k_metadataStatusInUpload {
+                    image = "↑"
+                }
+                
+                cell.labelInfoFile.text = CCUtility.transformedSize(totalBytesExpected) + " - " + image + CCUtility.transformedSize(totalBytes)
+                cell.transferButton.progress = progress
+            }
+        }
+    }
+    
+    @objc func cancelTransferMetadata(_ metadata: tableMetadata, reloadDatasource: Bool) {
+        
+        if metadata.session.count == 0 {
+            return
+        }
+        
+        let session = CCNetworking.shared().getSessionfromSessionDescription(metadata.session) as URLSession
+        
+        // SESSION EXTENSION
+        if metadata.session == k_download_session_extension || metadata.session == k_upload_session_extension {
+            
+            if (metadata.session == k_upload_session_extension) {
+                
+                do {
+                    try FileManager.default.removeItem(atPath: CCUtility.getDirectoryProviderStorageFileID(metadata.fileID))
+                } catch { }
+                
+                NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadata.fileID), clearDateReadDirectoryID: metadata.directoryID)
+            } else {
+                NCManageDatabase.sharedInstance.setMetadataSession("", sessionError: "", sessionSelector: "", sessionTaskIdentifier: Int(k_taskIdentifierDone), status: Int(k_metadataStatusNormal), predicate: NSPredicate(format: "fileID == %@", metadata.fileID))
+            }
+            
+            self.reloadDatasource(ServerUrl: nil)
+            
+            return
+        }
+        
+        session.getTasksWithCompletionHandler { (dataTasks, uploadTasks, downloadTasks) in
+            
+            var cancel = false
+            
+            // DOWNLOAD
+            if metadata.session.count > 0 && metadata.session.contains("download") {
+                for task in downloadTasks {
+                    if task.taskIdentifier == metadata.sessionTaskIdentifier {
+                        task.cancel()
+                        cancel = true
+                    }
+                }
+                if cancel == false {
+                    NCManageDatabase.sharedInstance.setMetadataSession("", sessionError: "", sessionSelector: "", sessionTaskIdentifier: Int(k_taskIdentifierDone), status: Int(k_metadataStatusNormal), predicate: NSPredicate(format: "fileID == %@", metadata.fileID))
+                }
+            }
+            
+            // UPLOAD
+            if metadata.session.count > 0 && metadata.session.contains("upload") {
+                for task in uploadTasks {
+                    if task.taskIdentifier == metadata.sessionTaskIdentifier {
+                        task.cancel()
+                        cancel = true
+                    }
+                }
+                if cancel == false {
+                    do {
+                        try FileManager.default.removeItem(atPath: CCUtility.getDirectoryProviderStorageFileID(metadata.fileID))
+                    }
+                    catch { }
+                    NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadata.fileID), clearDateReadDirectoryID: metadata.directoryID)
+                }
+            }
+            
+            if cancel == false {
+                self.reloadDatasource(ServerUrl: nil)
+            }
+        }
+    }
+    
+    @objc func cancelAllTransfer() {
+        
+        // Delete k_metadataStatusWaitUpload OR k_metadataStatusUploadError
+        NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "account == %@ AND (status == %d OR status == %d)", appDelegate.activeAccount, k_metadataStatusWaitUpload, k_metadataStatusUploadError), clearDateReadDirectoryID: nil)
+        
+        guard let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND status != %d AND status != %d", appDelegate.activeAccount, k_metadataStatusNormal, k_metadataStatusHide), sorted: "fileName", ascending: true) else {
+            return
+        }
+        
+        for metadata in metadatas {
+            
+            // Modify
+            if (metadata.status == k_metadataStatusWaitDownload || metadata.status == k_metadataStatusDownloadError) {
+                metadata.session = ""
+                metadata.sessionSelector = ""
+                metadata.status = Int(k_metadataStatusNormal)
+                
+                _ = NCManageDatabase.sharedInstance.addMetadata(metadata)
+            }
+            
+            // Cancel Task
+            if metadata.status == k_metadataStatusDownloading || metadata.status == k_metadataStatusUploading {
+                cancelTransferMetadata(metadata, reloadDatasource: false)
+            }
+        }
+        
+        self.reloadDatasource(ServerUrl: nil)
+    }
+    
+    //MARK: -
+    
     @objc func cellForRowAtIndexPath(_ indexPath: IndexPath, tableView: UITableView ,metadata: tableMetadata, metadataFolder: tableMetadata?, serverUrl: String, autoUploadFileName: String, autoUploadDirectory: String) -> UITableViewCell {
         
         // Create File System
@@ -304,139 +441,6 @@ class NCMainCommon: NSObject {
         }
     }
     
-    @objc func triggerProgressTask(_ notification: Notification, sectionDataSourceFileIDIndexPath: NSDictionary, tableView: UITableView) {
-        
-        guard let dic = notification.userInfo else {
-            return
-        }
-        
-        let fileID = dic["fileID"] as! NSString
-        _ = dic["serverUrl"] as! NSString
-        let status = dic["status"] as! Int
-        let progress = dic["progress"] as! CGFloat
-        let totalBytes = dic["totalBytes"] as! Double
-        let totalBytesExpected = dic["totalBytesExpected"] as! Double
-        
-        appDelegate.listProgressMetadata.setObject([progress as NSNumber, totalBytes as NSNumber, totalBytesExpected as NSNumber], forKey: fileID)
-        
-        guard let indexPath = sectionDataSourceFileIDIndexPath.object(forKey: fileID) else {
-            return
-        }
-        
-        if isValidIndexPath(indexPath as! IndexPath, tableView: tableView) {
-        
-            if let cell = tableView.cellForRow(at: indexPath as! IndexPath) as? CCCellMainTransfer {
-                
-                var image = ""
-
-                if status == k_metadataStatusInDownload {
-                    image = "↓"
-                } else if status == k_metadataStatusInUpload {
-                    image = "↑"
-                }
-                
-                cell.labelInfoFile.text = CCUtility.transformedSize(totalBytesExpected) + " - " + image + CCUtility.transformedSize(totalBytes)
-                cell.transferButton.progress = progress
-            }
-        }
-    }
-    
-    @objc func cancelTransferMetadata(_ metadata: tableMetadata, reloadDatasource: Bool) {
-        
-        if metadata.session.count == 0 {
-            return
-        }
-        
-        let session = CCNetworking.shared().getSessionfromSessionDescription(metadata.session) as URLSession
-        
-        // SESSION EXTENSION
-        if metadata.session == k_download_session_extension || metadata.session == k_upload_session_extension {
-
-            if (metadata.session == k_upload_session_extension) {
-
-                do {
-                    try FileManager.default.removeItem(atPath: CCUtility.getDirectoryProviderStorageFileID(metadata.fileID))
-                } catch { }
-                
-                NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadata.fileID), clearDateReadDirectoryID: metadata.directoryID)
-            } else {
-                NCManageDatabase.sharedInstance.setMetadataSession("", sessionError: "", sessionSelector: "", sessionTaskIdentifier: Int(k_taskIdentifierDone), status: Int(k_metadataStatusNormal), predicate: NSPredicate(format: "fileID == %@", metadata.fileID))
-            }
-         
-            self.reloadDatasource(ServerUrl: nil)
-            
-            return
-        }
-        
-        session.getTasksWithCompletionHandler { (dataTasks, uploadTasks, downloadTasks) in
-            
-            var cancel = false
-            
-            // DOWNLOAD
-            if metadata.session.count > 0 && metadata.session.contains("download") {
-                for task in downloadTasks {
-                    if task.taskIdentifier == metadata.sessionTaskIdentifier {
-                        task.cancel()
-                        cancel = true
-                    }
-                }
-                if cancel == false {
-                    NCManageDatabase.sharedInstance.setMetadataSession("", sessionError: "", sessionSelector: "", sessionTaskIdentifier: Int(k_taskIdentifierDone), status: Int(k_metadataStatusNormal), predicate: NSPredicate(format: "fileID == %@", metadata.fileID))
-                }
-            }
-            
-            // UPLOAD
-            if metadata.session.count > 0 && metadata.session.contains("upload") {
-                for task in uploadTasks {
-                    if task.taskIdentifier == metadata.sessionTaskIdentifier {
-                        task.cancel()
-                        cancel = true
-                    }
-                }
-                if cancel == false {
-                    do {
-                        try FileManager.default.removeItem(atPath: CCUtility.getDirectoryProviderStorageFileID(metadata.fileID))
-                    }
-                    catch { }
-                    NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadata.fileID), clearDateReadDirectoryID: metadata.directoryID)
-                }
-            }
-            
-            if cancel == false {
-                self.reloadDatasource(ServerUrl: nil)
-            }
-        }
-    }
-    
-    @objc func cancelAllTransfer() {
-
-        // Delete k_metadataStatusWaitUpload OR k_metadataStatusUploadError
-        NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "account == %@ AND (status == %d OR status == %d)", appDelegate.activeAccount, k_metadataStatusWaitUpload, k_metadataStatusUploadError), clearDateReadDirectoryID: nil)
-
-        guard let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND status != %d AND status != %d", appDelegate.activeAccount, k_metadataStatusNormal, k_metadataStatusHide), sorted: "fileName", ascending: true) else {
-            return
-        }
-        
-        for metadata in metadatas {
-            
-            // Modify
-            if (metadata.status == k_metadataStatusWaitDownload || metadata.status == k_metadataStatusDownloadError) {
-                metadata.session = ""
-                metadata.sessionSelector = ""
-                metadata.status = Int(k_metadataStatusNormal)
-                
-                _ = NCManageDatabase.sharedInstance.addMetadata(metadata)
-            }
-            
-            // Cancel Task
-            if metadata.status == k_metadataStatusDownloading || metadata.status == k_metadataStatusUploading {
-                cancelTransferMetadata(metadata, reloadDatasource: false)
-            }
-        }
-        
-        self.reloadDatasource(ServerUrl: nil)
-    }
-    
     @objc func getMetadataFromSectionDataSourceIndexPath(_ indexPath: IndexPath, sectionDataSource: CCSectionDataSourceMetadata) -> tableMetadata? {
         
         let section = indexPath.section + 1
@@ -486,6 +490,84 @@ class NCMainCommon: NSObject {
         
         return indexPath.section < tableView.numberOfSections && indexPath.row < tableView.numberOfRows(inSection: indexPath.section)
     }
+    
+    //MARK: -
+    
+    @objc func deleteFile(metadatas: NSArray, e2ee: Bool, serverUrl: String, folderFileID: String, completion: @escaping (_ errorCode: Int, _ message: String)->()) {
         
+        if e2ee {
+            DispatchQueue.global().async {
+                let error = NCNetworkingEndToEnd.sharedManager().lockFolderEncrypted(onServerUrl: serverUrl, fileID: folderFileID, user: self.appDelegate.activeUser, userID: self.appDelegate.activeUserID, password: self.appDelegate.activePassword, url: self.appDelegate.activeUrl)
+                DispatchQueue.main.async {
+                    if error == nil {
+                        self.delete(metadatas: metadatas, e2ee: e2ee, completion: completion)
+                    } else {
+                        self.appDelegate.messageNotification("_delete_", description: error?.localizedDescription, visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.error, errorCode: Int(k_CCErrorInternalError))
+                        return
+                    }
+                }
+            }
+        } else {
+            delete(metadatas: metadatas, e2ee: e2ee, completion: completion)
+        }
+    }
+    
+    private func delete(metadatas: NSArray, e2ee: Bool,  completion: @escaping (_ errorCode: Int, _ message: String)->()) {
+        
+        var count: Int = 0
+        var completionErrorCode: Int = 0
+        var completionMessage = ""
+        
+        let ocNetworking = OCnetworking.init(delegate: nil, metadataNet: nil, withUser: appDelegate.activeUser, withUserID: appDelegate.activeUserID, withPassword: appDelegate.activePassword, withUrl: appDelegate.activeUrl)
+        
+        for case let metadata as tableMetadata in metadatas {
+            
+            guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else {
+                continue
+            }
+            
+            ocNetworking?.deleteFileOrFolder(metadata.fileName, serverUrl: serverUrl, completion: { (message, errorCode) in
+                
+                count += 1
+
+                if errorCode == 0 || errorCode == 404 {
+                    
+                    do {
+                        try FileManager.default.removeItem(atPath: CCUtility.getDirectoryProviderStorageFileID(metadata.fileID))
+                    } catch { }
+                    
+                    NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadata.fileID), clearDateReadDirectoryID: metadata.directoryID)
+                    NCManageDatabase.sharedInstance.deleteLocalFile(predicate: NSPredicate(format: "fileID == %@", metadata.fileID))
+                    NCManageDatabase.sharedInstance.deletePhotos(fileID: metadata.fileID)
+                    self.appDelegate.activePhotos.fileIDHide.add(metadata.fileID)
+                    
+                    if metadata.directory {
+                        NCManageDatabase.sharedInstance.deleteDirectoryAndSubDirectory(serverUrl: CCUtility.stringAppendServerUrl(serverUrl, addFileName: metadata.fileName))
+                    }
+                    
+                    if (e2ee) {
+                        NCManageDatabase.sharedInstance.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", metadata.account, serverUrl, metadata.fileName))
+                    }
+                } else {
+                    completionErrorCode = errorCode
+                    completionMessage = message!
+                }
+                
+                if count == metadatas.count {
+                    if e2ee {
+                        DispatchQueue.global().async {
+                            NCNetworkingEndToEnd.sharedManager().rebuildAndSendMetadata(onServerUrl: serverUrl, account: self.appDelegate.activeAccount, user: self.appDelegate.activeUser, userID: self.appDelegate.activeUserID, password: self.appDelegate.activePassword, url: self.appDelegate.activeUrl)
+                            DispatchQueue.main.async {
+                                completion(completionErrorCode, completionMessage)
+                            }
+                        }
+                    } else {
+                        completion(completionErrorCode, completionMessage)
+                    }
+                }
+            })
+        }
+    }
+    
 }
 

+ 4 - 53
iOSClient/Photos/CCPhotos.m

@@ -398,58 +398,10 @@
 
 - (void)deleteFile:(NSArray *)metadatas e2ee:(BOOL)e2ee
 {
-    NSInteger numDelete = metadatas.count;
-    __block NSInteger cont = 0;
-    
-    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:appDelegate.activeUser withUserID:appDelegate.activeUserID withPassword:appDelegate.activePassword withUrl:appDelegate.activeUrl];
-    
-    for (tableMetadata *metadata in metadatas) {
-    
-        NSString *serverUrl = [[NCManageDatabase sharedInstance] getServerUrl:metadata.directoryID];
-        if (!serverUrl)
-            continue;
-        
-        [ocNetworking deleteFileOrFolder:metadata.fileName serverUrl:serverUrl completion:^(NSString *message, NSInteger errorCode) {
-            
-            if (errorCode == 0 || errorCode == 404) {
-                
-                [[NSFileManager defaultManager] removeItemAtPath:[CCUtility getDirectoryProviderStorageFileID:metadata.fileID] error:nil];
-
-                [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID] clearDateReadDirectoryID:metadata.directoryID];
-                [[NCManageDatabase sharedInstance] deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-                [[NCManageDatabase sharedInstance] deletePhotosWithFileID:metadata.fileID];
-                [[appDelegate activePhotos].fileIDHide addObject:metadata.fileID];
-                
-                // Directory ?
-                if (metadata.directory) {
-                    [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:[CCUtility stringAppendServerUrl:serverUrl addFileName:metadata.fileName]];
-                }
-                // E2EE (if exists the record)
-                if (e2ee) {
-                    [[NCManageDatabase sharedInstance] deleteE2eEncryptionWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", metadata.account, serverUrl, metadata.fileName]];
-                }
-            }
-            
-            if (++cont == numDelete) {
-                if (e2ee) {
-                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-                        [[NCNetworkingEndToEnd sharedManager] rebuildAndSendEndToEndMetadataOnServerUrl:serverUrl account:appDelegate.activeAccount user:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl];
-                        dispatch_async(dispatch_get_main_queue(), ^{
-                            
-                            // ONLY for this View
-                            
-                            [self reloadDatasource];
-                        });
-                    });
-                } else {
-                    
-                    // ONLY for this View
-                    
-                    [self reloadDatasource];
-                }
-            }
-        }];
-    }
+    [[NCMainCommon sharedInstance ] deleteFileWithMetadatas:metadatas e2ee:false serverUrl:@"" folderFileID:@"" completion:^(NSInteger errorCode, NSString *message) {
+        [self reloadDatasource];
+        [self editingModeNO];
+    }];
 }
 
 - (void)deleteSelectedFiles
@@ -463,7 +415,6 @@
                                                          style:UIAlertActionStyleDestructive
                                                        handler:^(UIAlertAction *action) {
                                                            [self deleteFile:selectedMetadatas e2ee:false];
-                                                           [self editingModeNO];
                                                        }]];
     
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_cancel_", nil)