Skip to content
This repository was archived by the owner on Apr 18, 2023. It is now read-only.

Commit 5b67dfa

Browse files
author
Vikas Dadheech
committed
Add Large File Upload implementation and Unit Tests
1 parent 24804b8 commit 5b67dfa

File tree

9 files changed

+527
-0
lines changed

9 files changed

+527
-0
lines changed

MSGraphClientSDK/MSGraphClientSDK.xcodeproj/project.pbxproj

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@
3636
E54D1220225B59B300EB517A /* MSPageIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E54D121E225B59B300EB517A /* MSPageIterator.h */; settings = {ATTRIBUTES = (Public, ); }; };
3737
E54D1223225C882A00EB517A /* MSPageIteratorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E54D1222225C882A00EB517A /* MSPageIteratorTests.m */; };
3838
E54D1225225C9C7B00EB517A /* PagedResponse.json in Resources */ = {isa = PBXBuildFile; fileRef = E54D1224225C9C7A00EB517A /* PagedResponse.json */; };
39+
E54D123222646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E54D122E22646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
40+
E54D123322646CA900EB517A /* MSLargeFileUploadTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E54D122F22646CA900EB517A /* MSLargeFileUploadTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
41+
E54D123422646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.m in Sources */ = {isa = PBXBuildFile; fileRef = E54D123022646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.m */; };
42+
E54D123522646CA900EB517A /* MSLargeFileUploadTask.m in Sources */ = {isa = PBXBuildFile; fileRef = E54D123122646CA900EB517A /* MSLargeFileUploadTask.m */; };
43+
E54D1237226472FB00EB517A /* MSLargeFileUploadTaskTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E54D1236226472FB00EB517A /* MSLargeFileUploadTaskTests.m */; };
44+
E54D123B2264858100EB517A /* LargeFileUploadResource.bmp in Resources */ = {isa = PBXBuildFile; fileRef = E54D123A2264858100EB517A /* LargeFileUploadResource.bmp */; };
45+
E54D123D2264AEBD00EB517A /* MSGraphOneDriveLargeFileUploadTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E54D123C2264AEBD00EB517A /* MSGraphOneDriveLargeFileUploadTests.m */; };
3946
E566782E2150BC4F00C6B7AE /* MSRedirectHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E566782D2150BC4F00C6B7AE /* MSRedirectHandlerTests.m */; };
4047
E56678302150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E566782F2150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m */; };
4148
E56B101C2220086300ED640F /* MSRedirectHandlerOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = E56B101A2220086300ED640F /* MSRedirectHandlerOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -121,6 +128,13 @@
121128
E54D121E225B59B300EB517A /* MSPageIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSPageIterator.h; sourceTree = "<group>"; };
122129
E54D1222225C882A00EB517A /* MSPageIteratorTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSPageIteratorTests.m; sourceTree = "<group>"; };
123130
E54D1224225C9C7A00EB517A /* PagedResponse.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = PagedResponse.json; sourceTree = "<group>"; };
131+
E54D122E22646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSGraphOneDriveLargeFileUploadTask.h; sourceTree = "<group>"; };
132+
E54D122F22646CA900EB517A /* MSLargeFileUploadTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSLargeFileUploadTask.h; sourceTree = "<group>"; };
133+
E54D123022646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSGraphOneDriveLargeFileUploadTask.m; sourceTree = "<group>"; };
134+
E54D123122646CA900EB517A /* MSLargeFileUploadTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSLargeFileUploadTask.m; sourceTree = "<group>"; };
135+
E54D1236226472FB00EB517A /* MSLargeFileUploadTaskTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSLargeFileUploadTaskTests.m; sourceTree = "<group>"; };
136+
E54D123A2264858100EB517A /* LargeFileUploadResource.bmp */ = {isa = PBXFileReference; lastKnownFileType = image.bmp; path = LargeFileUploadResource.bmp; sourceTree = "<group>"; };
137+
E54D123C2264AEBD00EB517A /* MSGraphOneDriveLargeFileUploadTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSGraphOneDriveLargeFileUploadTests.m; sourceTree = "<group>"; };
124138
E566782D2150BC4F00C6B7AE /* MSRedirectHandlerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRedirectHandlerTests.m; sourceTree = "<group>"; };
125139
E566782F2150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSAuthenticationHandlerTests.m; sourceTree = "<group>"; };
126140
E56B101A2220086300ED640F /* MSRedirectHandlerOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSRedirectHandlerOptions.h; sourceTree = "<group>"; };
@@ -326,6 +340,10 @@
326340
E54D11DE22534D7000EB517A /* GraphTasks */ = {
327341
isa = PBXGroup;
328342
children = (
343+
E54D122E22646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.h */,
344+
E54D123022646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.m */,
345+
E54D122F22646CA900EB517A /* MSLargeFileUploadTask.h */,
346+
E54D123122646CA900EB517A /* MSLargeFileUploadTask.m */,
329347
E54D121E225B59B300EB517A /* MSPageIterator.h */,
330348
E54D121D225B59B300EB517A /* MSPageIterator.m */,
331349
);
@@ -336,6 +354,8 @@
336354
isa = PBXGroup;
337355
children = (
338356
E54D1222225C882A00EB517A /* MSPageIteratorTests.m */,
357+
E54D1236226472FB00EB517A /* MSLargeFileUploadTaskTests.m */,
358+
E54D123C2264AEBD00EB517A /* MSGraphOneDriveLargeFileUploadTests.m */,
339359
);
340360
path = GraphTasks;
341361
sourceTree = "<group>";
@@ -367,6 +387,7 @@
367387
E573EE0E2136568700C5E884 /* Resources */ = {
368388
isa = PBXGroup;
369389
children = (
390+
E54D123A2264858100EB517A /* LargeFileUploadResource.bmp */,
370391
E54D1224225C9C7A00EB517A /* PagedResponse.json */,
371392
E52050052175B10800E64160 /* BatchResponse.json */,
372393
E573EE0F2136569F00C5E884 /* UserPhoto.jpg */,
@@ -557,6 +578,8 @@
557578
E59EBFEF221D3B6800B4B279 /* MSRetryHandlerOptions.h in Headers */,
558579
E51E616C216DE4D300F1B3C0 /* MSRetryHandler.h in Headers */,
559580
E56B101C2220086300ED640F /* MSRedirectHandlerOptions.h in Headers */,
581+
E54D123222646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.h in Headers */,
582+
E54D123322646CA900EB517A /* MSLargeFileUploadTask.h in Headers */,
560583
E54D1220225B59B300EB517A /* MSPageIterator.h in Headers */,
561584
E5DC73DF211412BF0040BAB6 /* MSGraphClientSDK.h in Headers */,
562585
);
@@ -643,6 +666,7 @@
643666
isa = PBXResourcesBuildPhase;
644667
buildActionMask = 2147483647;
645668
files = (
669+
E54D123B2264858100EB517A /* LargeFileUploadResource.bmp in Resources */,
646670
E54D1225225C9C7B00EB517A /* PagedResponse.json in Resources */,
647671
E573EE102136569F00C5E884 /* UserPhoto.jpg in Resources */,
648672
E52050062175B10800E64160 /* BatchResponse.json in Resources */,
@@ -668,12 +692,14 @@
668692
E5204FFF2173A7C200E64160 /* MSBatchRequestStepTests.m in Sources */,
669693
E52050042174C1DB00E64160 /* MSBatchResponseContentTests.m in Sources */,
670694
E51E616F216E073F00F1B3C0 /* MSRetryHandlerTests.m in Sources */,
695+
E54D123D2264AEBD00EB517A /* MSGraphOneDriveLargeFileUploadTests.m in Sources */,
671696
E56B1022222382E400ED640F /* MSRedirectHandlerOptionsTests.m in Sources */,
672697
E573EE072133FFF200C5E884 /* MSHTTPClientTests.m in Sources */,
673698
E56B102022237F6500ED640F /* MSRetryHandlerOptionsTests.m in Sources */,
674699
E52AD9E6212E8845005FED47 /* MSGraphClientSDKTests.h in Sources */,
675700
E56678302150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m in Sources */,
676701
E52AD9F42133E171005FED47 /* MSURLSessionDownloadTaskTests.m in Sources */,
702+
E54D1237226472FB00EB517A /* MSLargeFileUploadTaskTests.m in Sources */,
677703
E573EE092134167400C5E884 /* MSClientFactoryTests.m in Sources */,
678704
E566782E2150BC4F00C6B7AE /* MSRedirectHandlerTests.m in Sources */,
679705
E54D1223225C882A00EB517A /* MSPageIteratorTests.m in Sources */,
@@ -704,7 +730,9 @@
704730
E5ECE09821427A6400A289C2 /* MSMiddlewareFactory.m in Sources */,
705731
E5204FF3216F1D9900E64160 /* MSBatchRequestStep.m in Sources */,
706732
E56FDB9621D36A98001DFE68 /* MSURLSessionDataTask.m in Sources */,
733+
E54D123422646CA900EB517A /* MSGraphOneDriveLargeFileUploadTask.m in Sources */,
707734
E5DC7405211418050040BAB6 /* MSURLSessionManager.m in Sources */,
735+
E54D123522646CA900EB517A /* MSLargeFileUploadTask.m in Sources */,
708736
E5204FF0216F1D9900E64160 /* MSBatchResponseContent.m in Sources */,
709737
E51E616D216DE4D300F1B3C0 /* MSRetryHandler.m in Sources */,
710738
E5DC7408211418050040BAB6 /* MSURLSessionTaskDelegate.m in Sources */,
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information.
3+
//
4+
#import <Foundation/Foundation.h>
5+
#import "MSLargeFileUploadTask.h"
6+
7+
8+
@class MSGraphOneDriveLargeFileUploadTask;
9+
10+
/**
11+
Completion handler to be called from MSGraphOneDriveLargeFileUploadTask on instance creation.
12+
*/
13+
typedef void (^OneDriveLargeFileUploadTaskInitCompletionHandler)(MSGraphOneDriveLargeFileUploadTask *fileUploadTask, NSData *data, NSURLResponse *response, NSError *error);
14+
15+
/**
16+
This class extends the generic MSLargeFileUploadTask to provide one drive specific dependency injection
17+
*/
18+
@interface MSGraphOneDriveLargeFileUploadTask : MSLargeFileUploadTask
19+
20+
21+
/*
22+
Creates an instance of MSLargeFileUploadTask class. Please not that you will have to call the base class's uploadWithCompletion: method on the instance which gets returned.
23+
@param httpClient Instance of MSHTTPClient which will be used to make API calls
24+
@param fileData Data of the file which needs to be chunked and uploaded.
25+
@param fileName Name of the file which will be given to item after successfull upload.
26+
@param filePath Path of the file where this should be put in the One Drive. For example - Documents/Office/LargeFiles
27+
@param chunkSize Size of a small chunk which the file will be split into. Should be in multiples of 320KB. Default value is 5MB.
28+
@param completionHandler CompletionHandler to be called on completion of this creation process.
29+
*/
30+
+(void)createOneDriveLargeFileUploadTaskWithHTTPClient:(nonnull MSHTTPClient *)httpClient fileData:(nonnull NSData *)fileData fileName:(nonnull NSString *)fileName filePath:(NSString *)filePath andChunkSize:(NSInteger)chunkSize withCompletion:(OneDriveLargeFileUploadTaskInitCompletionHandler)completionHandler;
31+
32+
@end
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//
2+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information.
3+
//
4+
5+
#import "MSGraphOneDriveLargeFileUploadTask.h"
6+
#import "MSConstants.h"
7+
8+
@interface MSGraphOneDriveLargeFileUploadTask()
9+
10+
@end
11+
12+
@implementation MSGraphOneDriveLargeFileUploadTask
13+
14+
15+
+(void)createOneDriveLargeFileUploadTaskWithHTTPClient:(MSHTTPClient *)httpClient fileData:(NSData *)fileData fileName:(NSString *)fileName filePath:(NSString *)filePath andChunkSize:(NSInteger)chunkSize withCompletion:(OneDriveLargeFileUploadTaskInitCompletionHandler)completionHandler
16+
{
17+
NSMutableURLRequest *createSessionRequest = [MSGraphOneDriveLargeFileUploadTask createUploadSessionRequestWithFileName:fileName filePath:filePath];
18+
19+
[MSGraphOneDriveLargeFileUploadTask createUploadSessionFromRequest:createSessionRequest andHTTPClient:httpClient completionBlock:^(id data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
20+
if(!error)
21+
{
22+
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
23+
if(dictionary && [dictionary objectForKey:@"uploadUrl"])
24+
{
25+
completionHandler([[MSGraphOneDriveLargeFileUploadTask alloc] initWithClient:httpClient fileData:fileData uploadSessionDictionary:dictionary andChunkSize:chunkSize], data, response, error);
26+
}else
27+
{
28+
completionHandler(nil, data, response, error);
29+
}
30+
}else
31+
{
32+
completionHandler(nil, data, response, error);
33+
}
34+
}];
35+
36+
}
37+
38+
+ (NSMutableURLRequest *)createUploadSessionRequestWithFileName:(NSString *)fileName filePath:(NSString *)filePath
39+
{
40+
NSString *onerDriveUrlString = [NSString stringWithFormat:@"%@/me/drive/root:/%@/%@:/createUploadSession",MSGraphBaseURL,filePath,fileName];
41+
42+
NSMutableURLRequest *urlReuqest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:onerDriveUrlString]];
43+
[urlReuqest setHTTPMethod:@"POST"];
44+
return urlReuqest;
45+
}
46+
47+
@end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//
2+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information.
3+
//
4+
5+
#import <Foundation/Foundation.h>
6+
#import "MSHTTPClient.h"
7+
8+
#define DefaultChunkSize 5*1024*1024
9+
#define RequiredChunkSizeIncrement 320*1024
10+
11+
/*
12+
This class is Generic base class for large file upload tasks and handles all the basic functionalities of a large file uploader
13+
*/
14+
15+
@interface MSLargeFileUploadTask : NSObject
16+
17+
/*
18+
Initializes and returns an instance of MSLargeFileUploadTask class
19+
@param httpClient Instance of MSHTTPClient which will be used to make API calls
20+
@param fileData Data of the file which needs to be chunked and uploaded.
21+
@param uploadSessionDictionary Dictionary containing upload session url
22+
@param chunkSize Size of a small chunk which the file will be split into. Should be in multiples of 320KB. Default value is 5MB.
23+
@return MSLargeFileUploadTask instance
24+
*/
25+
-(instancetype)initWithClient:(nonnull MSHTTPClient *)httpClient fileData:(nonnull NSData *)fileData uploadSessionDictionary:(nonnull NSDictionary *)uploadSessionDictionary andChunkSize:(NSInteger)chunkSize;
26+
27+
/*
28+
This function will start uploading all the small segments of the file one by one returning the response in completion handler in case there is any error or the upload process gets completed.
29+
@param completionHandler Completion Handler to be calles in event of any error or successfull completion
30+
*/
31+
- (void)uploadWithCompletion:(HTTPRequestCompletionHandler)completionHandler;
32+
33+
/*
34+
This class function can be used to create upload session for a given request object.
35+
@param urlRequest The request object containing target url
36+
@param httpClient The MSHTTPClient object which will be used to make this API call for sesison creation
37+
@param completionHandler The completion handler to be called when this process finishes.
38+
*/
39+
+ (void)createUploadSessionFromRequest:(NSMutableURLRequest *)urlRequest andHTTPClient:(MSHTTPClient *)httpClient completionBlock:(HTTPRequestCompletionHandler)completionHandler;
40+
41+
@end
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//
2+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information.
3+
//
4+
5+
#import "MSLargeFileUploadTask.h"
6+
#import "MSURLSessionDataTask.h"
7+
8+
@interface MSLargeFileUploadTask()
9+
10+
@property (nonatomic, strong) MSHTTPClient *httpClient;
11+
@property (nonatomic, strong) NSData *fileData;
12+
@property (nonatomic, strong) NSDictionary *uploadSessionDictionary;
13+
@property (nonatomic) NSInteger chunkSize;
14+
@property (nonatomic) NSRange currentRange;
15+
16+
@end
17+
18+
@implementation MSLargeFileUploadTask
19+
20+
-(instancetype)initWithClient:(MSHTTPClient *)httpClient fileData:(NSData *)fileData uploadSessionDictionary:(NSDictionary *)uploadSessionDictionary andChunkSize:(NSInteger)chunkSize
21+
{
22+
self = [super init];
23+
if(self)
24+
{
25+
self.httpClient = httpClient;
26+
NSAssert(self.httpClient, @"HTTP Client is requried to make API calls");
27+
self.fileData = fileData;
28+
NSAssert(self.fileData, @"File data should not nil");
29+
NSAssert(self.fileData.length!=0, @"File data should not be empty");
30+
self.uploadSessionDictionary = uploadSessionDictionary;
31+
NSAssert([self.uploadSessionDictionary objectForKey:@"uploadUrl"], @"UploadSessionDictionary should contain a uploadUrl key");
32+
self.chunkSize = chunkSize<=0 ? DefaultChunkSize : chunkSize;
33+
NSAssert(self.chunkSize % RequiredChunkSizeIncrement ==0, @"Chunk size must be a multiple of 320 KiB");
34+
35+
self.currentRange = NSMakeRange(0, self.chunkSize);
36+
}
37+
return self;
38+
}
39+
40+
- (void)uploadWithCompletion:(HTTPRequestCompletionHandler)completionHandler
41+
{
42+
[self uploadNextSegmentWithCompletion:completionHandler];
43+
}
44+
45+
- (void)setNextRange
46+
{
47+
NSInteger start = self.currentRange.location+self.currentRange.length;
48+
NSInteger length = start+_chunkSize>self.fileData.length?self.fileData.length-start:_chunkSize;
49+
self.currentRange = NSMakeRange(start,length);
50+
}
51+
52+
- (void)uploadNextSegmentWithCompletion:(HTTPRequestCompletionHandler)completionHandler
53+
{
54+
//Create request
55+
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:self.uploadSessionDictionary[@"uploadUrl"]]];
56+
57+
//Set headers
58+
[urlRequest setValue:[NSString stringWithFormat:@"%ld",(long)_chunkSize] forHTTPHeaderField:@"Content-Length"];
59+
[urlRequest setValue:[NSString stringWithFormat:@"bytes %lu-%lu/%lu",(unsigned long)self.currentRange.location,(unsigned long)self.currentRange.location+self.currentRange.length-1,(unsigned long)self.fileData.length] forHTTPHeaderField:@"Content-Range"];
60+
61+
//Set method
62+
[urlRequest setHTTPMethod:@"PUT"];
63+
64+
//Set http body
65+
NSData *subData = [self.fileData subdataWithRange:self.currentRange];
66+
[urlRequest setHTTPBody:subData];
67+
68+
//Start upload
69+
MSURLSessionDataTask *uploadTask = [self.httpClient dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
70+
if([(NSHTTPURLResponse *)response statusCode] == MSExpectedResponseCodesAccepted)
71+
{
72+
[self setNextRange];
73+
[self uploadNextSegmentWithCompletion:completionHandler];
74+
}else
75+
{
76+
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
77+
if(dataDict[@"id"])
78+
{
79+
completionHandler(data, response, error);
80+
}else
81+
{
82+
[self uploadNextSegmentWithCompletion:completionHandler];
83+
}
84+
}
85+
86+
}];
87+
[uploadTask execute];
88+
}
89+
90+
+ (void)createUploadSessionFromRequest:(NSMutableURLRequest *)urlRequest andHTTPClient:(MSHTTPClient *)httpClient completionBlock:(HTTPRequestCompletionHandler)completionHandler
91+
{
92+
MSURLSessionDataTask *dataTask = [httpClient dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
93+
completionHandler(data, response, error);
94+
}];
95+
[dataTask execute];
96+
}
97+
98+
@end

MSGraphClientSDK/MSGraphClientSDK/MSGraphClientSDK.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ FOUNDATION_EXPORT const unsigned char MSGraphClientSDKVersionString[];
4545
#import "MSGraphClientSDK/MSRedirectHandlerOptions.h"
4646

4747
#import "MSGraphClientSDK/MSPageIterator.h"
48+
#import "MSGraphClientSDK/MSLargeFileUploadTask.h"
49+
#import "MSGraphClientSDK/MSGraphOneDriveLargeFileUploadTask.h"
4850

4951
#endif
5052

0 commit comments

Comments
 (0)