X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/46b610a25dea1e26f1348dac4024d72514130bb3..57e47909ea593126a1055a5b077e7531c2fafb30:/PreferencesController.m?ds=sidebyside diff --git a/PreferencesController.m b/PreferencesController.m index f8245d2..0a796dc 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -6,6 +6,7 @@ #import "StatusWindow.h" #import "StatusWindowController.h" #import "CustomMenuTableView.h" +#import "AudioscrobblerController.h" #import @@ -15,25 +16,11 @@ #import #import -#import - -#import -#import -#import -#import -#import - +#import #import -#import -#import -#import -#import -#import -#import - #define SENDER_STATE (([sender state] == NSOnState) ? YES : NO) -#define AUDIOSCROBBLER_KEYCHAIN_SERVICE "MenuTunes: Audioscrobbler" +#define AUDIOSCROBBLER_KEYCHAIN_SERVICE(user) [[NSString stringWithFormat:@"Audioscrobbler: %@", user] UTF8String] #define AUDIOSCROBBLER_KEYCHAIN_KIND "application password" /*************************************************************************/ @@ -85,6 +72,10 @@ static PreferencesController *prefs = nil; SecKeychainAttribute attributes[3]; SecKeychainAttributeList list; + if ((user == nil) || ([user length] == 0)) { + return nil; + } + ITDebugLog(@"Audioscrobbler: Searching for keychain item for %@.", user); attributes[0].tag = kSecAccountItemAttr; attributes[0].data = (char *)[user UTF8String]; @@ -93,8 +84,8 @@ static PreferencesController *prefs = nil; attributes[1].data = AUDIOSCROBBLER_KEYCHAIN_KIND; attributes[1].length = strlen(AUDIOSCROBBLER_KEYCHAIN_KIND); attributes[2].tag = kSecLabelItemAttr; - attributes[2].data = AUDIOSCROBBLER_KEYCHAIN_SERVICE; - attributes[2].length = strlen(AUDIOSCROBBLER_KEYCHAIN_SERVICE); + attributes[2].data = (char *)AUDIOSCROBBLER_KEYCHAIN_SERVICE(user); + attributes[2].length = strlen(AUDIOSCROBBLER_KEYCHAIN_SERVICE(user)); list.count = 3; list.attr = attributes; @@ -140,8 +131,8 @@ static PreferencesController *prefs = nil; attributes[1].data = AUDIOSCROBBLER_KEYCHAIN_KIND; attributes[1].length = strlen(AUDIOSCROBBLER_KEYCHAIN_KIND); attributes[2].tag = kSecLabelItemAttr; - attributes[2].data = AUDIOSCROBBLER_KEYCHAIN_SERVICE; - attributes[2].length = strlen(AUDIOSCROBBLER_KEYCHAIN_SERVICE); + attributes[2].data = (char *)AUDIOSCROBBLER_KEYCHAIN_SERVICE(user); + attributes[2].length = strlen(AUDIOSCROBBLER_KEYCHAIN_SERVICE(user)); list.count = 3; list.attr = attributes; @@ -171,7 +162,7 @@ static PreferencesController *prefs = nil; OSStatus status = errSecNotAvailable; SecKeychainItemRef item = [PreferencesController keychainItemForUser:user]; if (item != nil) { - status = SecKeychainItemModifyContent(item, NULL, [password length], [password cString]); + status = SecKeychainItemModifyContent(item, NULL, [password length], [password UTF8String]); if (status != noErr) { ITDebugLog(@"Audioscrobbler: Error deleting keychain item: %i", status); } @@ -192,18 +183,17 @@ static PreferencesController *prefs = nil; if (status != noErr) { ITDebugLog(@"Audioscrobbler: Error getting keychain item password: %i", status); } else { - if ([NSString respondsToSelector:@selector(stringWithCString:encoding:)]) { - pass = [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding]; - } else { - pass = [NSString stringWithCString:buffer]; - } + NSLog(@"Audioscrobbler: password buffer: \"%s\" \"Length: %i\"", buffer, length); + pass = [[NSString alloc] initWithBytes:buffer length:length encoding:NSUTF8StringEncoding]; } if (status != noErr) { ITDebugLog(@"Audioscrobbler: Error deleting keychain item: %i", status); } + SecKeychainItemFreeContent(NULL, buffer); CFRelease(item); } - return pass; + NSLog(@"Audioscrobbler: Retrieved password: \"%@\"", pass); + return [pass autorelease]; } /*************************************************************************/ @@ -234,6 +224,7 @@ static PreferencesController *prefs = nil; @"Rewind", @"ShowPlayer", @"TrackInfo", + @"AlbumArt", @"UpcomingSongs", @"IncrementVolume", @"DecrementVolume", @@ -258,6 +249,7 @@ static PreferencesController *prefs = nil; @"Rewind", @"Show Player", @"Track Info", + @"Album Art", @"Upcoming Songs", @"Increment Volume", @"Decrement Volume", @@ -272,7 +264,7 @@ static PreferencesController *prefs = nil; [NSString stringWithUTF8String:"Set Rating: ★★☆☆☆"], [NSString stringWithUTF8String:"Set Rating: ★★★☆☆"], [NSString stringWithUTF8String:"Set Rating: ★★★★☆"], - [NSString stringWithUTF8String:"Set Rating: ★★★★★"], + [NSString stringWithUTF8String:"Set Rating: ★★★★"], nil]; hotKeysDictionary = [[NSMutableDictionary alloc] init]; controller = nil; @@ -413,7 +405,7 @@ static PreferencesController *prefs = nil; [showScriptsButton setEnabled:NO]; } } else if ( [sender tag] == 1120) { - mkdir([[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"] cString], 0744); + mkdir([[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"] UTF8String], 0744); [[NSWorkspace sharedWorkspace] openFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"]]; } else if ( [sender tag] == 6010) { //Toggle the other Audioscrobbler options @@ -421,6 +413,9 @@ static PreferencesController *prefs = nil; [audioscrobblerUseCacheCheckbox setEnabled:SENDER_STATE]; [audioscrobblerUserTextField setEnabled:SENDER_STATE]; [audioscrobblerPasswordTextField setEnabled:SENDER_STATE]; + if (SENDER_STATE) { + [[AudioscrobblerController sharedController] attemptHandshake:NO]; + } } else if ( [sender tag ] == 6015) { //Here we create a new keychain item if needed and deletes the keychain item if the field is cleared. NSString *currentAccount = [df stringForKey:@"audioscrobblerUser"], *newAccount = [sender stringValue]; @@ -433,6 +428,7 @@ static PreferencesController *prefs = nil; [PreferencesController deleteKeychainItemForUser:currentAccount]; } [PreferencesController createKeychainItemForUser:newAccount andPassword:[audioscrobblerPasswordTextField stringValue]]; + [[AudioscrobblerController sharedController] attemptHandshake:YES]; } } else if ( [sender tag ] == 6030) { //Here we set the password for an existing keychain item or we create a new keychain item. @@ -601,7 +597,7 @@ static PreferencesController *prefs = nil; - (IBAction)changeStatusWindowSetting:(id)sender { - StatusWindow *sw = [StatusWindow sharedWindow]; + StatusWindow *sw = (StatusWindow *)[StatusWindow sharedWindow]; ITDebugLog(@"Changing status window setting of tag %i", [sender tag]); if ( [sender tag] == 2010) { @@ -884,6 +880,11 @@ static PreferencesController *prefs = nil; #pragma mark PRIVATE METHOD IMPLEMENTATIONS /*************************************************************************/ +- (void)audioscrobblerStatusChanged:(NSNotification *)note +{ + [audioscrobblerStatusTextField setStringValue:[[note userInfo] objectForKey:@"StatusString"]]; +} + - (void)setupWindow { ITDebugLog(@"Loading Preferences.nib."); @@ -969,6 +970,12 @@ static PreferencesController *prefs = nil; int selectedBGStyle; id anItem; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioscrobblerStatusChanged:) name:@"AudioscrobblerStatusChanged" object:nil]; + if ([df boolForKey:@"audioscrobblerEnabled"]) { + NSString *status = [[AudioscrobblerController sharedController] lastStatus]; + [audioscrobblerStatusTextField setStringValue:(status == nil) ? @"Idle" : status]; + } + [df setInteger:MT_CURRENT_VERSION forKey:@"appVersion"]; ITDebugLog(@"Setting up preferences UI."); @@ -1105,6 +1112,7 @@ static PreferencesController *prefs = nil; [audioscrobblerPasswordTextField setStringValue:password]; } } + [audioscrobblerUseCacheCheckbox setState:[df boolForKey:@"audioscrobblerCacheSubmissions"]]; [[NSNotificationCenter defaultCenter] addObserver:sharingTableView selector:@selector(reloadData) name:@"ITMTFoundNetService" object:nil]; @@ -1159,7 +1167,7 @@ static PreferencesController *prefs = nil; - (void)setStatusWindowEntryEffect:(Class)effectClass { - StatusWindow *sw = [StatusWindow sharedWindow]; + StatusWindow *sw = (StatusWindow *)[StatusWindow sharedWindow]; float time = ([df floatForKey:@"statusWindowAppearanceSpeed"] ? [df floatForKey:@"statusWindowAppearanceSpeed"] : 0.8); [df setObject:NSStringFromClass(effectClass) forKey:@"statusWindowAppearanceEffect"]; @@ -1170,7 +1178,7 @@ static PreferencesController *prefs = nil; - (void)setStatusWindowExitEffect:(Class)effectClass { - StatusWindow *sw = [StatusWindow sharedWindow]; + StatusWindow *sw = (StatusWindow *)[StatusWindow sharedWindow]; float time = ([df floatForKey:@"statusWindowVanishSpeed"] ? [df floatForKey:@"statusWindowVanishSpeed"] : 0.8); [df setObject:NSStringFromClass(effectClass) forKey:@"statusWindowVanishEffect"];