diff --git a/FMC Planner 2/DropboxV2ObjC.h b/FMC Planner 2/DropboxV2ObjC.h index 71788d1..7cc0b0b 100644 --- a/FMC Planner 2/DropboxV2ObjC.h +++ b/FMC Planner 2/DropboxV2ObjC.h @@ -13,15 +13,16 @@ @interface DropboxV2ObjC : NSObject @property(strong, nonatomic) NSString *token; +/// No trailing slash @property(strong, nonatomic) NSString *rootDirectory; @property(strong, nonatomic) NSData *kJSONNullObject; @property(strong, nonatomic) NSURLProtectionSpace *kDropboxProtectionSpace; - (BOOL)authorizeUserWithToke:(NSURL *)token completion:(void (^)(void))handler; -- (NSData *)downloadFromDropbox; +- (void)downloadFromDropbox:(NSArray *)files; - (void)uploadToDropbox:(NSData *)data; - (NSArray *)contentsOfPath:(NSString *)path; - (NSDictionary *)getUserInfo; -- (BOOL)deauthorizeUser; +- (void)deauthorizeUser; @end diff --git a/FMC Planner 2/DropboxV2ObjC.m b/FMC Planner 2/DropboxV2ObjC.m index 2dd937a..a52435d 100644 --- a/FMC Planner 2/DropboxV2ObjC.m +++ b/FMC Planner 2/DropboxV2ObjC.m @@ -9,10 +9,9 @@ #import "DropboxV2ObjC.h" @implementation DropboxV2ObjC - - (DropboxV2ObjC *)init { self = [super init]; - self.rootDirectory = @"/Apps/FMC Planner 2/"; + self.rootDirectory = @""; self.kJSONNullObject = [@"null" dataUsingEncoding:NSASCIIStringEncoding]; self.kDropboxProtectionSpace = [[NSURLProtectionSpace alloc] initWithHost:@"dropbox" @@ -24,7 +23,6 @@ } #pragma mark - OAuth stuff - - (BOOL)authorizeUserWithToke:(NSURL *)token completion:(void (^)(void))handler { NSScanner *scan = [NSScanner scannerWithString:token.absoluteString]; @@ -52,18 +50,131 @@ return true; } -- (BOOL)deauthorizeUser { - NSDictionary *credentials = - [[NSURLCredentialStorage sharedCredentialStorage] - credentialsForProtectionSpace:_kDropboxProtectionSpace]; - NSURLCredential *credential = [credentials.objectEnumerator nextObject]; - [[NSURLCredentialStorage sharedCredentialStorage] - removeCredential:credential - forProtectionSpace:_kDropboxProtectionSpace]; - return true; +- (void)deauthorizeUser { + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; + request.URL = [NSURL + URLWithString:@"https://api.dropboxapi.com/1/disable_access_token"]; + [request addValue:[NSString stringWithFormat:@"Bearer %@", _token] + .precomposedStringWithCanonicalMapping + forHTTPHeaderField:(@"Authorization") + .precomposedStringWithCanonicalMapping]; + [request addValue:(@"application/json") + .precomposedStringWithCanonicalMapping + forHTTPHeaderField:(@"Content-Type") + .precomposedStringWithCanonicalMapping]; + request.HTTPMethod = @"POST"; + request.HTTPBody = _kJSONNullObject; + + [NSURLConnection sendAsynchronousRequest:request + queue:[[NSOperationQueue alloc] init] + completionHandler:^(NSURLResponse *response, + NSData *data, NSError *error) { + if ([[NSJSONSerialization + JSONObjectWithData:data + options:0 + error:nil] isEqualToDictionary + : @{}]) { + NSDictionary *credentials = + [[NSURLCredentialStorage sharedCredentialStorage] + credentialsForProtectionSpace: + _kDropboxProtectionSpace]; + NSURLCredential *credential = + [credentials.objectEnumerator nextObject]; + [[NSURLCredentialStorage sharedCredentialStorage] + removeCredential:credential + forProtectionSpace:_kDropboxProtectionSpace]; + } + + }]; } #pragma mark - File and directory operations +/** + * Pass nil as path for root dir + * @return Content of directory at path or nil if error + */ +- (NSArray *)contentsOfPath:(NSString *)path { + + if (path == nil) { + path = _rootDirectory; + } else { + path = [path + stringByAppendingString:[NSString stringWithFormat:@"/%@", path]]; + } + + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; + request.URL = + [NSURL URLWithString:@"https://api.dropboxapi.com/2/files/list_folder"]; + [request addValue:[NSString stringWithFormat:@"Bearer %@", _token] + .precomposedStringWithCanonicalMapping + forHTTPHeaderField:(@"Authorization") + .precomposedStringWithCanonicalMapping]; + [request addValue:(@"application/json") + .precomposedStringWithCanonicalMapping + forHTTPHeaderField:(@"Content-Type") + .precomposedStringWithCanonicalMapping]; + request.HTTPMethod = @"POST"; + NSData *data = [NSJSONSerialization dataWithJSONObject:@{ + @"path" : path.precomposedStringWithCanonicalMapping + } + options:0 + error:nil]; + NSString *temp = + [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; + temp = [temp stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"]; + request.HTTPBody = [temp dataUsingEncoding:NSASCIIStringEncoding]; + NSURLResponse *response = nil; + NSError *error = nil; + id dataOut = + [self parseJSON:[NSURLConnection sendSynchronousRequest:request + returningResponse:&response + error:&error]]; + if ([dataOut isKindOfClass:[NSDictionary class]]) { + return [dataOut valueForKey:@"entries"]; + } else { + return nil; + } +} + +- (void)downloadFromDropbox:(NSArray *)files { + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; + request.URL = [NSURL + URLWithString:@"https://content.dropboxapi.com/2/files/download"]; + [request addValue:[NSString stringWithFormat:@"Bearer %@", _token] + .precomposedStringWithCanonicalMapping + forHTTPHeaderField:(@"Authorization") + .precomposedStringWithCanonicalMapping]; + [request addValue:(@"").precomposedStringWithCanonicalMapping + forHTTPHeaderField:(@"Content-Type")]; + request.HTTPMethod = @"POST"; + request.HTTPBody = nil; + + // File Path + for (NSString *string in files) { + NSData *data = [NSJSONSerialization dataWithJSONObject:@{ + @"path" : [NSString stringWithFormat:@"/%@", string] + .precomposedStringWithCanonicalMapping + } + options:0 + error:nil]; + NSString *temp = + [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; + temp = + [temp stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"]; + + [request addValue:temp.precomposedStringWithCanonicalMapping + forHTTPHeaderField:(@"Dropbox-API-Arg") + .precomposedStringWithCanonicalMapping]; + + NSURLResponse *response = nil; + NSError *error = nil; + NSData *dataOut = [NSURLConnection sendSynchronousRequest:request + returningResponse:&response + error:&error]; + [dataOut writeToFile:[SharedDeclerations savePathForFile:string] + atomically:YES]; + } +} #pragma mark - Other operations diff --git a/FMC Planner 2/TableViewController.m b/FMC Planner 2/TableViewController.m index 989c3ff..0108d5b 100644 --- a/FMC Planner 2/TableViewController.m +++ b/FMC Planner 2/TableViewController.m @@ -84,14 +84,15 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [self - dismissViewControllerAnimated:YES - completion:^(void) { - [_main - loadSave:[tableView - cellForRowAtIndexPath:indexPath] - .textLabel.text]; - }]; + if ([self.title isEqualToString:@"Manage"]) { + [self dismissViewControllerAnimated:YES + completion:^(void) { + [_main loadSave:[tableView + cellForRowAtIndexPath: + indexPath] + .textLabel.text]; + }]; + } } @end diff --git a/FMC Planner 2/ViewControllerServiceMenu.m b/FMC Planner 2/ViewControllerServiceMenu.m index 7726c1c..87185f1 100644 --- a/FMC Planner 2/ViewControllerServiceMenu.m +++ b/FMC Planner 2/ViewControllerServiceMenu.m @@ -46,9 +46,8 @@ #pragma mark - Dropbox Button +// Standard action (hence set), dnamically set and unset - (IBAction)dbConnect:(UIButton *)sender { - DropboxV2ObjC *dbClient = - ((AppDelegate *)[UIApplication sharedApplication].delegate).dbClient; UIViewController *webController = [[UIViewController alloc] init]; webController.title = @"Dropbox"; UIWebView *web = [[UIWebView alloc] initWithFrame:webController.view.frame]; @@ -65,6 +64,7 @@ @"uri=x-fmc:/"]]]; } +// Dynamically set and unset - (IBAction)dbDisconnect:(UIButton *)sender { DropboxV2ObjC *dbClient = ((AppDelegate *)[UIApplication sharedApplication].delegate).dbClient; @@ -83,7 +83,13 @@ - (IBAction)testing:(id)sender { DropboxV2ObjC *dbClient = ((AppDelegate *)[UIApplication sharedApplication].delegate).dbClient; - [dbClient getUserInfo]; + NSLog(@"%@", [dbClient contentsOfPath:nil]); + [dbClient downloadFromDropbox:@[ + @"lol.txt", + @"rofl.txt", + @"tldr.txt", + @"lol Kopie 3.txt" + ]]; } @end