2011-02-01 09:51:02 -06:00
//
// MGMMobileMePlugIn . m
// CocoaShare
//
2011-02-02 14:58:24 -06:00
// Created by Mr . Gecko on 1 / 29 / 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 "MGMMobileMePlugIn.h"
# import "MGMController.h"
# import "MGMWebDav.h"
# import "MGMAddons.h"
NSString * const MGMCopyright = @ "Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/" ;
NSString * const MGMMobileMeUser = @ "MGMMobileMeUser" ;
NSString * const MGMMobileMePath = @ "MGMMobileMePath" ;
NSString * const MGMMobileMePublic = @ "/Public/" ;
NSString * const MGMMobileMeFPath = @ "path" ;
NSString * const MGMMobileMeFContents = @ "contents" ;
@ implementation MGMMobileMePlugIn
- ( void ) dealloc {
[ self releaseView ] ;
[ publicFolder release ] ;
[ webDav release ] ;
[ filePath release ] ;
[ super dealloc ] ;
}
- ( BOOL ) isAccountPlugIn {
return YES ;
}
- ( NSString * ) plugInName {
return @ "MobileMe" ;
}
- ( NSView * ) plugInView {
if ( view = = nil ) {
if ( ! [ NSBundle loadNibNamed : @ "MobileMeAccountPane" owner : self ] ) {
NSLog ( @ "Unable to load MobileMe Account Pane" ) ;
} else {
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
NSString * user = [ defaults objectForKey : MGMMobileMeUser ] ;
if ( user ! = nil )
[ userField setStringValue : user ] ;
NSString * password = [ [ MGMController sharedController ] password ] ;
if ( password ! = nil )
[ passwordField setStringValue : password ] ;
if ( loggedIn ) {
loadingPublic = YES ;
MGMWebDavPropFind * propFind = [ MGMWebDavPropFind propfindAtURI : MGMMobileMePublic ] ;
[ propFind addProperty : MGMWebDavPResourceType ] ;
[ propFind setDepth : 1 ] ;
[ webDav addHandler : propFind ] ;
}
}
}
return view ;
}
- ( void ) releaseView {
[ view release ] ;
view = nil ;
userField = nil ;
passwordField = nil ;
loginButton = nil ;
publicOutline = nil ;
[ publicFolder release ] ;
publicFolder = nil ;
}
- ( void ) setCurrentPlugIn : ( BOOL ) isCurrent {
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
if ( isCurrent ) {
webDav = [ [ MGMWebDav webDavWithDelegate : self ] retain ] ;
userLoggingIn = YES ;
[ self login ] ;
} else {
[ webDav release ] ;
loggedIn = NO ;
[ defaults removeObjectForKey : MGMMobileMeUser ] ;
[ defaults removeObjectForKey : MGMMobileMePath ] ;
}
}
- ( void ) lockLogin {
[ userField 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 {
[ userField 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
}
- ( void ) login {
NSString * user = [ [ NSUserDefaults standardUserDefaults ] objectForKey : MGMMobileMeUser ] ;
NSString * password = [ [ MGMController sharedController ] password ] ;
if ( user ! = nil ) {
[ webDav setRootURL : [ NSURL URLWithString : [ NSString stringWithFormat : @ "https://idisk.mac.com/%@/" , user ] ] ] ;
[ webDav setUser : user password : password ] ;
MGMWebDavOptions * options = [ MGMWebDavOptions optionsAtURI : nil ] ;
[ webDav addHandler : options ] ;
}
}
- ( IBAction ) login : ( id ) sender {
if ( [ userField isEqual : @ "" ] ) {
NSAlert * alert = [ [ NSAlert new ] autorelease ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "UserName Required" localizedFor : self ] ] ;
[ alert setInformativeText : [ @ "Please enter your username." localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ alert runModal ] ;
} else {
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
[ [ MGMController sharedController ] setPassword : [ passwordField stringValue ] ] ;
NSString * user = [ [ userField stringValue ] lowercaseString ] ;
NSRange range = [ user rangeOfString : @ "@" ] ;
if ( range . location ! = NSNotFound )
user = [ user substringToIndex : range . location ] ;
[ defaults setObject : user forKey : MGMMobileMeUser ] ;
[ self lockLogin ] ;
userLoggingIn = NO ;
[ webDav cancelAll ] ;
[ self login ] ;
}
}
- ( void ) webDav : ( MGMWebDav * ) theSender error : ( NSError * ) theError recevingOptions : ( MGMWebDavOptions * ) theOptions {
NSLog ( @ "MobileMe Error: %@" , theError ) ;
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 : [ theError localizedDescription ] ] ;
[ alert runModal ] ;
[ self unlockLogin ] ;
}
- ( void ) webDav : ( MGMWebDav * ) theSender receivedOptions : ( MGMWebDavOptions * ) theOptions {
loadingPublic = NO ;
MGMWebDavPropFind * propFind = [ MGMWebDavPropFind propfindAtURI : nil ] ;
[ propFind addProperty : MGMWebDavPResourceType ] ;
[ webDav addHandler : propFind ] ;
}
- ( void ) webDav : ( MGMWebDav * ) theSender error : ( NSError * ) theError recevingProperties : ( MGMWebDavPropFind * ) thePropFind {
NSLog ( @ "MobileMe Error: %@" , theError ) ;
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 : [ theError localizedDescription ] ] ;
[ 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 : MGMMobileMeFPath ] isEqual : thePath ] )
return thisData ;
NSDictionary * data = [ self dataForPath : thePath inArray : [ thisData objectForKey : MGMMobileMeFContents ] ] ;
if ( data ! = nil )
return data ;
}
return nil ;
}
- ( void ) webDav : ( MGMWebDav * ) theSender receivedProperties : ( MGMWebDavPropFind * ) thePropFind {
NSArray * contents = [ thePropFind contents ] ;
if ( loadingPublic && [ contents count ] > 0 ) {
NSMutableArray * currentArray = nil ;
if ( [ [ [ contents objectAtIndex : 0 ] objectForKey : MGMWebDavPURI ] isEqual : MGMMobileMePublic ] ) {
loadingPublic = NO ;
[ publicFolder release ] ;
publicFolder = [ NSMutableArray new ] ;
currentArray = publicFolder ;
} else {
currentArray = [ [ self dataForPath : [ [ contents objectAtIndex : 0 ] objectForKey : MGMWebDavPURI ] inArray : publicFolder ] objectForKey : MGMMobileMeFContents ] ;
}
for ( unsigned long i = 1 ; i < [ contents count ] ; i + + ) {
NSDictionary * content = [ contents objectAtIndex : i ] ;
if ( [ [ content objectForKey : MGMWebDavPResourceType ] isEqual : MGMWebDavPRCollection ] ) {
[ currentArray addObject : [ NSDictionary dictionaryWithObjectsAndKeys : [ content objectForKey : MGMWebDavPURI ] , MGMMobileMeFPath , [ NSMutableArray array ] , MGMMobileMeFContents , nil ] ] ;
}
}
[ publicOutline reloadData ] ;
} else {
if ( [ contents count ] > 0 ) {
if ( [ [ [ contents objectAtIndex : 0 ] objectForKey : MGMWebDavPResourceType ] isEqual : MGMWebDavPRCollection ] ) {
loggedIn = YES ;
if ( ! userLoggingIn ) {
loadingPublic = YES ;
MGMWebDavPropFind * propFind = [ MGMWebDavPropFind propfindAtURI : MGMMobileMePublic ] ;
[ propFind addProperty : MGMWebDavPResourceType ] ;
[ propFind setDepth : 1 ] ;
[ webDav addHandler : propFind ] ;
NSAlert * alert = [ [ NSAlert new ] autorelease ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "Login Successful" localizedFor : self ] ] ;
2011-02-12 09:17:28 -06:00
[ alert setInformativeText : [ @ "You have successfully logged into your account." localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ alert runModal ] ;
[ self unlockLogin ] ;
}
return ;
}
}
NSAlert * alert = [ [ NSAlert new ] autorelease ] ;
2011-02-02 14:58:24 -06:00
[ alert setMessageText : [ @ "Account Error" localizedFor : self ] ] ;
[ alert setInformativeText : [ @ "The URL you have entered does not appear to be a directory." localizedFor : self ] ] ;
2011-02-01 09:51:02 -06:00
[ alert runModal ] ;
[ self unlockLogin ] ;
}
}
- ( int ) outlineView : ( NSOutlineView * ) outlineView numberOfChildrenOfItem : ( NSDictionary * ) item {
return ( item = = nil ? [ publicFolder count ] : [ [ item objectForKey : MGMMobileMeFContents ] count ] ) ;
}
- ( id ) outlineView : ( NSOutlineView * ) outlineView objectValueForTableColumn : ( NSTableColumn * ) tableColumn byItem : ( NSDictionary * ) item {
if ( [ [ tableColumn identifier ] isEqual : @ "name" ] ) {
return [ [ item objectForKey : MGMMobileMeFPath ] lastPathComponent ] ;
} else if ( [ [ tableColumn identifier ] isEqual : @ "selected" ] ) {
return [ NSNumber numberWithBool : ( [ [ item objectForKey : MGMMobileMeFPath ] isEqual : [ [ NSUserDefaults standardUserDefaults ] objectForKey : MGMMobileMePath ] ] ) ] ;
}
return @ "" ;
}
- ( BOOL ) outlineView : ( NSOutlineView * ) outlineView isItemExpandable : ( NSDictionary * ) item {
return ( item = = nil ? ( [ publicFolder count ] > 0 ) : ( [ [ item objectForKey : MGMMobileMeFContents ] count ] > 0 ) ) ;
}
- ( id ) outlineView : ( NSOutlineView * ) outlineView child : ( int ) index ofItem : ( NSDictionary * ) item {
return ( item = = nil ? [ publicFolder objectAtIndex : index ] : [ [ item objectForKey : MGMMobileMeFContents ] objectAtIndex : index ] ) ;
}
- ( void ) outlineView : ( NSOutlineView * ) outlineView setObjectValue : ( id ) object forTableColumn : ( NSTableColumn * ) tableColumn byItem : ( NSDictionary * ) item {
if ( [ object boolValue ] )
[ [ NSUserDefaults standardUserDefaults ] setObject : [ item objectForKey : MGMMobileMeFPath ] forKey : MGMMobileMePath ] ;
else
[ [ NSUserDefaults standardUserDefaults ] removeObjectForKey : MGMMobileMePath ] ;
[ publicOutline reloadData ] ;
}
- ( void ) sendFileAtPath : ( NSString * ) thePath withName : ( NSString * ) theName {
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
if ( [ defaults objectForKey : MGMMobileMeUser ] = = 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 ;
}
[ filePath release ] ;
filePath = [ thePath retain ] ;
NSString * path = [ [ NSUserDefaults standardUserDefaults ] objectForKey : MGMMobileMePath ] ;
if ( path = = nil ) path = MGMMobileMePublic ;
MGMWebDavPut * put = [ MGMWebDavPut putAtURI : [ path stringByAppendingPathComponent : theName ] ] ;
[ put setData : [ NSData dataWithContentsOfFile : thePath ] ] ;
[ webDav addHandler : put ] ;
}
- ( void ) webDav : ( MGMWebDav * ) theSender error : ( NSError * ) theError putting : ( MGMWebDavPut * ) thePut {
NSString * finishPath = [ [ filePath retain ] autorelease ] ;
[ filePath release ] ;
filePath = nil ;
[ [ MGMController sharedController ] upload : finishPath receivedError : theError ] ;
}
- ( void ) webDav : ( MGMWebDav * ) theSender successfullyPut : ( MGMWebDavPut * ) thePut {
NSString * finishPath = [ [ filePath retain ] autorelease ] ;
[ filePath release ] ;
filePath = nil ;
NSString * url = [ NSString stringWithFormat : @ "https://public.me.com/ix/%@/%@" , [ [ NSUserDefaults standardUserDefaults ] objectForKey : MGMMobileMeUser ] , [ [ thePut URI ] replace : MGMMobileMePublic with : @ "" ] ] ;
[ [ MGMController sharedController ] uploadFinished : finishPath url : [ NSURL URLWithString : url ] ] ;
}
@ end