CKKSProvideKeySetOperation.m   [plain text]



#if OCTAGON

#import "CKKSProvideKeySetOperation.h"

@interface CKKSProvideKeySetOperation ()
@property (nullable) CKKSCurrentKeySet* keyset;
@property dispatch_queue_t queue;

@property (nullable) NSOperation* startDependency;
@end

@implementation CKKSProvideKeySetOperation
@synthesize zoneName = _zoneName;
@synthesize keyset = _keyset;

- (instancetype)initWithZoneName:(NSString*)zoneName
{
    if((self = [super init])) {
        _zoneName = zoneName;
        _keyset = nil;
        _startDependency = [NSBlockOperation blockOperationWithBlock:^{}];
        _startDependency.name = @"key-set-provided";

        _queue = dispatch_queue_create("key-set-queue", DISPATCH_QUEUE_SERIAL);

        [self addDependency:_startDependency];
    }
    return self;
}

- (void)provideKeySet:(CKKSCurrentKeySet *)keyset
{
    // Ensure that only one keyset is provided through each operation
    dispatch_sync(self.queue, ^{
        if(!self.keyset) {
            self.keyset = keyset;
            if(self.startDependency) {
                // Create a new queue here, just to be safe in case someone is waiting
                NSOperationQueue* queue = [[NSOperationQueue alloc] init];
                [queue addOperation:self.startDependency];
                self.startDependency = nil;
            }
        }
    });

}
@end

#endif // OCTAGON