1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-04 02:17:51 +01:00
Telegram/thirdparty/GDFileManager/GDAccessTokenClientCredential.m
2015-10-01 19:19:52 +03:00

102 lines
2.9 KiB
Objective-C
Executable File

//
// GDAccessTokenClientCredential.m
// GDFileManagerExample
//
// Created by Graham Dennis on 4/07/13.
// Copyright (c) 2013 Graham Dennis. All rights reserved.
//
#import "GDAccessTokenClientCredential.h"
#import "GDHTTPClient.h"
@interface GDAccessTokenClientCredential ()
@property (nonatomic) dispatch_queue_t private_queue;
@property (nonatomic, strong) GDAccessTokenClientCredential *refreshedCredential;
@end
@implementation GDAccessTokenClientCredential
@dynamic accessTokenExpirationDate; // must be provided by subclass
#if !OS_OBJECT_USE_OBJC
- (void)dealloc
{
if (self.private_queue) {
dispatch_release(self.private_queue);
self.private_queue = NULL;
}
}
#endif
- (id)initWithUserID:(NSString *)userID apiToken:(GDAPIToken *)apiToken
{
if ((self = [super initWithUserID:userID apiToken:apiToken])) {
[self _commonInitGDAccessTokenClientCredential];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if ((self = [super initWithCoder:aDecoder])) {
[self _commonInitGDAccessTokenClientCredential];
}
return self;
}
- (void)_commonInitGDAccessTokenClientCredential
{
self.private_queue = dispatch_queue_create("me.grahamdennis.GDClientCredential", DISPATCH_QUEUE_SERIAL);
}
- (BOOL)isAccessTokenValid
{
[self doesNotRecognizeSelector:_cmd];
return NO;
}
- (void)getRenewedAccessTokenUsingClient:(GDHTTPClient *)client success:(void (^)(GDClientCredential *, BOOL))success failure:(void (^)(NSError *))failure
{
if ([self isAccessTokenValid]) {
if (success) success(self, NO);
return;
}
if (self.refreshedCredential) {
return [self.refreshedCredential getRenewedAccessTokenUsingClient:client success:success failure:failure];
}
dispatch_async(self.private_queue, ^{
// When we get to the start of the queue, we may now have a refreshedCredential
if (self.refreshedCredential) {
return [self.refreshedCredential getRenewedAccessTokenUsingClient:client success:success failure:failure];
}
// We don't have a refreshedCredential, so we need to generate one. To make sure no-one else tries to do this while we are, we suspend the current queue.
dispatch_suspend(self.private_queue);
[client getAccessTokenWithSuccess:^(GDAccessTokenClientCredential *credential) {
self.refreshedCredential = credential;
dispatch_resume(self.private_queue);
if (success) {
success(credential, YES);
}
} failure:^(NSError *error) {
dispatch_resume(self.private_queue);
if (failure) failure(error);
}];
});
}
- (NSComparisonResult)compare:(GDAccessTokenClientCredential *)otherCredential
{
return [self.accessTokenExpirationDate compare:otherCredential.accessTokenExpirationDate];
}
@end