1// Copyright 2015-present 650 Industries. All rights reserved.
2
3#import <ExpoFileSystem/EXSessionDownloadTaskDelegate.h>
4#import <ExpoFileSystem/NSData+EXFileSystem.h>
5
6@interface EXSessionDownloadTaskDelegate ()
7
8@property (strong, nonatomic) NSURL *localUrl;
9@property (nonatomic) BOOL shouldCalculateMd5;
10
11@end
12
13@implementation EXSessionDownloadTaskDelegate
14
15- (nonnull instancetype)initWithResolve:(EXPromiseResolveBlock)resolve
16                                 reject:(EXPromiseRejectBlock)reject
17                               localUrl:(NSURL *)localUrl
18                     shouldCalculateMd5:(BOOL)shouldCalculateMd5
19{
20  if (self = [super initWithResolve:resolve reject:reject])
21  {
22    _localUrl = localUrl;
23    _shouldCalculateMd5 = shouldCalculateMd5;
24  }
25  return self;
26}
27
28- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
29{
30  NSError *error;
31  NSFileManager *fileManager = [NSFileManager defaultManager];
32  if ([fileManager fileExistsAtPath:_localUrl.path]) {
33    [fileManager removeItemAtURL:_localUrl error:&error];
34    if (error) {
35      self.reject(@"ERR_FILESYSTEM_CANNOT_REMOVE",
36                  [NSString stringWithFormat:@"Unable to remove file from local URI: '%@'", error.description],
37                  error);
38      return;
39    }
40  }
41
42  [fileManager moveItemAtURL:location toURL:_localUrl error:&error];
43  if (error) {
44    self.reject(@"ERR_FILESYSTEM_CANNOT_SAVE",
45                [NSString stringWithFormat:@"Unable to save file to local URI: '%@'", error.description],
46                error);
47    return;
48  }
49
50  self.resolve([self parseServerResponse:downloadTask.response]);
51}
52
53- (NSDictionary *)parseServerResponse:(NSURLResponse *)response
54{
55  NSMutableDictionary *result = [[super parseServerResponse:response] mutableCopy];
56  result[@"uri"] = _localUrl.absoluteString;
57  if (_shouldCalculateMd5) {
58    NSData *data = [NSData dataWithContentsOfURL:_localUrl];
59    result[@"md5"] = [data md5String];
60  }
61  return result;
62}
63
64@end
65