CocoaShare/Classes/Dropbox/MGMDropboxPlugIn.m

250 lines
9.4 KiB
Objective-C

//
// MGMDropboxPlugIn.m
// CocoaShare
//
// Created by Mr. Gecko on 1/19/11.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMDropboxPlugIn.h"
#import "MGMController.h"
#import "MGMAddons.h"
NSString * const MGMCopyright = @"Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/";
NSString * const MGMDropboxEmail = @"MGMDropboxUser";
NSString * const MGMDropboxPath = @"MGMDropboxPath";
#warning Add and remove the keys when publishing source code.
NSString * const MGMDropboxKey = @"";
NSString * const MGMDropboxSecret = @"";
NSString * const MGMDropboxPublic = @"/Public";
NSString * const MGMDropboxFPath = @"path";
NSString * const MGMDropboxFContents = @"contents";
@implementation MGMDropboxPlugIn
- (void)dealloc {
[self releaseView];
[publicFolder release];
[dropboxSession release];
[dropbox release];
[dropboxAccountInfo release];
[filePath release];
[super dealloc];
}
- (BOOL)isAccountPlugIn {
return YES;
}
- (NSString *)plugInName {
return @"Dropbox";
}
- (NSView *)plugInView {
if (view==nil) {
if (![NSBundle loadNibNamed:@"DropboxAccountPane" owner:self]) {
NSLog(@"Unable to load Dropbox Account Pane");
} else {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *user = [defaults objectForKey:MGMDropboxEmail];
if (user!=nil)
[emailField setStringValue:user];
NSString *password = [[MGMController sharedController] password];
if (password!=nil)
[passwordField setStringValue:password];
if (loggedIn) {
loadingPublic = YES;
[dropbox loadMetadata:MGMDropboxPublic];
}
}
}
return view;
}
- (void)releaseView {
[view release];
view = nil;
emailField = nil;
passwordField = nil;
loginButton = nil;
publicOutline = nil;
[publicFolder release];
publicFolder = nil;
}
- (void)setCurrentPlugIn:(BOOL)isCurrent {
if (isCurrent) {
dropboxSession = [[DBSession alloc] initWithConsumerKey:MGMDropboxKey consumerSecret:MGMDropboxSecret];
[DBSession setSharedSession:dropboxSession];
dropbox = [[DBRestClient alloc] initWithSession:dropboxSession];
[dropbox setDelegate:self];
userLoggingIn = NO;
[self login];
} else {
[dropboxSession release];
dropboxSession = nil;
[dropbox release];
dropbox = nil;
[dropboxAccountInfo release];
dropboxAccountInfo = nil;
loggedIn = NO;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:MGMDropboxEmail];
[defaults removeObjectForKey:MGMDropboxPath];
[dropboxSession updateAccessToken:nil accessTokenSecret:nil];
}
}
- (void)login {
NSString *user = [[NSUserDefaults standardUserDefaults] objectForKey:MGMDropboxEmail];
NSString *password = [[MGMController sharedController] password];
if (user!=nil)
[dropbox loginWithEmail:user password:password];
}
- (void)lockLogin {
[emailField setEnabled:NO];
[passwordField setEnabled:NO];
[loginButton setEnabled:NO];
[loginButton setTitle:[@"Logging In" localizedFor:self]];
}
- (void)unlockLogin {
[emailField setEnabled:YES];
[passwordField setEnabled:YES];
[loginButton setEnabled:YES];
[loginButton setTitle:[@"Login" localizedFor:self]];
}
- (IBAction)login:(id)sender {
if ([[emailField stringValue] isEqual:@""]) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Email Required" localizedFor:self]];
[alert setInformativeText:[@"Please enter your email." localizedFor:self]];
[alert runModal];
} else if ([[passwordField stringValue] isEqual:@""]) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Password Required" localizedFor:self]];
[alert setInformativeText:[@"Please enter your password." localizedFor:self]];
[alert runModal];
} else {
userLoggingIn = YES;
[[MGMController sharedController] setPassword:[passwordField stringValue]];
[[NSUserDefaults standardUserDefaults] setObject:[emailField stringValue] forKey:MGMDropboxEmail];
[self lockLogin];
[self login];
}
}
- (void)restClient:(DBRestClient *)client loginFailedWithError:(NSError *)error {
NSLog(@"Dropbox Error: %@", error);
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Account Error" localizedFor:self]];
[alert setInformativeText:[error localizedDescription]];
[alert runModal];
[self unlockLogin];
}
- (void)restClientDidLogin:(DBRestClient *)client {
NSLog(@"Dropbox: Logged in.");
loggedIn = YES;
[dropbox loadAccountInfo];
if (userLoggingIn) {
loadingPublic = YES;
[dropbox loadMetadata:MGMDropboxPublic];
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Login Successful" localizedFor:self]];
[alert setInformativeText:[@"You have successfully logged into your account." localizedFor:self]];
[alert runModal];
[self unlockLogin];
}
}
- (NSDictionary *)dataForPath:(NSString *)thePath inArray:(NSArray *)theArray {
for (unsigned long i=0; i<[theArray count]; i++) {
NSDictionary *thisData = [theArray objectAtIndex:i];
if ([[thisData objectForKey:MGMDropboxFPath] isEqual:thePath])
return thisData;
NSDictionary *data = [self dataForPath:thePath inArray:[thisData objectForKey:MGMDropboxFContents]];
if (data!=nil)
return data;
}
return nil;
}
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
NSMutableArray *currentArray = nil;
if ([[metadata path] isEqual:MGMDropboxPublic]) {
loadingPublic = NO;
[publicFolder release];
publicFolder = [NSMutableArray new];
currentArray = publicFolder;
} else {
currentArray = [[self dataForPath:[metadata path] inArray:publicFolder] objectForKey:MGMDropboxFContents];
}
NSArray *metadataContents = [metadata contents];
for (unsigned long i=0; i<[metadataContents count]; i++) {
if ([[metadataContents objectAtIndex:i] isDirectory]) {
DBMetadata *thisMetadata = [metadataContents objectAtIndex:i];
[dropbox loadMetadata:[thisMetadata path]];
[currentArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:[thisMetadata path], MGMDropboxFPath, [NSMutableArray array], MGMDropboxFContents, nil]];
}
}
[publicOutline reloadData];
}
- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(NSDictionary *)item {
return (item==nil ? [publicFolder count] : [[item objectForKey:MGMDropboxFContents] count]);
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(NSDictionary *)item {
if ([[tableColumn identifier] isEqual:@"name"]) {
return [[item objectForKey:MGMDropboxFPath] lastPathComponent];
} else if ([[tableColumn identifier] isEqual:@"selected"]) {
return [NSNumber numberWithBool:([[item objectForKey:MGMDropboxFPath] isEqual:[[NSUserDefaults standardUserDefaults] objectForKey:MGMDropboxPath]])];
}
return @"";
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(NSDictionary *)item {
return (item==nil ? ([publicFolder count]>0) : ([[item objectForKey:MGMDropboxFContents] count]>0));
}
- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(NSDictionary *)item {
return (item==nil ? [publicFolder objectAtIndex:index] : [[item objectForKey:MGMDropboxFContents] objectAtIndex:index]);
}
- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(NSDictionary *)item {
if ([object boolValue])
[[NSUserDefaults standardUserDefaults] setObject:[item objectForKey:MGMDropboxFPath] forKey:MGMDropboxPath];
else
[[NSUserDefaults standardUserDefaults] removeObjectForKey:MGMDropboxPath];
[publicOutline reloadData];
}
- (void)restClient:(DBRestClient *)client loadedAccountInfo:(DBAccountInfo *)info {
[dropboxAccountInfo release];
dropboxAccountInfo = [info retain];
}
- (void)restClient:(DBRestClient *)client loadAccountInfoFailedWithError:(NSError *)error {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Account Error" localizedFor:self]];
[alert setInformativeText:[@"Unable to get your account ID." localizedFor:self]];
[alert runModal];
}
- (void)sendFileAtPath:(NSString *)thePath withName:(NSString *)theName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:MGMDropboxEmail]==nil) {
NSError *error = [NSError errorWithDomain:[[NSBundle bundleForClass:[self class]] bundleIdentifier] code:5 userInfo:[NSDictionary dictionaryWithObject:[@"Account is not logged in." localizedFor:self] forKey:NSLocalizedDescriptionKey]];
[[MGMController sharedController] upload:thePath receivedError:error];
return;
}
NSString *path = [[NSUserDefaults standardUserDefaults] objectForKey:MGMDropboxPath];
if (path==nil) path = MGMDropboxPublic;
filePath = [thePath retain];
[dropbox uploadFile:theName toPath:path fromPath:thePath];
}
- (void)restClient:(DBRestClient *)client uploadedFile:(NSString *)destPath from:(NSString *)srcPath {
NSString *finishPath = [[filePath retain] autorelease];
[filePath release];
filePath = nil;
NSString *url = [NSString stringWithFormat:@"http://dl.dropbox.com/u/%@%@", [dropboxAccountInfo userId], [destPath replace:MGMDropboxPublic with:@""]];
[[MGMController sharedController] uploadFinished:finishPath url:[NSURL URLWithString:url]];
}
- (void)restClient:(DBRestClient *)client uploadFileFailedWithError:(NSError *)error {
NSString *finishPath = [[filePath retain] autorelease];
[filePath release];
filePath = nil;
[[MGMController sharedController] upload:finishPath receivedError:error];
}
@end