@ -17,6 +17,10 @@ NSString *const kAttachmentUploadProgressNotification = @"kAttachmentUploadProgr
NSString * const kAttachmentUploadProgressKey = @ "kAttachmentUploadProgressKey ";
NSString * const kAttachmentUploadAttachmentIDKey = @ "kAttachmentUploadAttachmentIDKey ";
/ / Use a slightly non - zero value to ensure that the progress
/ / indicator shows up as quickly as possible .
static const CGFloat kAttachmentUploadProgressTheta = 0.001 f ;
@ interface OWSUploadingService ( )
@ property ( nonatomic , readonly ) TSNetworkManager * networkManager ;
@ -42,12 +46,26 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
success : ( void ( ^) ( ) ) successHandler
failure : ( RetryableFailureHandler ) failureHandler
{
void ( ^successHandlerWrapper ) ( ) = ^{
[ self fireProgressNotification : 1 attachmentId : attachmentStream . uniqueId ] ;
successHandler ( ) ;
} ;
RetryableFailureHandler failureHandlerWrapper = ^( NSError * _Nonnull error , BOOL isRetryable ) {
[ self fireProgressNotification : 0 attachmentId : attachmentStream . uniqueId ] ;
failureHandler ( error , isRetryable ) ;
} ;
if ( attachmentStream . serverId ) {
DDLogDebug ( @ "%@ Attachment previously uploaded.", self.tag);
successHandler ( outgoingMessage ) ;
successHandler Wrapper ( outgoingMessage ) ;
return ;
}
[ self fireProgressNotification : kAttachmentUploadProgressTheta attachmentId : attachmentStream . uniqueId ] ;
TSRequest * allocateAttachment = [ [ TSAllocAttachmentRequest alloc ] init ] ;
[ self . networkManager makeRequest : allocateAttachment
success : ^( NSURLSessionDataTask * task , id responseObject ) {
@ -55,7 +73,7 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
if ( ![ responseObject isKindOfClass : [ NSDictionary class ] ] ) {
DDLogError ( @ "%@ unexpected response from server: %@", self.tag, responseObject);
NSError * error = OWSErrorMakeUnableToProcessServerResponseError ( ) ;
return failureHandler ( error , YES ) ;
return failureHandler Wrapper ( error , YES ) ;
}
NSDictionary * responseDict = ( NSDictionary * ) responseObject ;
@ -66,7 +84,7 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
NSData * attachmentData = [ attachmentStream readDataFromFileWithError : & error ] ;
if ( error ) {
DDLogError ( @ "%@ Failed to read attachment data with error:%@", self.tag, error);
return failureHandler ( error , YES ) ;
return failureHandler Wrapper ( error , YES ) ;
}
NSData * encryptionKey ;
@ -88,15 +106,15 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
attachmentStream . isUploaded = YES ;
[ attachmentStream save ] ;
successHandler ( ) ;
successHandler Wrapper ( ) ;
}
failure : failureHandler ] ;
failure : failureHandler Wrapper ] ;
} ) ;
}
failure : ^( NSURLSessionDataTask * task , NSError * error ) {
DDLogError ( @ "%@ Failed to allocate attachment with error: %@", self.tag, error);
failureHandler ( error , YES ) ;
failureHandler Wrapper ( error , YES ) ;
} ] ;
}
@ -115,18 +133,16 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
AFURLSessionManager * manager = [ [ AFURLSessionManager alloc ]
initWithSessionConfiguration : [ NSURLSessionConfiguration defaultSessionConfiguration ] ] ;
[ self fireProgressNotification : 0 attachmentId : attachmentId ] ;
NSURLSessionUploadTask * uploadTask ;
uploadTask = [ manager uploadTaskWithRequest : request
fromData : cipherText
progress : ^( NSProgress * _Nonnull uploadProgress ) {
[ self fireProgressNotification : uploadProgress . fractionCompleted attachmentId : attachmentId ] ;
[ self fireProgressNotification : MAX ( kAttachmentUploadProgressTheta , uploadProgress . fractionCompleted )
attachmentId : attachmentId ] ;
}
completionHandler : ^( NSURLResponse * _Nonnull response , id _Nullable responseObject , NSError * _Nullable error ) {
OWSAssert ( [ NSThread isMainThread ] ) ;
if ( error ) {
[ self fireProgressNotification : 0 attachmentId : attachmentId ] ;
return failureHandler ( error , YES ) ;
}
@ -139,8 +155,6 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
}
successHandler ( ) ;
[ self fireProgressNotification : 1 attachmentId : attachmentId ] ;
} ] ;
[ uploadTask resume ] ;