1// Copyright 2015-present 650 Industries. All rights reserved. 2 3#import <ExpoFileSystem/EXSessionTaskDispatcher.h> 4#import <ExpoFileSystem/EXSessionResumableDownloadTaskDelegate.h> 5 6@interface EXSessionTaskDispatcher () 7 8@property (nonatomic, strong) NSMutableDictionary<NSURLSessionTask *, EXSessionTaskDelegate *> *tasks; 9@property (nonatomic) BOOL isActive; 10@property (nonatomic, weak, nullable) id<EXSessionHandler> sessionHandler; 11 12@end 13 14@implementation EXSessionTaskDispatcher 15 16- (instancetype)initWithSessionHandler:(nullable id<EXSessionHandler>)sessionHandler; 17{ 18 if (self = [super init]) { 19 _tasks = [NSMutableDictionary dictionary]; 20 _isActive = true; 21 _sessionHandler = sessionHandler; 22 } 23 return self; 24} 25 26#pragma mark - public methods 27 28- (void)registerTaskDelegate:(EXSessionTaskDelegate *)delegate forTask:(NSURLSessionTask *)task 29{ 30 _tasks[task] = delegate; 31} 32 33- (void)deactivate 34{ 35 _isActive = false; 36} 37 38#pragma mark - dispatcher 39 40- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location 41{ 42 if (_isActive) { 43 EXSessionTaskDelegate *exTask = _tasks[downloadTask]; 44 if (exTask) { 45 [exTask URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location]; 46 [_tasks removeObjectForKey:downloadTask]; 47 } 48 } 49} 50 51- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 52{ 53 if (_isActive) { 54 EXSessionTaskDelegate *exTask = _tasks[task]; 55 if (exTask) { 56 [exTask URLSession:session task:task didCompleteWithError:error]; 57 [_tasks removeObjectForKey:task]; 58 } 59 } 60} 61 62- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask 63 didWriteData:(int64_t)bytesWritten 64 totalBytesWritten:(int64_t)totalBytesWritten 65 totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite 66{ 67 if (_isActive) { 68 EXSessionTaskDelegate *exTask = _tasks[downloadTask]; 69 [exTask URLSession:session downloadTask:downloadTask didWriteData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite]; 70 } 71} 72 73- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 74{ 75 if (_isActive) { 76 EXSessionTaskDelegate *exTask = _tasks[dataTask]; 77 [exTask URLSession:session dataTask:dataTask didReceiveData:data]; 78 } 79} 80 81- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { 82 [_sessionHandler invokeCompletionHandlerForSessionIdentifier:session.configuration.identifier]; 83} 84 85- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task 86 didSendBodyData:(int64_t)bytesSent 87 totalBytesSent:(int64_t)totalBytesSent 88 totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend 89{ 90 if (_isActive) { 91 EXSessionTaskDelegate *exTask = _tasks[task]; 92 [exTask URLSession:session task:task didSendBodyData:bytesSent totalBytesSent:totalBytesSent totalBytesExpectedToSend:totalBytesExpectedToSend]; 93 } 94} 95 96@end 97