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