Private
Public Access
1
0
Files
Kordophone/kordophone/Bridge/MBIMUpdateQueue.m
2018-11-20 19:57:35 -07:00

97 lines
2.3 KiB
Objective-C

//
// MBIMUpdateQueue.m
// kordophoned
//
// Created by James Magahern on 11/16/18.
// Copyright © 2018 James Magahern. All rights reserved.
//
#import "MBIMUpdateQueue.h"
#import "IMMessageItem+Encoded.h"
#import "IMChat+Encoded.h"
@interface MBIMUpdateItem (/*INTERNAL*/)
@property (nonatomic, assign) NSUInteger messageSequenceNumber;
@end
@implementation MBIMUpdateQueue {
NSUInteger _messageSequenceNumber;
dispatch_queue_t _accessQueue;
NSMutableArray *_consumers;
}
+ (instancetype)sharedInstance
{
static MBIMUpdateQueue *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init
{
self = [super init];
if (self) {
_accessQueue = dispatch_queue_create("net.buzzert.MBIMUpdateQueue", DISPATCH_QUEUE_SERIAL);
_consumers = [[NSMutableArray alloc] init];
_messageSequenceNumber = 0;
}
return self;
}
- (void)addConsumer:(MBIMUpdateConsumer)consumer
{
__weak NSMutableArray *consumers = _consumers;
dispatch_async(_accessQueue, ^{
[consumers addObject:consumer];
});
}
- (void)removeConsumer:(MBIMUpdateConsumer)consumer
{
__weak NSMutableArray *consumers = _consumers;
dispatch_async(_accessQueue, ^{
[consumers removeObject:consumer];
});
}
- (void)enqueueUpdateItem:(MBIMUpdateItem *)item
{
_messageSequenceNumber++;
item.messageSequenceNumber = _messageSequenceNumber;
__weak NSMutableArray *consumers = _consumers;
dispatch_async(_accessQueue, ^{
for (MBIMUpdateConsumer consumer in consumers) {
consumer(item);
}
[consumers removeAllObjects];
});
}
@end
@implementation MBIMUpdateItem
- (NSDictionary *)dictionaryRepresentation
{
NSMutableDictionary *updateDict = [NSMutableDictionary dictionary];
updateDict[@"messageSequenceNumber"] = @(_messageSequenceNumber);
if ([self changedChat]) {
updateDict[@"conversation"] = [[self changedChat] mbim_dictionaryRepresentation];
}
if ([self addedMessage]) {
updateDict[@"message"] = [[self addedMessage] mbim_dictionaryRepresentation];
}
return updateDict;
}
@end