|
@@ -105,12 +105,10 @@ NSOperationQueue *taskQueue;
|
105
|
105
|
// constructor
|
106
|
106
|
- (id)init {
|
107
|
107
|
self = [super init];
|
108
|
|
- if(taskQueue == nil) {
|
109
|
|
- @synchronized ([RNFetchBlobNetwork class]) {
|
110
|
|
- if (taskQueue == nil) {
|
111
|
|
- taskQueue = [[NSOperationQueue alloc] init];
|
112
|
|
- taskQueue.maxConcurrentOperationCount = 10;
|
113
|
|
- }
|
|
108
|
+ @synchronized ([RNFetchBlobNetwork class]) {
|
|
109
|
+ if (taskQueue == nil) {
|
|
110
|
+ taskQueue = [[NSOperationQueue alloc] init];
|
|
111
|
+ taskQueue.maxConcurrentOperationCount = 10;
|
114
|
112
|
}
|
115
|
113
|
}
|
116
|
114
|
return self;
|
|
@@ -118,20 +116,24 @@ NSOperationQueue *taskQueue;
|
118
|
116
|
|
119
|
117
|
+ (void) enableProgressReport:(NSString *) taskId config:(RNFetchBlobProgress *)config
|
120
|
118
|
{
|
121
|
|
- if(progressTable == nil)
|
122
|
|
- {
|
123
|
|
- progressTable = [[NSMutableDictionary alloc] init];
|
|
119
|
+ @synchronized ([RNFetchBlobNetwork class]) {
|
|
120
|
+ if(progressTable == nil)
|
|
121
|
+ {
|
|
122
|
+ progressTable = [[NSMutableDictionary alloc] init];
|
|
123
|
+ }
|
|
124
|
+ [progressTable setValue:config forKey:taskId];
|
124
|
125
|
}
|
125
|
|
- [progressTable setValue:config forKey:taskId];
|
126
|
126
|
}
|
127
|
127
|
|
128
|
128
|
+ (void) enableUploadProgress:(NSString *) taskId config:(RNFetchBlobProgress *)config
|
129
|
129
|
{
|
130
|
|
- if(uploadProgressTable == nil)
|
131
|
|
- {
|
132
|
|
- uploadProgressTable = [[NSMutableDictionary alloc] init];
|
|
130
|
+ @synchronized ([RNFetchBlobNetwork class]) {
|
|
131
|
+ if(uploadProgressTable == nil)
|
|
132
|
+ {
|
|
133
|
+ uploadProgressTable = [[NSMutableDictionary alloc] init];
|
|
134
|
+ }
|
|
135
|
+ [uploadProgressTable setValue:config forKey:taskId];
|
133
|
136
|
}
|
134
|
|
- [uploadProgressTable setValue:config forKey:taskId];
|
135
|
137
|
}
|
136
|
138
|
|
137
|
139
|
// removing case from headers
|
|
@@ -245,8 +247,10 @@ NSOperationQueue *taskQueue;
|
245
|
247
|
}
|
246
|
248
|
|
247
|
249
|
__block NSURLSessionDataTask * task = [session dataTaskWithRequest:req];
|
248
|
|
- [taskTable setObject:task forKey:taskId];
|
249
|
|
- [task resume];
|
|
250
|
+ @synchronized ([RNFetchBlobNetwork class]){
|
|
251
|
+ [taskTable setObject:task forKey:taskId];
|
|
252
|
+ [task resume];
|
|
253
|
+ }
|
250
|
254
|
|
251
|
255
|
// network status indicator
|
252
|
256
|
if([[options objectForKey:CONFIG_INDICATOR] boolValue] == YES)
|
|
@@ -258,21 +262,22 @@ NSOperationQueue *taskQueue;
|
258
|
262
|
// #115 Invoke fetch.expire event on those expired requests so that the expired event can be handled
|
259
|
263
|
+ (void) emitExpiredTasks
|
260
|
264
|
{
|
261
|
|
- NSEnumerator * emu = [expirationTable keyEnumerator];
|
262
|
|
- NSString * key;
|
263
|
|
-
|
264
|
|
- while((key = [emu nextObject]))
|
265
|
|
- {
|
266
|
|
- RCTBridge * bridge = [RNFetchBlob getRCTBridge];
|
267
|
|
- NSData * args = @{ @"taskId": key };
|
268
|
|
- [bridge.eventDispatcher sendDeviceEventWithName:EVENT_EXPIRE body:args];
|
|
265
|
+ @synchronized ([RNFetchBlobNetwork class]){
|
|
266
|
+ NSEnumerator * emu = [expirationTable keyEnumerator];
|
|
267
|
+ NSString * key;
|
269
|
268
|
|
270
|
|
- }
|
|
269
|
+ while((key = [emu nextObject]))
|
|
270
|
+ {
|
|
271
|
+ RCTBridge * bridge = [RNFetchBlob getRCTBridge];
|
|
272
|
+ NSData * args = @{ @"taskId": key };
|
|
273
|
+ [bridge.eventDispatcher sendDeviceEventWithName:EVENT_EXPIRE body:args];
|
271
|
274
|
|
272
|
|
- // clear expired task entries
|
273
|
|
- [expirationTable removeAllObjects];
|
274
|
|
- expirationTable = [[NSMapTable alloc] init];
|
|
275
|
+ }
|
275
|
276
|
|
|
277
|
+ // clear expired task entries
|
|
278
|
+ [expirationTable removeAllObjects];
|
|
279
|
+ expirationTable = [[NSMapTable alloc] init];
|
|
280
|
+ }
|
276
|
281
|
}
|
277
|
282
|
|
278
|
283
|
////////////////////////////////////////
|
|
@@ -452,10 +457,18 @@ NSOperationQueue *taskQueue;
|
452
|
457
|
{
|
453
|
458
|
[writeStream write:[data bytes] maxLength:[data length]];
|
454
|
459
|
}
|
455
|
|
- RNFetchBlobProgress * pconfig = [progressTable valueForKey:taskId];
|
|
460
|
+
|
456
|
461
|
if(expectedBytes == 0)
|
457
|
462
|
return;
|
|
463
|
+
|
|
464
|
+ RNFetchBlobProgress * pconfig;
|
|
465
|
+
|
|
466
|
+ @synchronized ([RNFetchBlobNetwork class]){
|
|
467
|
+ pconfig = [progressTable valueForKey:taskId];
|
|
468
|
+ }
|
|
469
|
+
|
458
|
470
|
NSNumber * now =[NSNumber numberWithFloat:((float)receivedBytes/(float)expectedBytes)];
|
|
471
|
+
|
459
|
472
|
if(pconfig != nil && [pconfig shouldReport:now])
|
460
|
473
|
{
|
461
|
474
|
[self.bridge.eventDispatcher
|
|
@@ -465,11 +478,9 @@ NSOperationQueue *taskQueue;
|
465
|
478
|
@"written": [NSString stringWithFormat:@"%d", receivedBytes],
|
466
|
479
|
@"total": [NSString stringWithFormat:@"%d", expectedBytes],
|
467
|
480
|
@"chunk": chunkString
|
468
|
|
- }
|
|
481
|
+ }
|
469
|
482
|
];
|
470
|
483
|
}
|
471
|
|
- received = nil;
|
472
|
|
-
|
473
|
484
|
}
|
474
|
485
|
|
475
|
486
|
- (void) URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error
|
|
@@ -541,7 +552,7 @@ NSOperationQueue *taskQueue;
|
541
|
552
|
|
542
|
553
|
callback(@[ errMsg, rnfbRespType, respStr]);
|
543
|
554
|
|
544
|
|
- @synchronized(taskTable, uploadProgressTable, progressTable)
|
|
555
|
+ @synchronized ([RNFetchBlobNetwork class])
|
545
|
556
|
{
|
546
|
557
|
if([taskTable objectForKey:taskId] == nil)
|
547
|
558
|
NSLog(@"object released by ARC.");
|
|
@@ -560,17 +571,23 @@ NSOperationQueue *taskQueue;
|
560
|
571
|
// upload progress handler
|
561
|
572
|
- (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesWritten totalBytesExpectedToSend:(int64_t)totalBytesExpectedToWrite
|
562
|
573
|
{
|
563
|
|
- RNFetchBlobProgress * pconfig = [uploadProgressTable valueForKey:taskId];
|
564
|
574
|
if(totalBytesExpectedToWrite == 0)
|
565
|
575
|
return;
|
|
576
|
+
|
|
577
|
+ RNFetchBlobProgress * pconfig;
|
|
578
|
+
|
|
579
|
+ @synchronized ([RNFetchBlobNetwork class]) {
|
|
580
|
+ pconfig = [uploadProgressTable valueForKey:taskId];
|
|
581
|
+ }
|
|
582
|
+
|
566
|
583
|
NSNumber * now = [NSNumber numberWithFloat:((float)totalBytesWritten/(float)totalBytesExpectedToWrite)];
|
567
|
584
|
if(pconfig != nil && [pconfig shouldReport:now]) {
|
568
|
585
|
[self.bridge.eventDispatcher
|
569
|
586
|
sendDeviceEventWithName:EVENT_PROGRESS_UPLOAD
|
570
|
587
|
body:@{
|
571
|
588
|
@"taskId": taskId,
|
572
|
|
- @"written": [NSString stringWithFormat:@"%d", totalBytesWritten],
|
573
|
|
- @"total": [NSString stringWithFormat:@"%d", totalBytesExpectedToWrite]
|
|
589
|
+ @"written": [NSString stringWithFormat:@"%ld", (long) totalBytesWritten],
|
|
590
|
+ @"total": [NSString stringWithFormat:@"%ld", (long) totalBytesExpectedToWrite]
|
574
|
591
|
}
|
575
|
592
|
];
|
576
|
593
|
}
|
|
@@ -578,7 +595,12 @@ NSOperationQueue *taskQueue;
|
578
|
595
|
|
579
|
596
|
+ (void) cancelRequest:(NSString *)taskId
|
580
|
597
|
{
|
581
|
|
- NSURLSessionDataTask * task = [taskTable objectForKey:taskId];
|
|
598
|
+ NSURLSessionDataTask * task;
|
|
599
|
+
|
|
600
|
+ @synchronized ([RNFetchBlobNetwork class]) {
|
|
601
|
+ task = [taskTable objectForKey:taskId];
|
|
602
|
+ }
|
|
603
|
+
|
582
|
604
|
if(task != nil && task.state == NSURLSessionTaskStateRunning)
|
583
|
605
|
[task cancel];
|
584
|
606
|
}
|