From 54548c550ffa601bafe6e354f627100ecec5924e Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Fri, 4 Jun 2021 16:50:49 -0400 Subject: [PATCH] fix(mail): improve performance of listing all mailboxes --- SoObjects/Mailer/SOGoMailAccount.m | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/SoObjects/Mailer/SOGoMailAccount.m b/SoObjects/Mailer/SOGoMailAccount.m index 8a8796e0d..a1f29f6e5 100644 --- a/SoObjects/Mailer/SOGoMailAccount.m +++ b/SoObjects/Mailer/SOGoMailAccount.m @@ -429,15 +429,18 @@ static NSString *inboxFolderName = @"INBOX"; - (NSString *) _folderType: (NSString *) folderName flags: (NSMutableArray *) flags { + static NSDictionary *metadata = nil; NSString *folderType, *key; - NSDictionary *metadata; SOGoUserDefaults *ud; - ud = [[context activeUser] userDefaults]; - - metadata = [[[self imap4Connection] allFoldersMetadataForURL: [self imap4URL] - onlySubscribedFolders: [ud mailShowSubscribedFoldersOnly]] - objectForKey: @"list"]; + if (!metadata) + { + ud = [[context activeUser] userDefaults]; + metadata = [[[self imap4Connection] allFoldersMetadataForURL: [self imap4URL] + onlySubscribedFolders: [ud mailShowSubscribedFoldersOnly]] + objectForKey: @"list"]; + [metadata retain]; + } key = [NSString stringWithFormat: @"/%@", folderName]; [flags addObjectsFromArray: [metadata objectForKey: key]]; @@ -488,6 +491,7 @@ static NSString *inboxFolderName = @"INBOX"; parentIsOtherUsersFolder = NO; pathComponents = [folderPath pathComponents]; count = [pathComponents count]; + currentPath = @""; // Make sure all ancestors exist. // The variable folderPath is something like '/INBOX/Junk' so pathComponents becomes ('/', 'INBOX', 'Junk'). @@ -496,7 +500,10 @@ static NSString *inboxFolderName = @"INBOX"; { last = ((count - i) == 1); folder = nil; - currentPath = [[[pathComponents subarrayWithRange: NSMakeRange(0,i+1)] componentsJoinedByString: @"/"] substringFromIndex: 2]; + if ([currentPath length]) + currentPath = [NSString stringWithFormat: @"%@/%@", currentPath, [pathComponents objectAtIndex: i]]; + else + currentPath = [pathComponents objectAtIndex: i]; // Search for the current path in the children of the parent folder. // For the first iteration, take the parent folder passed as argument.