Kaynağa Gözat

readFolder add account

Marino Faggiana 6 yıl önce
ebeveyn
işleme
30e88b3572

+ 2 - 2
File Provider Extension/FileProviderEnumerator.swift

@@ -148,7 +148,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                 
                 if self.providerData.listServerUrlEtag[serverUrl] == nil || self.providerData.listServerUrlEtag[serverUrl] != metadata!.etag || metadatasFromDB == nil {
                     
-                    ocNetworking?.readFolder(serverUrl, depth: "1", account: self.providerData.account, success: { (metadatas, metadataFolder) in
+                    ocNetworking?.readFolder(serverUrl, depth: "1", account: self.providerData.account, success: { (account, metadatas, metadataFolder) in
                         
                         if metadataFolder != nil {
                             // Update directory etag
@@ -175,7 +175,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                         
                         self.selectFirstPageItems(metadatasFromDB, observer: observer)
                         
-                    }, failure: { (errorMessage, errorCode) in
+                    }, failure: { (account, errorMessage, errorCode) in
                         
                         self.selectFirstPageItems(metadatasFromDB, observer: observer)
                     })

+ 0 - 1
iOSClient/CCGlobal.h

@@ -227,7 +227,6 @@
 #define actionMiddlewarePing                            @"middlewarePing"
 #define actionMoveFileOrFolder                          @"moveFileOrFolder"
 #define actionReadFile                                  @"readFile"
-#define actionReadFolder                                @"readFolder"
 #define actionReadShareServer                           @"readShareServer"
 #define actionSearch                                    @"search"
 #define actionSetNotificationServer                     @"setNotificationServer"

+ 2 - 0
iOSClient/Favorites/CCFavorites.m

@@ -167,6 +167,7 @@
 
 - (void)addFavoriteFolder:(NSString *)serverUrl
 {
+    /*
     NSString *selector;
     CCMetadataNet *metadataNet = [[CCMetadataNet alloc] initWithAccount:appDelegate.activeAccount];
     
@@ -182,6 +183,7 @@
     metadataNet.serverUrl = serverUrl;
     
     [appDelegate addNetworkingOperationQueue:appDelegate.netQueue delegate:[CCSynchronize sharedSynchronize] metadataNet:metadataNet];
+    */
 }
 
 - (void)settingFavorite:(tableMetadata *)metadata favorite:(BOOL)favorite

+ 109 - 10
iOSClient/Main/CCMain.m

@@ -1316,17 +1316,116 @@
     
     _loadingFolder = YES;
     [self tableViewReloadData];
-        
-    CCMetadataNet *metadataNet = [[CCMetadataNet alloc] initWithAccount:appDelegate.activeAccount];
-
-    metadataNet.action = actionReadFolder;
-    metadataNet.date = [NSDate date];
-    metadataNet.depth = @"1";
-    metadataNet.priority = NSOperationQueuePriorityHigh;
-    metadataNet.selector = selectorReadFolder;
-    metadataNet.serverUrl = serverUrl;
     
-    [appDelegate addNetworkingOperationQueue:appDelegate.netQueue delegate:self metadataNet:metadataNet];
+    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:nil withUserID:nil withPassword:nil withUrl:nil];
+    [ocNetworking readFolder:serverUrl depth:@"1" account:appDelegate.activeAccount success:^(NSString *account, NSArray *metadatas, tableMetadata *metadataFolder) {
+        
+        tableAccount *tableAccount = [[NCManageDatabase sharedInstance] getAccountWithPredicate:[NSPredicate predicateWithFormat:@"account == %@", account]];
+        if (tableAccount == nil) {
+            return;
+        }
+        
+        // stoprefresh
+        [refreshControl endRefreshing];
+        
+        // save metadataFolder
+        _metadataFolder = metadataFolder;
+        
+        if (_isSearchMode == NO) {
+            
+            [[NCManageDatabase sharedInstance] setDirectoryWithServerUrl:serverUrl serverUrlTo:nil etag:metadataFolder.etag fileID:metadataFolder.fileID encrypted:metadataFolder.e2eEncrypted account:account];
+            [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND (status == %d OR status == %d)", account, serverUrl, k_metadataStatusNormal, k_metadataStatusHide]];
+            [[NCManageDatabase sharedInstance] setDateReadDirectoryWithServerUrl:serverUrl account:account];
+        }
+        
+        NSArray *metadatasInDownload = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND (status == %d OR status == %d OR status == %d OR status == %d)", account, serverUrl, k_metadataStatusWaitDownload, k_metadataStatusInDownload, k_metadataStatusDownloading, k_metadataStatusDownloadError] sorted:nil ascending:NO];
+        
+        // insert in Database
+        NSMutableArray *metadatasToInsertInDB = (NSMutableArray *)[[NCManageDatabase sharedInstance] addMetadatas:metadatas];
+        // insert in Database the /
+        if (metadataFolder != nil) {
+            (void)[[NCManageDatabase sharedInstance] addMetadata:metadataFolder];
+        }
+        // reinsert metadatas in Download
+        if (metadatasInDownload) {
+            (void)[[NCManageDatabase sharedInstance] addMetadatas:metadatasInDownload];
+        }
+        
+        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
+            
+            // File is changed ??
+            if (!_isSearchMode && metadatasToInsertInDB)
+                [[CCSynchronize sharedSynchronize] verifyChangeMedatas:metadatasToInsertInDB serverUrl:serverUrl account:account withDownload:NO];
+        });
+        
+        // Search Mode
+        if (_isSearchMode) {
+            
+            // Fix managed -> Unmanaged _searchResultMetadatas
+            if (metadatasToInsertInDB)
+                _searchResultMetadatas = [[NSMutableArray alloc] initWithArray:metadatasToInsertInDB];
+            
+            [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:serverUrl fileID:nil action:k_action_NULL];
+        }
+        
+        // this is the same directory
+        if ([serverUrl isEqualToString:_serverUrl] && !_isSearchMode) {
+            
+            // reload
+            [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:serverUrl fileID:nil action:k_action_NULL];
+            
+            // Enable change user
+            [_imageTitleHome setUserInteractionEnabled:YES];
+            
+            _loadingFolder = NO;
+            [self tableViewReloadData];
+        }
+        
+        // E2EE Is encrypted folder get metadata
+        if (_metadataFolder.e2eEncrypted) {
+            NSString *metadataFolderFileID = metadataFolder.fileID;
+            // Read Metadata
+            if ([CCUtility isEndToEndEnabled:account]) {
+                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
+                    NSString *metadata;
+                    NSError *error = [[NCNetworkingEndToEnd sharedManager] getEndToEndMetadata:&metadata fileID:metadataFolderFileID user:tableAccount.user userID:tableAccount.userID password:tableAccount.password url:tableAccount.url];
+                    dispatch_async(dispatch_get_main_queue(), ^{
+                        if (error) {
+                            if (error.code != 404)
+                                [appDelegate messageNotification:@"_e2e_error_get_metadata_" description:error.localizedDescription visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:error.code];
+                        } else {
+                            if ([[NCEndToEndMetadata sharedInstance] decoderMetadata:metadata privateKey:[CCUtility getEndToEndPrivateKey:account] serverUrl:self.serverUrl account:account url:tableAccount.url] == false)
+                                [appDelegate messageNotification:@"_error_e2ee_" description:@"_e2e_error_decode_metadata_" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:error.code];
+                            else
+                                [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:serverUrl fileID:nil action:k_action_NULL];
+                        }
+                    });
+                });
+            } else {
+                [appDelegate messageNotification:@"_info_" description:@"_e2e_goto_settings_for_enable_" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeInfo errorCode:0];
+            }
+        }
+        
+        // rewrite title
+        [self setTitle];
+        
+    } failure:^(NSString *account, NSString *message, NSInteger errorCode) {
+        
+        _loadingFolder = NO;
+        
+        // Unauthorized
+        if (errorCode == kOCErrorServerUnauthorized) {
+            
+            [appDelegate openLoginView:self loginType:k_login_Modify_Password selector:k_intro_login];
+       
+        } else {
+        
+            [self tableViewReloadData];
+            [_imageTitleHome setUserInteractionEnabled:YES];
+            [appDelegate messageNotification:@"_error_" description:message visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:errorCode];
+            [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:serverUrl fileID:nil action:k_action_NULL];
+        }
+    }];
 }
 
 #pragma mark -

+ 17 - 16
iOSClient/Move/CCMove.m

@@ -299,29 +299,31 @@
 
 - (void)readFolder
 {
-    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:activeUser withUserID:activeUserID withPassword:activePassword withUrl:activeUrl];
-
-    [ocNetworking readFolder:_serverUrl depth:@"1" account:activeAccount success:^(NSArray *metadatas, tableMetadata *metadataFolder) {
+    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:nil withUserID:nil withPassword:nil withUrl:nil];
+    [ocNetworking readFolder:_serverUrl depth:@"1" account:activeAccount success:^(NSString *account, NSArray *metadatas, tableMetadata *metadataFolder) {
         
-        // Update directory etag
-        [[NCManageDatabase sharedInstance] setDirectoryWithServerUrl:_serverUrl serverUrlTo:nil etag:metadataFolder.etag fileID:metadataFolder.fileID encrypted:metadataFolder.e2eEncrypted account:activeAccount];
-        [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND (status == %d OR status == %d)", activeAccount, _serverUrl, k_metadataStatusNormal, k_metadataStatusHide]];
-        [[NCManageDatabase sharedInstance] setDateReadDirectoryWithServerUrl:_serverUrl account:activeAccount];
+        if ([account isEqualToString:activeAccount]) {
         
-        NSArray *metadatasInDownload = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND (status == %d OR status == %d OR status == %d OR status == %d)", activeAccount, _serverUrl, k_metadataStatusWaitDownload, k_metadataStatusInDownload, k_metadataStatusDownloading, k_metadataStatusDownloadError] sorted:nil ascending:NO];
+            // Update directory etag
+            [[NCManageDatabase sharedInstance] setDirectoryWithServerUrl:_serverUrl serverUrlTo:nil etag:metadataFolder.etag fileID:metadataFolder.fileID encrypted:metadataFolder.e2eEncrypted account:activeAccount];
+            [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND (status == %d OR status == %d)", activeAccount, _serverUrl, k_metadataStatusNormal, k_metadataStatusHide]];
+            [[NCManageDatabase sharedInstance] setDateReadDirectoryWithServerUrl:_serverUrl account:activeAccount];
         
-        // insert in Database
-        (void)[[NCManageDatabase sharedInstance] addMetadatas:metadatas];
-        // reinsert metadatas in Download
-        if (metadatasInDownload) {
-            (void)[[NCManageDatabase sharedInstance] addMetadatas:metadatasInDownload];
-        }
+            NSArray *metadatasInDownload = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND (status == %d OR status == %d OR status == %d OR status == %d)", activeAccount, _serverUrl, k_metadataStatusWaitDownload, k_metadataStatusInDownload, k_metadataStatusDownloading, k_metadataStatusDownloadError] sorted:nil ascending:NO];
         
+            // insert in Database
+            (void)[[NCManageDatabase sharedInstance] addMetadatas:metadatas];
+            // reinsert metadatas in Download
+            if (metadatasInDownload) {
+                (void)[[NCManageDatabase sharedInstance] addMetadatas:metadatasInDownload];
+            }
+        }
+     
         _loadingFolder = NO;
         
         [self.tableView reloadData];
         
-    } failure:^(NSString *message, NSInteger errorCode) {
+    } failure:^(NSString *account, NSString *message, NSInteger errorCode) {
         
         _loadingFolder = NO;
         self.move.enabled = NO;
@@ -334,7 +336,6 @@
         }]];
         
         [self presentViewController:alertController animated:YES completion:nil];
-        
     }];
 
     _loadingFolder = YES;

+ 1 - 3
iOSClient/Networking/OCNetworking.h

@@ -55,7 +55,7 @@
 - (void)downloadPreviewWithMetadata:(tableMetadata*)metadata withWidth:(CGFloat)width andHeight:(CGFloat)height completion:(void (^)(NSString *message, NSInteger errorCode))completion;
 - (void)downloadPreviewTrashWithFileID:(NSString *)fileID fileName:(NSString *)fileName account:(NSString *)account completion:(void (^)(NSString *account, NSString *message, NSInteger errorCode))completion;
 
-- (void)readFolder:(NSString *)serverUrl depth:(NSString *)depth account:(NSString *)account success:(void(^)(NSArray *metadatas, tableMetadata *metadataFolder))success failure:(void (^)(NSString *message, NSInteger errorCode))failure;
+- (void)readFolder:(NSString *)serverUrl depth:(NSString *)depth account:(NSString *)account success:(void(^)(NSString *account, NSArray *metadatas, tableMetadata *metadataFolder))success failure:(void (^)(NSString *account, NSString *message, NSInteger errorCode))failure;
 
 - (void)readFile:(NSString *)fileName serverUrl:(NSString *)serverUrl account:(NSString *)account success:(void(^)(tableMetadata *metadata))success failure:(void (^)(NSString *message, NSInteger errorCode))failure;
 
@@ -93,8 +93,6 @@
 
 @optional
 
-- (void)readFolderSuccessFailure:(CCMetadataNet *)metadataNet metadataFolder:(tableMetadata *)metadataFolder metadatas:(NSArray *)metadatas message:(NSString *)message errorCode:(NSInteger)errorCode;
-
 - (void)deleteFileOrFolderSuccessFailure:(CCMetadataNet *)metadataNet message:(NSString *)message errorCode:(NSInteger)errorCode;
 
 - (void)moveSuccess:(CCMetadataNet *)metadataNet;

+ 59 - 81
iOSClient/Networking/OCNetworking.m

@@ -528,118 +528,96 @@
 #pragma mark ===== Read Folder =====
 #pragma --------------------------------------------------------------------------------------------
 
-- (void)readFolder
-{
-    [self readFolder:_metadataNet.serverUrl depth:_metadataNet.depth account:_metadataNet.account success:^(NSArray *metadatas, tableMetadata *metadataFolder) {
-                
-        if ([self.delegate respondsToSelector:@selector(readFolderSuccessFailure:metadataFolder:metadatas:message:errorCode:)])
-            [self.delegate readFolderSuccessFailure:_metadataNet metadataFolder:metadataFolder metadatas:metadatas message:nil errorCode:0];
-        
-        [self complete];
-        
-    } failure:^(NSString *message, NSInteger errorCode) {
-        
-        if ([self.delegate respondsToSelector:@selector(readFolderSuccessFailure:metadataFolder:metadatas:message:errorCode:)])
-            [self.delegate readFolderSuccessFailure:_metadataNet metadataFolder:nil metadatas:nil message:message errorCode:errorCode];
-        
-        [self complete];
-    }];
-}
-
-- (void)readFolder:(NSString *)serverUrl depth:(NSString *)depth account:(NSString *)account success:(void(^)(NSArray *metadatas, tableMetadata *metadataFolder))success failure:(void (^)(NSString *message, NSInteger errorCode))failure
+- (void)readFolder:(NSString *)serverUrl depth:(NSString *)depth account:(NSString *)account success:(void(^)(NSString *account, NSArray *metadatas, tableMetadata *metadataFolder))success failure:(void (^)(NSString *account, NSString *message, NSInteger errorCode))failure
 {
+    tableAccount *tableAccount = [[NCManageDatabase sharedInstance] getAccountWithPredicate:[NSPredicate predicateWithFormat:@"account == %@", account]];
+    if (tableAccount == nil) {
+        failure(account, NSLocalizedString(@"_error_user_not_available_", nil), k_CCErrorUserNotAvailble);
+    }
+    
     OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
 
-    [communication setCredentialsWithUser:_activeUser andUserID:_activeUserID andPassword:_activePassword];
+    [communication setCredentialsWithUser:tableAccount.user andUserID:tableAccount.userID andPassword:tableAccount.password];
     [communication setUserAgent:[CCUtility getUserAgent]];
     
     [communication readFolder:serverUrl depth:depth withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *token) {
         
-        // Test active account
-        tableAccount *recordAccount = [[NCManageDatabase sharedInstance] getAccountActive];
-        if (![recordAccount.account isEqualToString:account]) {
-            
-            failure(NSLocalizedString(@"_error_user_not_available_", nil), k_CCErrorUserNotAvailble);
-            
-        } else {
-            
-            // Check items > 0
-            if ([items count] == 0) {
+        // Check items > 0
+        if ([items count] == 0) {
                 
 #ifndef EXTENSION
-                AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
+            AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
                 
-                [appDelegate messageNotification:@"Server error" description:@"Read Folder WebDAV : [items NULL] please fix" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:k_CCErrorInternalError];
+            [appDelegate messageNotification:@"Server error" description:@"Read Folder WebDAV : [items NULL] please fix" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:k_CCErrorInternalError];
 #endif
-                failure(NSLocalizedString(@"Read Folder WebDAV : [items NULL] please fix", nil), k_CCErrorInternalError);
+            failure(account, NSLocalizedString(@"Read Folder WebDAV : [items NULL] please fix", nil), k_CCErrorInternalError);
 
-            } else {
+        } else {
                 
-                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
+            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                 
-                    BOOL showHiddenFiles = [CCUtility getShowHiddenFiles];
-                    BOOL isFolderEncrypted = [CCUtility isFolderEncrypted:serverUrl account:account];
+                BOOL showHiddenFiles = [CCUtility getShowHiddenFiles];
+                BOOL isFolderEncrypted = [CCUtility isFolderEncrypted:serverUrl account:account];
                     
-                    // directory [0]
-                    OCFileDto *itemDtoFolder = [items objectAtIndex:0];
-                    //NSDate *date = [NSDate dateWithTimeIntervalSince1970:itemDtoDirectory.date];
+                // directory [0]
+                OCFileDto *itemDtoFolder = [items objectAtIndex:0];
+                //NSDate *date = [NSDate dateWithTimeIntervalSince1970:itemDtoDirectory.date];
                     
-                    NSMutableArray *metadatas = [NSMutableArray new];
-                    tableMetadata *metadataFolder = [tableMetadata new];
+                NSMutableArray *metadatas = [NSMutableArray new];
+                tableMetadata *metadataFolder = [tableMetadata new];
                     
-                    NSString *autoUploadFileName = [[NCManageDatabase sharedInstance] getAccountAutoUploadFileName];
-                    NSString *autoUploadDirectory = [[NCManageDatabase sharedInstance] getAccountAutoUploadDirectory:_activeUrl];
+                NSString *autoUploadFileName = [[NCManageDatabase sharedInstance] getAccountAutoUploadFileName];
+                NSString *autoUploadDirectory = [[NCManageDatabase sharedInstance] getAccountAutoUploadDirectory:tableAccount.url];
                     
-                    NSString *serverUrlFolder;
+                NSString *serverUrlFolder;
 
-                    // Metadata . (self Folder)
-                    if ([serverUrl isEqualToString:[CCUtility getHomeServerUrlActiveUrl:_activeUrl]]) {
+                // Metadata . (self Folder)
+                if ([serverUrl isEqualToString:[CCUtility getHomeServerUrlActiveUrl:tableAccount.url]]) {
                         
-                        // root folder
-                        serverUrlFolder = k_serverUrl_root;
-                        metadataFolder = [CCUtility trasformedOCFileToCCMetadata:itemDtoFolder fileName:@"." serverUrl:serverUrlFolder autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:account isFolderEncrypted:isFolderEncrypted];
+                    // root folder
+                    serverUrlFolder = k_serverUrl_root;
+                    metadataFolder = [CCUtility trasformedOCFileToCCMetadata:itemDtoFolder fileName:@"." serverUrl:serverUrlFolder autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:account isFolderEncrypted:isFolderEncrypted];
                         
-                    } else {
+                } else {
                         
-                        serverUrlFolder = [CCUtility deletingLastPathComponentFromServerUrl:serverUrl];
-                        metadataFolder = [CCUtility trasformedOCFileToCCMetadata:itemDtoFolder fileName:[serverUrl lastPathComponent] serverUrl:serverUrlFolder autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:account isFolderEncrypted:isFolderEncrypted];
-                    }
+                    serverUrlFolder = [CCUtility deletingLastPathComponentFromServerUrl:serverUrl];
+                    metadataFolder = [CCUtility trasformedOCFileToCCMetadata:itemDtoFolder fileName:[serverUrl lastPathComponent] serverUrl:serverUrlFolder autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:account isFolderEncrypted:isFolderEncrypted];
+                }
                     
-                    // Add metadata folder
-                    (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDtoFolder.isEncrypted favorite:itemDtoFolder.isFavorite fileID:itemDtoFolder.ocId permissions:itemDtoFolder.permissions serverUrl:serverUrl account:account];
+                // Add metadata folder
+                (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDtoFolder.isEncrypted favorite:itemDtoFolder.isFavorite fileID:itemDtoFolder.ocId permissions:itemDtoFolder.permissions serverUrl:serverUrl account:account];
 
-                    NSArray *itemsSortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
+                NSArray *itemsSortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
                         
-                        NSString *first = [(OCFileDto*)a fileName];
-                        NSString *second = [(OCFileDto*)b fileName];
-                        return [[first lowercaseString] compare:[second lowercaseString]];
-                    }];
+                    NSString *first = [(OCFileDto*)a fileName];
+                    NSString *second = [(OCFileDto*)b fileName];
+                    return [[first lowercaseString] compare:[second lowercaseString]];
+                }];
                     
-                    for (NSUInteger i=1; i < [itemsSortedArray count]; i++) {
+                for (NSUInteger i=1; i < [itemsSortedArray count]; i++) {
                         
-                        OCFileDto *itemDto = [itemsSortedArray objectAtIndex:i];
-                        NSString *fileName = [itemDto.fileName stringByReplacingOccurrencesOfString:@"/" withString:@""];
+                    OCFileDto *itemDto = [itemsSortedArray objectAtIndex:i];
+                    NSString *fileName = [itemDto.fileName stringByReplacingOccurrencesOfString:@"/" withString:@""];
                         
-                        // Skip hidden files
-                        if (fileName.length > 0) {
-                            if (!showHiddenFiles && [[fileName substringToIndex:1] isEqualToString:@"."])
-                                continue;
-                        } else {
+                    // Skip hidden files
+                    if (fileName.length > 0) {
+                        if (!showHiddenFiles && [[fileName substringToIndex:1] isEqualToString:@"."])
                             continue;
-                        }
-                        
-                        if (itemDto.isDirectory) {
-                            (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDto.isEncrypted favorite:itemDto.isFavorite fileID:itemDto.ocId permissions:itemDto.permissions serverUrl:[CCUtility stringAppendServerUrl:serverUrl addFileName:fileName] account:account];
-                        }
+                    } else {
+                        continue;
+                    }
                         
-                        [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileName:itemDto.fileName serverUrl:serverUrl autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:account isFolderEncrypted:isFolderEncrypted]];
+                    if (itemDto.isDirectory) {
+                        (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDto.isEncrypted favorite:itemDto.isFavorite fileID:itemDto.ocId permissions:itemDto.permissions serverUrl:[CCUtility stringAppendServerUrl:serverUrl addFileName:fileName] account:account];
                     }
+                        
+                    [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileName:itemDto.fileName serverUrl:serverUrl autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:account isFolderEncrypted:isFolderEncrypted]];
+                }
                     
-                    dispatch_async(dispatch_get_main_queue(), ^{
-                        success(metadatas, metadataFolder);
-                    });
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    success(account, metadatas, metadataFolder);
                 });
-            }
+            });
         }
     
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
@@ -661,9 +639,9 @@
             [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
         
         // Activity
-        [[NCManageDatabase sharedInstance] addActivityClient:serverUrl fileID:@"" action:k_activityDebugActionReadFolder selector:@"" note:[error.userInfo valueForKey:@"NSLocalizedDescription"] type:k_activityTypeFailure verbose:k_activityVerboseHigh activeUrl:_activeUrl];
+        [[NCManageDatabase sharedInstance] addActivityClient:serverUrl fileID:@"" action:k_activityDebugActionReadFolder selector:@"" note:[error.userInfo valueForKey:@"NSLocalizedDescription"] type:k_activityTypeFailure verbose:k_activityVerboseHigh activeUrl:tableAccount.url];
 
-        failure(message, errorCode);
+        failure(account, message, errorCode);
     }];
 }
 

+ 16 - 14
iOSClient/Select/NCSelect.swift

@@ -475,22 +475,24 @@ class NCSelect: UIViewController ,UICollectionViewDataSource, UICollectionViewDe
         networkInProgress = true
         collectionView.reloadData()
         
-        let ocNetworking = OCnetworking.init(delegate: self, metadataNet: nil, withUser: appDelegate.activeUser, withUserID: appDelegate.activeUserID, withPassword: appDelegate.activePassword, withUrl: appDelegate.activeUrl)
-        
-        ocNetworking?.readFolder(serverUrl, depth: "1", account: appDelegate.activeAccount, success: { (metadatas, metadataFolder) in
-            
-            self.metadataFolder = metadataFolder
-            
-            // Update directory etag
-            NCManageDatabase.sharedInstance.setDirectory(serverUrl: self.serverUrl, serverUrlTo: nil, etag: metadataFolder?.etag, fileID: metadataFolder?.fileID, encrypted: metadataFolder!.e2eEncrypted, account: self.appDelegate.activeAccount)
-            NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND (status == %d OR status == %d)", self.appDelegate.activeAccount ,self.serverUrl, k_metadataStatusNormal, k_metadataStatusHide))
-            NCManageDatabase.sharedInstance.setDateReadDirectory(serverUrl: self.serverUrl, account: self.appDelegate.activeAccount)
+        let ocNetworking = OCnetworking.init(delegate: self, metadataNet: nil, withUser: nil, withUserID: nil, withPassword: nil, withUrl: nil)
+        ocNetworking?.readFolder(serverUrl, depth: "1", account: appDelegate.activeAccount, success: { (account, metadatas, metadataFolder) in
             
-            _ = NCManageDatabase.sharedInstance.addMetadatas(metadatas as! [tableMetadata])
+            if account == self.appDelegate.activeAccount {
             
-            if let metadatasInDownload = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND (status == %d OR status == %d OR status == %d OR status == %d)", self.appDelegate.activeAccount ,self.serverUrl, k_metadataStatusWaitDownload, k_metadataStatusInDownload, k_metadataStatusDownloading, k_metadataStatusDownloadError), sorted: nil, ascending: false) {
+                self.metadataFolder = metadataFolder
                 
-                _ = NCManageDatabase.sharedInstance.addMetadatas(metadatasInDownload)
+                // Update directory etag
+                NCManageDatabase.sharedInstance.setDirectory(serverUrl: self.serverUrl, serverUrlTo: nil, etag: metadataFolder?.etag, fileID: metadataFolder?.fileID, encrypted: metadataFolder!.e2eEncrypted, account: self.appDelegate.activeAccount)
+                NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND (status == %d OR status == %d)", self.appDelegate.activeAccount ,self.serverUrl, k_metadataStatusNormal, k_metadataStatusHide))
+                NCManageDatabase.sharedInstance.setDateReadDirectory(serverUrl: self.serverUrl, account: self.appDelegate.activeAccount)
+                
+                _ = NCManageDatabase.sharedInstance.addMetadatas(metadatas as! [tableMetadata])
+                
+                if let metadatasInDownload = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND (status == %d OR status == %d OR status == %d OR status == %d)", self.appDelegate.activeAccount ,self.serverUrl, k_metadataStatusWaitDownload, k_metadataStatusInDownload, k_metadataStatusDownloading, k_metadataStatusDownloadError), sorted: nil, ascending: false) {
+                    
+                    _ = NCManageDatabase.sharedInstance.addMetadatas(metadatasInDownload)
+                }
             }
             
             DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
@@ -498,7 +500,7 @@ class NCSelect: UIViewController ,UICollectionViewDataSource, UICollectionViewDe
                 self.loadDatasource(withLoadFolder: false)
             }
             
-        }, failure: { (message, errorCode) in
+        }, failure: { (account, message, errorCode) in
                         
             self.appDelegate.messageNotification("_error_", description: message, visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.error, errorCode: errorCode)
             

+ 111 - 132
iOSClient/Synchronize/CCSynchronize.m

@@ -60,167 +60,146 @@
 
 - (void)readFolder:(NSString *)serverUrl selector:(NSString *)selector
 {
-    CCMetadataNet *metadataNet = [[CCMetadataNet alloc] initWithAccount:appDelegate.activeAccount];
-    
-    metadataNet.action = actionReadFolder;
-    metadataNet.depth = @"1";
-    metadataNet.priority = NSOperationQueuePriorityLow;
-    metadataNet.selector = selector;
-    metadataNet.serverUrl = serverUrl;
-    
-    [appDelegate addNetworkingOperationQueue:appDelegate.netQueue delegate:self metadataNet:metadataNet];
-    
-    NSLog(@"[LOG] %@ directory : %@", selector, serverUrl);
-}
-
-// MULTI THREAD
-- (void)readFolderSuccessFailure:(CCMetadataNet *)metadataNet metadataFolder:(tableMetadata *)metadataFolder metadatas:(NSArray *)metadatas message:(NSString *)message errorCode:(NSInteger)errorCode
-{
-    // Check Active Account
-    if (![metadataNet.account isEqualToString:appDelegate.activeAccount])
-        return;
-    
-    // ERROR
-    if (errorCode != 0) {
+    OCnetworking *ocNetworking = [[OCnetworking alloc] initWithDelegate:nil metadataNet:nil withUser:nil withUserID:nil withPassword:nil withUrl:nil];
+    [ocNetworking readFolder:serverUrl depth:@"1" account:appDelegate.activeAccount success:^(NSString *account, NSArray *metadatas, tableMetadata *metadataFolder) {
         
-        // Folder not present, remove it
-        if (errorCode == 404) {
-            
-            [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:metadataNet.serverUrl account:metadataNet.account];
-            [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:metadataNet.serverUrl fileID:nil action:k_action_NULL];
+        tableAccount *tableAccount = [[NCManageDatabase sharedInstance] getAccountWithPredicate:[NSPredicate predicateWithFormat:@"account == %@", account]];
+        if (tableAccount == nil) {
+            return;
         }
         
-        return;
-    }
-    
-    // Add/update self Folder
-    if (!metadataFolder || !metadatas || [metadatas count] == 0) {
-        if (metadataFolder.serverUrl != nil) {
-            [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:metadataFolder.serverUrl fileID:nil action:k_action_NULL];
+        // Add/update self Folder
+        if (!metadataFolder || !metadatas || [metadatas count] == 0) {
+            if (metadataFolder.serverUrl != nil) {
+                [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:metadataFolder.serverUrl fileID:nil action:k_action_NULL];
+            }
+            return;
         }
-        return;
-    }
-    
-    // Add metadata and update etag Directory
-    (void)[[NCManageDatabase sharedInstance] addMetadata:metadataFolder];
-    [[NCManageDatabase sharedInstance] setDirectoryWithServerUrl:metadataNet.serverUrl serverUrlTo:nil etag:metadataFolder.etag fileID:metadataFolder.fileID encrypted:metadataFolder.e2eEncrypted account:appDelegate.activeAccount];
-
-    // reload folder ../ *
-    [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:metadataFolder.serverUrl fileID:nil action:k_action_NULL];
-    
-    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
-        
-        NSMutableArray *metadatasForVerifyChange = [NSMutableArray new];
-        NSMutableArray *addMetadatas = [NSMutableArray new];
-    
-        NSArray *recordsInSessions = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND session != ''", metadataNet.account, metadataNet.serverUrl] sorted:nil ascending:NO];
-        
-        // ----- Test : (DELETE) -----
         
-        NSMutableArray *metadatasNotPresents = [NSMutableArray new];
+        // Add metadata and update etag Directory
+        (void)[[NCManageDatabase sharedInstance] addMetadata:metadataFolder];
+        [[NCManageDatabase sharedInstance] setDirectoryWithServerUrl:serverUrl serverUrlTo:nil etag:metadataFolder.etag fileID:metadataFolder.fileID encrypted:metadataFolder.e2eEncrypted account:account];
         
-        NSArray *tableMetadatas = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND session == ''", metadataNet.account, metadataNet.serverUrl] sorted:nil ascending:NO];
+        // reload folder ../ *
+        [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:metadataFolder.serverUrl fileID:nil action:k_action_NULL];
         
-        for (tableMetadata *record in tableMetadatas) {
+        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
             
-            BOOL fileIDFound = NO;
+            NSMutableArray *metadatasForVerifyChange = [NSMutableArray new];
+            NSMutableArray *addMetadatas = [NSMutableArray new];
             
-            for (tableMetadata *metadata in metadatas) {
-                
-                if ([record.fileID isEqualToString:metadata.fileID]) {
-                    fileIDFound = YES;
-                    break;
-                }
-            }
+            NSArray *recordsInSessions = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND session != ''", account, serverUrl] sorted:nil ascending:NO];
             
-            if (!fileIDFound)
-                [metadatasNotPresents addObject:record];
-        }
-        
-        // delete metadata not present
-        for (tableMetadata *metadata in metadatasNotPresents) {
-        
-            [[NSFileManager defaultManager] removeItemAtPath:[CCUtility getDirectoryProviderStorageFileID:metadata.fileID] error:nil];
+            // ----- Test : (DELETE) -----
             
-            if (metadata.directory && metadataNet.serverUrl) {
-                
-                NSString *dirForDelete = [CCUtility stringAppendServerUrl:metadataNet.serverUrl addFileName:metadata.fileName];
-                
-                [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:dirForDelete account:metadata.account];
-            }
+            NSMutableArray *metadatasNotPresents = [NSMutableArray new];
             
-            [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-            [[NCManageDatabase sharedInstance] deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-            [[NCManageDatabase sharedInstance] deletePhotosWithFileID:metadata.fileID];
-        }
-        
-        dispatch_async(dispatch_get_main_queue(), ^{
-            if ([metadatasNotPresents count] > 0)
-                [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:metadataNet.serverUrl fileID:nil action:k_action_NULL];
-        });
-        
-        // ----- Test : (MODIFY) -----
-        
-        for (tableMetadata *metadata in metadatas) {
+            NSArray *tableMetadatas = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@ AND session == ''", account, serverUrl] sorted:nil ascending:NO];
             
-            // RECURSIVE DIRECTORY MODE
-            if (metadata.directory) {
+            for (tableMetadata *record in tableMetadatas) {
                 
-                NSString *serverUrl = [CCUtility stringAppendServerUrl:metadataNet.serverUrl addFileName:metadata.fileName];
+                BOOL fileIDFound = NO;
                 
-                // Verify if do not exists this Metadata
-                tableMetadata *result = [[NCManageDatabase sharedInstance] getMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-
-                if (!result)
-                    (void)[[NCManageDatabase sharedInstance] addMetadata:metadata];
-              
-                    // Load if different etag
-                    //tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND serverUrl == %@", metadataNet.account, serverUrl]];
+                for (tableMetadata *metadata in metadatas) {
+                    
+                    if ([record.fileID isEqualToString:metadata.fileID]) {
+                        fileIDFound = YES;
+                        break;
+                    }
+                }
                 
-                    //if (![tableDirectory.etag isEqualToString:metadata.etag] || [metadataNet.selector isEqualToString:selectorReadFolderWithDownload]) {
-                                        
-                    //    [self readFolder:serverUrl selector:metadataNet.selector];
-                    //}
+                if (!fileIDFound)
+                    [metadatasNotPresents addObject:record];
+            }
+            
+            // delete metadata not present
+            for (tableMetadata *metadata in metadatasNotPresents) {
                 
-                [self readFolder:serverUrl selector:metadataNet.selector];
-                    
-            } else {
+                [[NSFileManager defaultManager] removeItemAtPath:[CCUtility getDirectoryProviderStorageFileID:metadata.fileID] error:nil];
                 
-                if ([metadataNet.selector isEqualToString:selectorReadFolderWithDownload]) {
+                if (metadata.directory && serverUrl) {
                     
-                    // It's in session
-                    BOOL recordInSession = NO;
-                    for (tableMetadata *record in recordsInSessions) {
-                        if ([record.fileID isEqualToString:metadata.fileID]) {
-                            recordInSession = YES;
-                            break;
-                        }
-                    }
+                    NSString *dirForDelete = [CCUtility stringAppendServerUrl:serverUrl addFileName:metadata.fileName];
                     
-                    if (recordInSession)
-                        continue;
-            
-                    // Ohhhh INSERT
-                    [metadatasForVerifyChange addObject:metadata];
+                    [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:dirForDelete account:metadata.account];
                 }
                 
-                if ([metadataNet.selector isEqualToString:selectorReadFolder]) {
-                    
+                [[NCManageDatabase sharedInstance] deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
+                [[NCManageDatabase sharedInstance] deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
+                [[NCManageDatabase sharedInstance] deletePhotosWithFileID:metadata.fileID];
+            }
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                if ([metadatasNotPresents count] > 0)
+                    [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:serverUrl fileID:nil action:k_action_NULL];
+            });
+            
+            // ----- Test : (MODIFY) -----
+            
+            for (tableMetadata *metadata in metadatas) {
+                
+                // RECURSIVE DIRECTORY MODE
+                if (metadata.directory) {
+                                        
                     // Verify if do not exists this Metadata
                     tableMetadata *result = [[NCManageDatabase sharedInstance] getMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
-
+                    
                     if (!result)
-                        [addMetadatas addObject:metadata];
+                        (void)[[NCManageDatabase sharedInstance] addMetadata:metadata];
+                    
+                    [self readFolder:[CCUtility stringAppendServerUrl:serverUrl addFileName:metadata.fileName] selector:selector];
+                    
+                } else {
+                    
+                    if ([selector isEqualToString:selectorReadFolderWithDownload]) {
+                        
+                        // It's in session
+                        BOOL recordInSession = NO;
+                        for (tableMetadata *record in recordsInSessions) {
+                            if ([record.fileID isEqualToString:metadata.fileID]) {
+                                recordInSession = YES;
+                                break;
+                            }
+                        }
+                        
+                        if (recordInSession)
+                            continue;
+                        
+                        // Ohhhh INSERT
+                        [metadatasForVerifyChange addObject:metadata];
+                    }
+                    
+                    if ([selector isEqualToString:selectorReadFolder]) {
+                        
+                        // Verify if do not exists this Metadata
+                        tableMetadata *result = [[NCManageDatabase sharedInstance] getMetadataWithPredicate:[NSPredicate predicateWithFormat:@"fileID == %@", metadata.fileID]];
+                        
+                        if (!result)
+                            [addMetadatas addObject:metadata];
+                    }
                 }
             }
-        }
+            
+            if ([addMetadatas count] > 0)
+                (void)[[NCManageDatabase sharedInstance] addMetadatas:addMetadatas];
+            
+            if ([metadatasForVerifyChange count] > 0)
+                [self verifyChangeMedatas:metadatasForVerifyChange serverUrl:serverUrl account:account withDownload:YES];
+        });
+            
+    } failure:^(NSString *account, NSString *message, NSInteger errorCode) {
         
-        if ([addMetadatas count] > 0)
-            (void)[[NCManageDatabase sharedInstance] addMetadatas:addMetadatas];
+        // Folder not present, remove it
+        if (errorCode == 404) {
+            [[NCManageDatabase sharedInstance] deleteDirectoryAndSubDirectoryWithServerUrl:serverUrl account:account];
+            [[NCMainCommon sharedInstance] reloadDatasourceWithServerUrl:serverUrl fileID:nil action:k_action_NULL];
+        }
         
-        if ([metadatasForVerifyChange count] > 0)
-            [self verifyChangeMedatas:metadatasForVerifyChange serverUrl:metadataNet.serverUrl account:metadataNet.account withDownload:YES];
-    });
+        return;
+    }];
+    
+    
+    
 }
 
 #pragma --------------------------------------------------------------------------------------------