// // OSSCompat.m // oss_ios_sdk_new // // Created by zhouzhuo on 9/10/15. // Copyright (c) 2015 aliyun.com. All rights reserved. // #import "OSSDefine.h" #import "OSSCompat.h" #import "OSSBolts.h" #import "OSSModel.h" @implementation OSSClient (Compat) - (OSSTaskHandler *)uploadData:(NSData *)data withContentType:(NSString *)contentType withObjectMeta:(NSDictionary *)meta toBucketName:(NSString *)bucketName toObjectKey:(NSString *)objectKey onCompleted:(void(^)(BOOL, NSError *))onCompleted onProgress:(void(^)(float progress))onProgress { OSSTaskHandler * bcts = [OSSCancellationTokenSource cancellationTokenSource]; [[[OSSTask taskWithResult:nil] continueWithExecutor:self.ossOperationExecutor withSuccessBlock:^id(OSSTask *task) { OSSPutObjectRequest * put = [OSSPutObjectRequest new]; put.bucketName = bucketName; put.objectKey = objectKey; put.objectMeta = meta; put.uploadingData = data; put.contentType = contentType; put.uploadProgress = ^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) { if (totalBytesExpectedToSend) { onProgress((float)totalBytesSent / totalBytesExpectedToSend); } }; [bcts.token registerCancellationObserverWithBlock:^{ [put cancel]; }]; OSSTask * putTask = [self putObject:put]; [putTask waitUntilFinished]; onProgress(1.0f); return putTask; }] continueWithBlock:^id(OSSTask *task) { if (task.error) { onCompleted(NO, task.error); } else { onCompleted(YES, nil); } return nil; }]; return bcts; } - (OSSTaskHandler *)downloadToDataFromBucket:(NSString *)bucketName objectKey:(NSString *)objectKey onCompleted:(void (^)(NSData *, NSError *))onCompleted onProgress:(void (^)(float))onProgress { OSSTaskHandler * bcts = [OSSCancellationTokenSource cancellationTokenSource]; [[[OSSTask taskWithResult:nil] continueWithExecutor:self.ossOperationExecutor withBlock:^id(OSSTask *task) { OSSGetObjectRequest * get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; get.downloadProgress = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) { if (totalBytesExpectedToWrite) { onProgress((float)totalBytesWritten / totalBytesExpectedToWrite); } }; [bcts.token registerCancellationObserverWithBlock:^{ [get cancel]; }]; OSSTask * getTask = [self getObject:get]; [getTask waitUntilFinished]; onProgress(1.0f); return getTask; }] continueWithBlock:^id(OSSTask *task) { if (task.error) { onCompleted(nil, task.error); } else { OSSGetObjectResult * result = task.result; onCompleted(result.downloadedData, nil); } return nil; }]; return bcts; } - (OSSTaskHandler *)downloadToFileFromBucket:(NSString *)bucketName objectKey:(NSString *)objectKey toFile:(NSString *)filePath onCompleted:(void (^)(BOOL, NSError *))onCompleted onProgress:(void (^)(float))onProgress { OSSTaskHandler * bcts = [OSSCancellationTokenSource cancellationTokenSource]; [[[OSSTask taskWithResult:nil] continueWithExecutor:self.ossOperationExecutor withBlock:^id(OSSTask *task) { OSSGetObjectRequest * get = [OSSGetObjectRequest new]; get.bucketName = bucketName; get.objectKey = objectKey; get.downloadToFileURL = [NSURL fileURLWithPath:filePath]; get.downloadProgress = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) { if (totalBytesExpectedToWrite) { onProgress((float)totalBytesWritten / totalBytesExpectedToWrite); } }; [bcts.token registerCancellationObserverWithBlock:^{ [get cancel]; }]; OSSTask * getTask = [self getObject:get]; [getTask waitUntilFinished]; onProgress(1.0f); return getTask; }] continueWithBlock:^id(OSSTask *task) { if (task.error) { onCompleted(NO, task.error); } else { onCompleted(YES, nil); } return nil; }]; return bcts; } - (void)deleteObjectInBucket:(NSString *)bucketName objectKey:(NSString *)objectKey onCompleted:(void (^)(BOOL, NSError *))onCompleted { [[[OSSTask taskWithResult:nil] continueWithExecutor:self.ossOperationExecutor withBlock:^id(OSSTask *task) { OSSDeleteObjectRequest * delete = [OSSDeleteObjectRequest new]; delete.bucketName = bucketName; delete.objectKey = objectKey; OSSTask * deleteTask = [self deleteObject:delete]; [deleteTask waitUntilFinished]; return deleteTask; }] continueWithBlock:^id(OSSTask *task) { if (task.error) { onCompleted(NO, task.error); } else { onCompleted(YES, nil); } return nil; }]; } - (OSSTaskHandler *)uploadFile:(NSString *)filePath withContentType:(NSString *)contentType withObjectMeta:(NSDictionary *)meta toBucketName:(NSString *)bucketName toObjectKey:(NSString *)objectKey onCompleted:(void (^)(BOOL, NSError *))onCompleted onProgress:(void (^)(float))onProgress { OSSTaskHandler * bcts = [OSSCancellationTokenSource cancellationTokenSource]; [[[OSSTask taskWithResult:nil] continueWithExecutor:self.ossOperationExecutor withSuccessBlock:^id(OSSTask *task) { OSSPutObjectRequest * put = [OSSPutObjectRequest new]; put.bucketName = bucketName; put.objectKey = objectKey; put.objectMeta = meta; put.uploadingFileURL = [NSURL fileURLWithPath:filePath]; put.contentType = contentType; put.uploadProgress = ^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) { if (totalBytesExpectedToSend) { onProgress((float)totalBytesSent / totalBytesExpectedToSend); } }; [bcts.token registerCancellationObserverWithBlock:^{ [put cancel]; }]; OSSTask * putTask = [self putObject:put]; [putTask waitUntilFinished]; onProgress(1.0f); return putTask; }] continueWithBlock:^id(OSSTask *task) { if (task.error) { onCompleted(NO, task.error); } else { onCompleted(YES, nil); } return nil; }]; return bcts; } - (OSSTaskHandler *)resumableUploadFile:(NSString *)filePath withContentType:(NSString *)contentType withObjectMeta:(NSDictionary *)meta toBucketName:(NSString *)bucketName toObjectKey:(NSString *)objectKey onCompleted:(void(^)(BOOL, NSError *))onComplete onProgress:(void(^)(float progress))onProgress { OSSTaskHandler * bcts = [OSSCancellationTokenSource cancellationTokenSource]; [[[OSSTask taskWithResult:nil] continueWithBlock:^id(OSSTask *task) { NSURL * fileURL = [NSURL fileURLWithPath:filePath]; NSDate * lastModified; NSError * error; [fileURL getResourceValue:&lastModified forKey:NSURLContentModificationDateKey error:&error]; if (error) { return [OSSTask taskWithError:error]; } OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = bucketName; resumableUpload.deleteUploadIdOnCancelling = NO;//cancel not delete record file resumableUpload.contentType = contentType; resumableUpload.completeMetaHeader = meta; NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; resumableUpload.recordDirectoryPath = cachesDir; //default record file path resumableUpload.uploadingFileURL = fileURL; resumableUpload.objectKey = objectKey; resumableUpload.uploadId = task.result; resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:filePath]; __weak OSSResumableUploadRequest * weakRef = resumableUpload; resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) { onProgress((float)totalBytesSent/totalBytesExpectedToSend); if (bcts.token.isCancellationRequested || bcts.isCancellationRequested) { [weakRef cancel]; } OSSLogDebugNoFile(@"%lld %lld %lld", bytesSent, totalBytesSent, totalBytesExpectedToSend); }; return [self resumableUpload:resumableUpload]; }] continueWithBlock:^id(OSSTask *task) { if (task.cancelled) { onComplete(NO, [NSError errorWithDomain:OSSClientErrorDomain code:OSSClientErrorCodeTaskCancelled userInfo:@{OSSErrorMessageTOKEN: @"This task is cancelled"}]); } else if (task.error) { onComplete(NO, task.error); } else if (task.faulted) { onComplete(NO, [NSError errorWithDomain:OSSClientErrorDomain code:OSSClientErrorCodeExcpetionCatched userInfo:@{OSSErrorMessageTOKEN: [NSString stringWithFormat:@"Catch exception - %@", task.exception]}]); } else { onComplete(YES, nil); } return nil; }]; return bcts; } @end