diff --git a/matrixConsole/API/MediaLoader.h b/matrixConsole/API/MediaLoader.h index 7be378e23..06d754c8e 100644 --- a/matrixConsole/API/MediaLoader.h +++ b/matrixConsole/API/MediaLoader.h @@ -66,6 +66,7 @@ typedef void (^blockMediaLoader_onError)(NSError *error); NSString *uploadId; CGFloat initialRange; CGFloat range; + NSOperation* operation; } @property (strong, readonly) NSMutableDictionary* statisticsDict; diff --git a/matrixConsole/API/MediaLoader.m b/matrixConsole/API/MediaLoader.m index debada960..1a86fe597 100644 --- a/matrixConsole/API/MediaLoader.m +++ b/matrixConsole/API/MediaLoader.m @@ -33,7 +33,7 @@ NSString *const kMediaLoaderProgressDownloadRateKey = @"kMediaLoaderProgressDown - (void)cancel { // Cancel potential connection if (downloadConnection) { - NSLog(@"Image download has been cancelled (%@)", mediaURL); + NSLog(@"media download has been cancelled (%@)", mediaURL); if (onError){ onError(nil); } @@ -45,6 +45,12 @@ NSString *const kMediaLoaderProgressDownloadRateKey = @"kMediaLoaderProgressDown downloadData = nil; } else { + if (operation.executing) { + NSLog(@"media upload has been cancelled (%@)", mediaURL); + [operation cancel]; + operation = nil; + } + // Reset blocks onSuccess = nil; onError = nil; @@ -200,7 +206,7 @@ NSString *const kMediaLoaderProgressDownloadRateKey = @"kMediaLoaderProgressDown statsStartTime = CFAbsoluteTimeGetCurrent(); MatrixHandler *mxHandler = [MatrixHandler sharedHandler]; - [mxHandler.mxRestClient uploadContent:data mimeType:mimeType timeout:30 success:success failure:failure uploadProgress:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { + operation = [mxHandler.mxRestClient uploadContent:data mimeType:mimeType timeout:30 success:success failure:failure uploadProgress:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { [self updateUploadProgressWithBytesWritten:bytesWritten totalBytesWritten:totalBytesWritten andTotalBytesExpectedToWrite:totalBytesExpectedToWrite]; }]; diff --git a/matrixConsole/ViewController/RecentsViewController.m b/matrixConsole/ViewController/RecentsViewController.m index 8c67c1730..8cf000e39 100644 --- a/matrixConsole/ViewController/RecentsViewController.m +++ b/matrixConsole/ViewController/RecentsViewController.m @@ -23,6 +23,8 @@ #import "AppDelegate.h" #import "MatrixHandler.h" +#import "MediaManager.h" + @interface RecentsViewController () { // Array of RecentRooms NSMutableArray *recents; @@ -548,7 +550,14 @@ } else { recentRoom = recents[indexPath.row]; } + MXRoom *mxRoom = [[MatrixHandler sharedHandler].mxSession roomWithRoomId:recentRoom.roomId]; + + // cancel pending uploads/downloads + // they are useless by now + [MediaManager cancelDownloadsInFolder:recentRoom.roomId]; + [MediaManager cancelUploadsInFolder:recentRoom.roomId]; + [mxRoom leave:^{ // Refresh table display if (filteredRecents) { diff --git a/matrixConsole/ViewController/RoomViewController.m b/matrixConsole/ViewController/RoomViewController.m index fb6f727ae..5293789ca 100644 --- a/matrixConsole/ViewController/RoomViewController.m +++ b/matrixConsole/ViewController/RoomViewController.m @@ -1262,8 +1262,12 @@ NSString *const kCmdResetUserPowerLevel = @"/deop"; [self sendMessage:videoContent withLocalEvent:localEvent]; } failure:^(NSError *error) { NSLog(@"Video upload failed"); - [MediaManager removeUploaderWithId:localEvent.eventId inFolder:self.roomId]; - [self handleError:error forLocalEvent:localEvent]; + // check if the upload is still defined + // it could have been cancelled with an external events + if ([MediaManager existingUploaderWithId:localEvent.eventId inFolder:self.roomId]) { + [MediaManager removeUploaderWithId:localEvent.eventId inFolder:self.roomId]; + [self handleError:error forLocalEvent:localEvent]; + } }]; } else { @@ -1351,9 +1355,13 @@ NSString *const kCmdResetUserPowerLevel = @"/deop"; } }]; } failure:^(NSError *error) { - NSLog(@"Video thumbnail upload failed"); - [MediaManager removeUploaderWithId:localEvent.eventId inFolder:self.roomId]; - [self handleError:error forLocalEvent:localEvent]; + // check if the upload is still defined + // it could have been cancelled with an external events + if ([MediaManager existingUploaderWithId:localEvent.eventId inFolder:self.roomId]) { + NSLog(@"Video thumbnail upload failed"); + [MediaManager removeUploaderWithId:localEvent.eventId inFolder:self.roomId]; + [self handleError:error forLocalEvent:localEvent]; + } }]; } @@ -2920,9 +2928,14 @@ NSString *const kCmdResetUserPowerLevel = @"/deop"; // Send message for this attachment [self sendMessage:imageMessage withLocalEvent:localEvent]; } failure:^(NSError *error) { - [MediaManager removeUploaderWithId:localEvent.eventId inFolder:self.roomId]; - NSLog(@"Failed to upload image: %@", error); - [self handleError:error forLocalEvent:localEvent]; + // check if the upload is still defined + // it could have been cancelled with an external events + if ([MediaManager existingUploaderWithId:localEvent.eventId inFolder:self.roomId]) + { + [MediaManager removeUploaderWithId:localEvent.eventId inFolder:self.roomId]; + NSLog(@"Failed to upload image: %@", error); + [self handleError:error forLocalEvent:localEvent]; + } }]; }