From 1ba1be9e31036a7f7fcb4d99fb35b6b10cdb6c28 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 29 Nov 2018 14:11:55 -0500 Subject: [PATCH] (fix) improve search operations and results fetching --- ActiveSync/SOGoActiveSyncDispatcher.m | 56 ++++++++++++++++++++++---- ActiveSync/SOGoMailObject+ActiveSync.m | 20 +++++++-- NEWS | 1 + 3 files changed, 66 insertions(+), 11 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index ab4157e01..4ebf68072 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1613,9 +1613,26 @@ void handle_eas_terminate(int signum) mailObject = [currentCollection lookupName: serverId inContext: context acquire: NO]; [s appendString: @""]; [s appendString: @"1"]; - [s appendFormat: @"%@", collectionId]; - [s appendFormat: @"%@", serverId]; + + if ([[[(id)[theDocumentElement getElementsByTagName: @"LongId"] lastObject] textValue] length]) + { + [s appendString: @"Email"]; + [s appendFormat: @"%@", [[(id)[theDocumentElement getElementsByTagName: @"LongId"] lastObject] textValue]]; + } + else + { + [s appendFormat: @"%@", collectionId]; + [s appendFormat: @"%@", serverId]; + } + [s appendString: @""]; + + if ([[theResponse headerForKey: @"Content-Type"] isEqualToString:@"application/vnd.ms-sync.multipart"]) + { + [context setObject: parts forKey: @"MultiParts"]; + [context setObject: partLength forKey: @"MultiPartsLen"]; + } + [s appendString: [mailObject activeSyncRepresentationInContext: context]]; } @@ -3049,12 +3066,14 @@ void handle_eas_terminate(int signum) SOGoMailObject *mailObject; SOGoUserFolder *userFolder; EOQualifier *qualifier; - NSArray *sortedUIDs; + NSArray *sortedUIDs, *a; NSMutableString *s; NSData *d; SOGoMicrosoftActiveSyncFolderType folderType; - int i, j, total; + int i, j, total, begin, startRange, endRange, maxResults, overallTotal; + + overallTotal = 0; // We build the qualifier and we launch our search operation qualifier = [self _qualifierFromMailboxSearchQuery: [(id)[theDocumentElement getElementsByTagName: @"Query"] lastObject]]; @@ -3072,6 +3091,16 @@ void handle_eas_terminate(int signum) [context setObject: @"8" forKey: @"MIMETruncation"]; + // We check for the maximum number of results to return. + a = [[[(id)[theDocumentElement getElementsByTagName: @"Range"] lastObject] textValue] componentsSeparatedByString: @"-"]; + startRange = [[a objectAtIndex: 0] intValue]; + begin = startRange; + endRange = [[a objectAtIndex: 1] intValue]; + maxResults = endRange - startRange; + + if (maxResults == 0) + maxResults = endRange = 99; + // FIXME: support more than one CollectionId tag + DeepTraversal folderId = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"Query"] lastObject] getElementsByTagName: @"CollectionId"] lastObject] textValue]; folderIdentifiers = [NSMutableArray array]; @@ -3134,7 +3163,15 @@ void handle_eas_terminate(int signum) sortOrdering: @"REVERSE ARRIVAL" threaded: NO]; total = [sortedUIDs count]; - for (j = 0; j < total; j++) + overallTotal+=total; + + if (total < startRange) + { + begin -= total; + continue;; + } + + for (j = begin; j < total && maxResults >= 0; j++) { itemId = [[sortedUIDs objectAtIndex: j] stringValue]; mailObject = [currentFolder lookupName: itemId inContext: context acquire: NO]; @@ -3142,6 +3179,8 @@ void handle_eas_terminate(int signum) if ([mailObject isKindOfClass: [NSException class]]) continue; + maxResults--; + [s appendString: @""]; [s appendFormat: @"%@+%@", folderId, itemId]; [s appendFormat: @"%@", folderId]; @@ -3152,8 +3191,11 @@ void handle_eas_terminate(int signum) } } - [s appendFormat: @"0-%d",(total ? total-1 : 0)]; - [s appendFormat: @"%d", total]; + if (overallTotal < startRange) + overallTotal = 0; + + [s appendFormat: @"%d-%d",(overallTotal ? startRange : 0), (overallTotal ? endRange - maxResults - 1 : 0)]; + [s appendFormat: @"%d", overallTotal]; [s appendString: @""]; [s appendString: @""]; [s appendString: @""]; diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index c120345bd..dfe407e72 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -1216,10 +1216,22 @@ struct GlobalObjectId { else [s appendFormat: @"%d", preferredBodyType]; - [s appendFormat: @"%d", truncated]; - [s appendFormat: @""]; - [s appendFormat: @"%@", content]; - [s appendFormat: @"%d", len]; + if ([[context objectForKey: @"MultiPartsLen"] isKindOfClass: [NSArray class]]) + { + [[context objectForKey: @"MultiPartsLen"] addObject: [NSNumber numberWithInteger: [sanitizedData length]]]; + [[context objectForKey: @"MultiParts"] appendData: sanitizedData]; + + [s appendFormat: @"%d", len]; + [s appendFormat: @"%d", [[context objectForKey: @"MultiPartsLen"] count]]; + } + else + { + [s appendFormat: @"%d", truncated]; + [s appendFormat: @""]; + [s appendFormat: @"%@", content]; + [s appendFormat: @"%d", len]; + } + [s appendString: @""]; } } diff --git a/NEWS b/NEWS index 4c5970b09..b69cd419c 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Bug fixes - [core] don't always fetch the sorting columns - [eas] strip '<>' from bodyId and when forwarding mails - [eas] fix search on for Outlook application (#4605 and #4607) + - [eas] improve search operations and results fetching 4.0.4 (2018-10-23) ------------------