1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/thirdparty/GDFileManager/GDFileManagerDownloadOperation.m
2015-10-01 19:19:52 +03:00

100 lines
3.5 KiB
Objective-C
Executable File

//
// GDFileManagerDownloadOperation.m
// GDFileManagerExample
//
// Created by Graham Dennis on 18/08/13.
// Copyright (c) 2013 Graham Dennis. All rights reserved.
//
#import "GDFileManagerDownloadOperation.h"
#import "GDFileManagerDownloadOperation_Private.h"
#import "GDFileManager_Private.h"
#import "GDFileServiceManager.h"
#import "GDFileServiceSession.h"
@implementation GDFileManagerDownloadOperation
@synthesize localDestinationFileURL = _localDestinationFileURL;
- (instancetype)initWithFileManager:(GDFileManager *)fileManager sourceURL:(NSURL *)sourceURL
success:(void (^)(NSURL *localURL, GDURLMetadata *metadata))success
failure:(void (^)(NSError *error))failure
{
if ((self = [super init])) {
_fileManager = fileManager;
_sourceURL = [sourceURL copy];
__block typeof(self) strongSelf = self;
dispatch_block_t cleanup = ^{[strongSelf finish]; strongSelf->_success = nil; strongSelf->_failure = nil; strongSelf.downloadProgressBlock = nil; strongSelf = nil;};
_success = ^(NSURL *localURL, GDURLMetadata *metadata){
dispatch_async(strongSelf.successCallbackQueue, ^{
if (success) success(localURL, metadata);
cleanup();
});
};
_failure = ^(NSError *error){
dispatch_async(strongSelf.failureCallbackQueue, ^{
if (failure) failure(error);
cleanup();
});
};
}
return self;
}
- (NSURL *)localDestinationFileURL
{
if (!_localDestinationFileURL) {
NSString *uuidString = nil;
{
CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
CFRelease(uuid);
}
_localDestinationFileURL = [[NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES] URLByAppendingPathComponent:uuidString];
}
return _localDestinationFileURL;
}
- (void)main
{
[self downloadFile];
}
- (void)downloadFile
{
if ([self isCancelled]) return self.failure(GDOperationCancelledError);
GDFileManager *fileManager = self.fileManager;
GDFileServiceSession *session = [fileManager.fileServiceManager fileServiceSessionForURL:self.sourceURL];
NSURL *canonicalURL = [session canonicalURLForURL:self.sourceURL];
if (!canonicalURL) {
return self.failure(GDFileManagerError(GDFileManagerNoCanonicalURLError));
}
if (!self.localDestinationFileURL) {
return self.failure(GDFileManagerError(GDFileManagerNoLocalURLError));
} else if (![self.localDestinationFileURL isFileURL]) {
return self.failure(GDFileManagerError(GDFileManagerLocalURLNotFileURLError));
}
NSOperation *childOperation = [session downloadURL:self.sourceURL intoFileURL:self.localDestinationFileURL fileVersion:self.fileVersion
progress:self.downloadProgressBlock
success:^(NSURL *localURL, GDURLMetadata *metadata) {
[fileManager cacheClientMetadata:metadata];
_localDestinationFileURL = localURL;
self.success(localURL, metadata);
}
failure:self.failure];
[self addChildOperation:childOperation];
}
@end