From cad34253272bf823a53eb1b48a3ae6e7c1d69f57 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 3 Aug 2022 17:13:01 -0700 Subject: [PATCH] MessagesList: Also adds support for afterMessageGUID --- .../Operations/MBIMMessagesListOperation.m | 59 ++++++++++++++++--- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/kordophone/Bridge/Operations/MBIMMessagesListOperation.m b/kordophone/Bridge/Operations/MBIMMessagesListOperation.m index 4b24271..5126825 100644 --- a/kordophone/Bridge/Operations/MBIMMessagesListOperation.m +++ b/kordophone/Bridge/Operations/MBIMMessagesListOperation.m @@ -15,6 +15,11 @@ #define kDefaultMessagesLimit 75 +@interface IMChat (MBIMSafeMessagesLoading) +- (void)load:(NSUInteger)number messagesBeforeGUID:(NSString *)beforeMessageGUID; +- (void)load:(NSUInteger)number messagesAfterGUID:(NSString *)afterMessageGUID; +@end + @implementation MBIMMessagesListOperation + (void)load { [super load]; } @@ -45,6 +50,12 @@ } NSString *beforeMessageGUID = [self valueForQueryItemWithName:@"beforeMessageGUID"]; + NSString *afterMessageGUID = [self valueForQueryItemWithName:@"afterMessageGUID"]; + + if (beforeMessageGUID && afterMessageGUID) { + response = [[MBIMErrorResponse alloc] initWithErrorCode:500 message:@"Cannot provide both beforeMessageGUID and afterMessageGUID params."]; + break; + } if (!guid) { response = [[MBIMErrorResponse alloc] initWithErrorCode:500 message:@"No GUID provided."]; @@ -67,23 +78,25 @@ } if (beforeMessageGUID) { - if ([chat respondsToSelector:@selector(loadMessagesBeforeAndAfterGUID:numberOfMessagesToLoadBeforeGUID:numberOfMessagesToLoadAfterGUID:loadImmediately:threadIdentifier:)]) { - [chat loadMessagesBeforeAndAfterGUID:beforeMessageGUID numberOfMessagesToLoadBeforeGUID:limit numberOfMessagesToLoadAfterGUID:0 loadImmediately:YES threadIdentifier:nil]; - } else { - [chat loadMessagesBeforeAndAfterGUID:beforeMessageGUID numberOfMessagesToLoadBeforeGUID:limit numberOfMessagesToLoadAfterGUID:0 loadImmediately:YES]; - } + [chat load:limit messagesBeforeGUID:beforeMessageGUID]; + } else if (afterMessageGUID) { + [chat load:limit messagesAfterGUID:afterMessageGUID]; } else { [chat loadMessagesBeforeDate:beforeDate limit:limit loadImmediately:YES]; } [[chat chatItems] enumerateMessagesWithOptions:0 usingBlock:^(IMMessage *message, BOOL *stop) { + // Assume "beforeMessageGUID" is exclusive if ([[message guid] isEqual:beforeMessageGUID]) { *stop = YES; return; } - NSDictionary *messageDict = [message mbim_dictionaryRepresentation]; - [messages addObject:messageDict]; + // Assume "afterMessageGUID" is exclusive. + if (![[message guid] isEqual:afterMessageGUID]) { + NSDictionary *messageDict = [message mbim_dictionaryRepresentation]; + [messages addObject:messageDict]; + } }]; }); } @@ -96,3 +109,35 @@ } @end + +@implementation IMChat (MBIMSafeMessagesLoading) + +- (id)_safe_loadMessagesBeforeAndAfterGUID:(NSString *)messagesGUID numberOfMessagesToLoadBeforeGUID:(NSUInteger)limitBefore numberOfMessagesToLoadAfterGUID:(NSUInteger)limitAfter loadImmediately:(BOOL)loadImmediately +{ + if ([self respondsToSelector:@selector(loadMessagesBeforeAndAfterGUID: + numberOfMessagesToLoadBeforeGUID: + numberOfMessagesToLoadAfterGUID: + loadImmediately:threadIdentifier:)]) { + return [self loadMessagesBeforeAndAfterGUID:messagesGUID + numberOfMessagesToLoadBeforeGUID:limitBefore + numberOfMessagesToLoadAfterGUID:limitAfter + loadImmediately:YES threadIdentifier:nil]; + } else { + return [self loadMessagesBeforeAndAfterGUID:messagesGUID + numberOfMessagesToLoadBeforeGUID:limitBefore + numberOfMessagesToLoadAfterGUID:limitAfter + loadImmediately:YES]; + } +} + +- (void)load:(NSUInteger)number messagesBeforeGUID:(NSString *)beforeMessageGUID +{ + [self _safe_loadMessagesBeforeAndAfterGUID:beforeMessageGUID numberOfMessagesToLoadBeforeGUID:number numberOfMessagesToLoadAfterGUID:0 loadImmediately:YES]; +} + +- (void)load:(NSUInteger)number messagesAfterGUID:(NSString *)afterMessageGUID +{ + [self _safe_loadMessagesBeforeAndAfterGUID:afterMessageGUID numberOfMessagesToLoadBeforeGUID:0 numberOfMessagesToLoadAfterGUID:number loadImmediately:YES]; +} + +@end