فهرست منبع

Improvements : deleteFile

Marino Faggiana 6 سال پیش
والد
کامیت
6a57ceac77
4فایلهای تغییر یافته به همراه140 افزوده شده و 178 حذف شده
  1. 0 156
      iOSClient/Actions/CCActions.swift
  2. 54 12
      iOSClient/Favorites/CCFavorites.m
  3. 85 8
      iOSClient/Main/CCDetail.m
  4. 1 2
      iOSClient/Main/CCMain.m

+ 0 - 156
iOSClient/Actions/CCActions.swift

@@ -23,11 +23,6 @@
 
 import Foundation
 
-@objc protocol CCActionsDeleteDelegate {
-    
-    func deleteFileOrFolderSuccessFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger)
-}
-
 @objc protocol CCActionsRenameDelegate {
 
     func renameSuccess(_ metadataNet: CCMetadataNet)
@@ -67,157 +62,6 @@ class CCActions: NSObject {
     override init() {
     }
     
-    // --------------------------------------------------------------------------------------------
-    // MARK: Delete File or Folder
-    // --------------------------------------------------------------------------------------------
-
-    @objc func deleteFileOrFolder(_ metadata: tableMetadata,delegate: AnyObject, hud: CCHud?, hudTitled: String?) {
-                
-        guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else {
-            return
-        }
-        
-        let isDirectory = metadata.directory
-        let directoryID = metadata.directoryID
-        let fileID = metadata.fileID
-        let fileName = metadata.fileName
-        let fileNameView = metadata.fileNameView
-        
-        // fix CCActions.swift line 88 2.17.2 (00005)
-        if (serverUrl == "") {
-            appDelegate.messageNotification("_delete_", description: "_file_not_found_reload_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.error, errorCode: Int(k_CCErrorInternalError))
-            return
-        }
-        
-        DispatchQueue.global().async {
-        
-            // E2EE LOCK
-            let tableE2eEncryption = NCManageDatabase.sharedInstance.getE2eEncryption(predicate: NSPredicate(format: "account == %@ AND fileNameIdentifier == %@", self.appDelegate.activeAccount, fileName))
-            if tableE2eEncryption != nil {
-                
-                guard let tableDirectory = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.activeAccount, serverUrl)) else {
-                    return
-                }
-                
-                let error = NCNetworkingEndToEnd.sharedManager().lockFolderEncrypted(onServerUrl: serverUrl, fileID: tableDirectory.fileID, user: self.appDelegate.activeUser, userID: self.appDelegate.activeUserID, password: self.appDelegate.activePassword, url: self.appDelegate.activeUrl)                
-                if error != nil {
-                    DispatchQueue.main.async {
-                        self.appDelegate.messageNotification("_delete_", description: error!.localizedDescription, visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.error, errorCode: Int(k_CCErrorInternalError))
-                    }
-                    return;
-                }
-            }
-        
-            let metadataNet: CCMetadataNet = CCMetadataNet.init(account: self.appDelegate.activeAccount)
-
-            metadataNet.action = actionDeleteFileDirectory
-            metadataNet.delegate = delegate
-            metadataNet.directory = isDirectory
-            metadataNet.directoryID = directoryID
-            metadataNet.fileID = fileID
-            metadataNet.fileName = fileName
-            metadataNet.fileNameView = fileNameView
-            metadataNet.selector = selectorDelete
-            metadataNet.serverUrl = serverUrl
-        
-            self.appDelegate.addNetworkingOperationQueue(self.appDelegate.netQueue, delegate: self, metadataNet: metadataNet)
-            
-            if hud != nil  {
-                DispatchQueue.main.async {
-                    hud?.visibleHudTitle(hudTitled, mode: MBProgressHUDMode.indeterminate, color: nil)
-                }
-            }
-        }
-    }
-    
-    @objc func deleteFileOrFolderSuccessFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) {
-
-        if (errorCode == 0) {
-        
-            do {
-                try FileManager.default.removeItem(atPath: CCUtility.getDirectoryProviderStorageFileID(metadataNet.fileID))
-            } catch { }
-            
-            NCManageDatabase.sharedInstance.deletePhotos(fileID: metadataNet.fileID)
-            appDelegate.activePhotos.fileIDHide.add(metadataNet.fileID)
-            NCManageDatabase.sharedInstance.deleteLocalFile(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID))
-            // E2EE (if exists the record)
-            NCManageDatabase.sharedInstance.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", metadataNet.account, metadataNet.serverUrl, metadataNet.fileName))
-
-            guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID)) else {
-                self.deleteFileOrFolderSuccessFailure(metadataNet, message: "", errorCode: 0)
-                return
-            }
-            
-            NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID), clearDateReadDirectoryID: metadata.directoryID)
-        
-            if metadata.directory {
-                let dirForDelete = CCUtility.stringAppendServerUrl(metadataNet.serverUrl, addFileName: metadata.fileName)
-                NCManageDatabase.sharedInstance.deleteDirectoryAndSubDirectory(serverUrl: dirForDelete!)
-            }
-            
-            guard let tableDirectory = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.activeAccount, metadataNet.serverUrl)) else {
-                self.deleteFileOrFolderSuccessFailure(metadataNet, message: "", errorCode: 0)
-                return
-            }
-        
-            // E2EE Rebuild and send Metadata
-            if tableDirectory.e2eEncrypted {
-
-                DispatchQueue.global().async {
-                                        
-                    // Send Metadata
-                    let error = NCNetworkingEndToEnd.sharedManager().rebuildAndSendMetadata(onServerUrl: metadataNet.serverUrl, account: self.appDelegate.activeAccount, user: self.appDelegate.activeUser, userID: self.appDelegate.activeUserID, password: self.appDelegate.activePassword, url: self.appDelegate.activeUrl) as NSError?
-                    
-                    DispatchQueue.main.async {
-                        if (error == nil) {
-                            metadataNet.delegate?.deleteFileOrFolderSuccessFailure(metadataNet, message: "", errorCode: 0)
-                        } else {
-                            self.deleteFileOrFolderSuccessFailure(metadataNet, message: error!.localizedDescription as NSString, errorCode: error!.code)
-                        }
-                    }
-                }
-            
-            } else {
-                metadataNet.delegate?.deleteFileOrFolderSuccessFailure(metadataNet, message: "", errorCode: 0)
-            }
-            
-        } else {
-            
-            if errorCode == 404 {
-                
-                do {
-                    try FileManager.default.removeItem(atPath: CCUtility.getDirectoryProviderStorageFileID(metadataNet.fileID))
-                } catch { }
-                
-                NCManageDatabase.sharedInstance.deleteLocalFile(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID))
-                NCManageDatabase.sharedInstance.deletePhotos(fileID: metadataNet.fileID)
-                appDelegate.activePhotos.fileIDHide.add(metadataNet.fileID)
-                // E2EE (if exists the record)
-                NCManageDatabase.sharedInstance.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", metadataNet.account, metadataNet.serverUrl, metadataNet.fileName))
-                
-                guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID)) else {
-                    self.deleteFileOrFolderSuccessFailure(metadataNet, message: "", errorCode: 0)
-                    return
-                }
-                
-                NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID), clearDateReadDirectoryID: metadata.directoryID)
-                
-                if metadata.directory {
-                    let dirForDelete = CCUtility.stringAppendServerUrl(metadataNet.serverUrl, addFileName: metadata.fileName)
-                    NCManageDatabase.sharedInstance.deleteDirectoryAndSubDirectory(serverUrl: dirForDelete!)
-                }
-            }
-            
-            if message.length > 0 {
-                
-                appDelegate.messageNotification("_delete_", description: message as String, visible: true, delay:TimeInterval(k_dismissAfterSecond), type:TWMessageBarMessageType.error, errorCode: errorCode)
-            }
-            
-            metadataNet.delegate?.deleteFileOrFolderSuccessFailure(metadataNet, message: message, errorCode: errorCode)
-        }
-    }
-    
     // --------------------------------------------------------------------------------------------
     // MARK: Rename File or Folder
     // --------------------------------------------------------------------------------------------

+ 54 - 12
iOSClient/Favorites/CCFavorites.m

@@ -27,7 +27,7 @@
 
 #import "NCBridgeSwift.h"
 
-@interface CCFavorites () <CCActionsDeleteDelegate, CCActionsSettingFavoriteDelegate>
+@interface CCFavorites () <CCActionsSettingFavoriteDelegate>
 {
     AppDelegate *appDelegate;
 
@@ -165,15 +165,61 @@
 }
 
 #pragma --------------------------------------------------------------------------------------------
-#pragma mark ===== Delete <delegate> =====
+#pragma mark ===== Delete =====
 #pragma--------------------------------------------------------------------------------------------
 
-- (void)deleteFileOrFolderSuccessFailure:(CCMetadataNet *)metadataNet message:(NSString *)message errorCode:(NSInteger)errorCode
+- (void)deleteFile:(NSArray *)metadatas e2ee:(BOOL)e2ee
 {
-    if (errorCode == 0)
-        [self reloadDatasource];
-    else
-        NSLog(@"[LOG] DeleteFileOrFolder failure error %d, %@", (int)errorCode, message);
+    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];
+        
+        [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 --------------------------------------------------------------------------------------------
@@ -395,17 +441,13 @@
 
 - (void)actionDelete:(NSIndexPath *)indexPath
 {
-    tableMetadata *metadata = [_dataSource objectAtIndex:indexPath.row];
-    
     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
     
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_delete_", nil) style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
         
-        [[CCActions sharedInstance] deleteFileOrFolder:metadata delegate:self hud:nil hudTitled:nil];
-        [self reloadDatasource];
+        [self deleteFile:[[NSArray alloc] initWithObjects:[_dataSource objectAtIndex:indexPath.row], nil] e2ee:false];
     }]];
     
-    
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_cancel_", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
     }]];
     

+ 85 - 8
iOSClient/Main/CCDetail.m

@@ -31,7 +31,7 @@
 
 #define alertRequestPasswordPDF 1
 
-@interface CCDetail () <CCActionsDeleteDelegate>
+@interface CCDetail ()
 {
     AppDelegate *appDelegate;
     
@@ -584,7 +584,7 @@
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_delete_", nil)
                                                          style:UIAlertActionStyleDestructive
                                                        handler:^(UIAlertAction *action) {
-                                                           [[CCActions sharedInstance] deleteFileOrFolder:metadata delegate:self hud:nil hudTitled:nil];
+                                                           [self deleteFile:metadata];
                                                        }]];
 
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_cancel_", nil)
@@ -876,7 +876,84 @@
 #pragma mark ===== Delete =====
 #pragma --------------------------------------------------------------------------------------------
 
-- (void)deleteFileOrFolderSuccessFailure:(CCMetadataNet *)metadataNet message:(NSString *)message errorCode:(NSInteger)errorCode
+- (void)deleteFile:(tableMetadata *)metadata
+{
+    NSArray *metadatas = [[NSArray alloc] initWithObjects:metadata, nil];
+
+    tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"directoryID == %@", metadata.directoryID]];
+    
+    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];
+        
+        [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 deleteFile:metadata message:message errorCode:errorCode];
+                        });
+                    });
+                } else {
+                    
+                    // ONLY for this View
+                    
+                    [self deleteFile:metadata message:message errorCode:errorCode];
+                }
+            }
+        }];
+    }
+}
+
+- (void)deleteFile:(tableMetadata *)metadata message:(NSString *)message errorCode:(NSInteger)errorCode
 {
     if (errorCode == 0) {
         
@@ -888,11 +965,11 @@
             [self removeAllView];
         
         // if a message for a directory of these
-        if (![_dataSourceDirectoryID containsObject:metadataNet.directoryID])
+        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:metadataNet.fileID]) {
+        if (!self.photoBrowser && [self.metadataDetail.fileID isEqualToString:metadata.fileID]) {
         
             NSArray *viewsToRemove = [self.view subviews];
             for (id element in viewsToRemove) {
@@ -910,9 +987,9 @@
             // only photoBrowser if exists
             for (NSUInteger index=0; index < [self.dataSourceImagesVideos count] && _photoBrowser; index++ ) {
         
-                tableMetadata *metadata = [self.dataSourceImagesVideos objectAtIndex:index];
+                tableMetadata *metadataTemp = [self.dataSourceImagesVideos objectAtIndex:index];
         
-                if ([metadata isInvalidated] || [metadata.fileID isEqualToString:metadataNet.fileID]) {
+                if ([metadata isInvalidated] || [metadataTemp.fileID isEqualToString:metadata.fileID]) {
             
                     [self.dataSourceImagesVideos removeObjectAtIndex:index];
                     [self.photos removeObjectAtIndex:index];
@@ -980,7 +1057,7 @@
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_delete_", nil)
                                                          style:UIAlertActionStyleDestructive
                                                        handler:^(UIAlertAction *action) {
-                                                           [[CCActions sharedInstance] deleteFileOrFolder:self.metadataDetail delegate:self hud:nil hudTitled:nil];
+                                                           [self deleteFile:self.metadataDetail];
                                                        }]];
     
     [alertController addAction: [UIAlertAction actionWithTitle:NSLocalizedString(@"_cancel_", nil)

+ 1 - 2
iOSClient/Main/CCMain.m

@@ -37,7 +37,7 @@
 #import "NCNetworkingEndToEnd.h"
 #import "PKDownloadButton.h"
 
-@interface CCMain () <CCActionsDeleteDelegate, CCActionsRenameDelegate, CCActionsSearchDelegate, CCActionsSettingFavoriteDelegate, UITextViewDelegate, createFormUploadAssetsDelegate, MGSwipeTableCellDelegate, CCLoginDelegate, CCLoginDelegateWeb>
+@interface CCMain () <CCActionsRenameDelegate, CCActionsSearchDelegate, CCActionsSettingFavoriteDelegate, UITextViewDelegate, createFormUploadAssetsDelegate, MGSwipeTableCellDelegate, CCLoginDelegate, CCLoginDelegateWeb>
 {
     AppDelegate *appDelegate;
     
@@ -1865,7 +1865,6 @@
     }
 }
 
-
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ===== Rename / Move =====
 #pragma --------------------------------------------------------------------------------------------