2011-02-01 09:51:02 -06:00
//
// MGMDropboxPlugIn . m
// CocoaShare
//
2011-02-02 14:58:24 -06:00
// Created by Mr . Gecko on 1 / 19 / 11.
2011-02-01 09:51:02 -06:00
// 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 ] ;
2011-02-02 14:58:24 -06:00
[ loginButton setTitle : [ @ "Logging In" localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
}
- ( void ) unlockLogin {
[ emailField setEnabled : YES ] ;
[ passwordField setEnabled : YES ] ;
[ loginButton setEnabled : YES ] ;
2011-02-02 14:58:24 -06:00
[ loginButton setTitle : [ @ "Login" localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
}
- ( IBAction ) login : ( id ) sender {
if ( [ [ emailField stringValue ] isEqual : @ "" ] ) {
NSAlert * alert = [ [ NSAlert new ] autorelease ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "Email Required" localizedFor : self ] ] ;
[ alert setInformativeText : [ @ "Please enter your email." localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ alert runModal ] ;
} else if ( [ [ passwordField stringValue ] isEqual : @ "" ] ) {
NSAlert * alert = [ [ NSAlert new ] autorelease ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "Password Required" localizedFor : self ] ] ;
[ alert setInformativeText : [ @ "Please enter your password." localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ 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 ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "Account Error" localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ 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 ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "Login Successful" localizedFor : self ] ] ;
[ alert setInformativeText : [ @ "You have sucessfully logged into your account." localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ 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 ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "Account Error" localizedFor : self ] ] ;
[ alert setInformativeText : [ @ "Unable to get your account ID." localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ alert runModal ] ;
}
- ( void ) sendFileAtPath : ( NSString * ) thePath withName : ( NSString * ) theName {
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
if ( [ defaults objectForKey : MGMDropboxEmail ] = = nil ) {
2011-02-02 14:58:24 -06:00
NSError * error = [ NSError errorWithDomain : [ [ NSBundle bundleForClass : [ self class ] ] bundleIdentifier ] code : 5 userInfo : [ NSDictionary dictionaryWithObject : [ @ "Account is not logged in." localizedFor : self ] forKey : NSLocalizedDescriptionKey ] ] ;
2011-02-01 09:51:02 -06:00
[ [ 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