X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/68dfd7431d482d1958c5d8371c4fd494b1356d84..b9f80a08cfcd969efa302d34796c1f101acf6d44:/MainController.m diff --git a/MainController.m b/MainController.m index e0230ff..b2b8195 100755 --- a/MainController.m +++ b/MainController.m @@ -10,11 +10,7 @@ #import "StatusWindowController.h" #import "StatusItemHack.h" -@interface NSImage (WeeAdditions) -- (NSImage *)imageScaledSmoothlyToSize:(NSSize)scaledSize; -@end - -@implementation NSImage (WeeAdditions) +@implementation NSImage (SmoothAdditions) - (NSImage *)imageScaledSmoothlyToSize:(NSSize)scaledSize { @@ -93,9 +89,7 @@ static MainController *sharedController; if ([df boolForKey:@"enableSharing"]) { [self setServerStatus:YES]; } else if ([df boolForKey:@"useSharedPlayer"]) { - if ([self connectToServer] == 0) { - [NSTimer scheduledTimerWithTimeInterval:45 target:self selector:@selector(checkForRemoteServer:) userInfo:nil repeats:YES]; - } + [self checkForRemoteServer]; } //Setup for notification of the remote player launching or quitting @@ -111,7 +105,7 @@ static MainController *sharedController; name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - if ( ! [df objectForKey:@"menu"] ) { // If this is nil, defaults have never been registered. + if (![df objectForKey:@"menu"]) { // If this is nil, defaults have never been registered. [[PreferencesController sharedPrefs] registerDefaults]; } @@ -168,7 +162,7 @@ static MainController *sharedController; Class remoteClass = [remoteBundle principalClass]; if ([remoteClass conformsToProtocol:@protocol(ITMTRemote)] && - [remoteClass isKindOfClass:[NSObject class]]) { + [(NSObject *)remoteClass isKindOfClass:[NSObject class]]) { id remote = [remoteClass remote]; ITDebugLog(@"Adding remote at path %@", bundlePath); [remoteArray addObject:remote]; @@ -264,7 +258,7 @@ static MainController *sharedController; [self setupHotKeys]; if (![refreshTimer isValid]) { [refreshTimer release]; - refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:0.5 + refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:([networkController isConnectedToServer] ? 10.0 : 0.5) target:self selector:@selector(timerUpdate) userInfo:nil @@ -330,17 +324,14 @@ static MainController *sharedController; - (void)setLatestSongIdentifier:(NSString *)newIdentifier { - ITDebugLog(@"Setting latest song identifier to %@", newIdentifier); + ITDebugLog(@"Setting latest song identifier:"); + ITDebugLog(@" - Identifier: %@", newIdentifier); [_latestSongIdentifier autorelease]; - _latestSongIdentifier = [newIdentifier copy]; + _latestSongIdentifier = [newIdentifier retain]; } - (void)timerUpdate { - if ([networkController isConnectedToServer]) { - [statusItem setMenu:[menuController menu]]; - } - if ( [self songChanged] && (timerUpdating != YES) && (playerRunningState == ITMTRemotePlayerRunning) ) { ITDebugLog(@"The song changed."); @@ -352,7 +343,7 @@ static MainController *sharedController; while ( (nextScript = [scriptsEnum nextObject]) ) { NSDictionary *error; NSAppleScript *currentScript = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"] stringByAppendingPathComponent:nextScript]] error:&error]; - NSLog(@"Running script: %@", nextScript); + ITDebugLog(@"Running script: %@", nextScript); if (!currentScript || ![currentScript executeAndReturnError:nil]) { ITDebugLog(@"Error running script %@.", nextScript); } @@ -361,6 +352,7 @@ static MainController *sharedController; } timerUpdating = YES; + [statusItem setEnabled:NO]; NS_DURING latestPlaylistClass = [[self currentRemote] currentPlaylistClass]; @@ -394,6 +386,11 @@ static MainController *sharedController; NS_ENDHANDLER timerUpdating = NO; + [statusItem setEnabled:YES]; + } + + if ([networkController isConnectedToServer]) { + [statusItem setMenu:([[self currentRemote] playerRunningState] == ITMTRemotePlayerRunning) ? [menuController menu] : [menuController menuForNoPlayer]]; } } @@ -534,20 +531,20 @@ static MainController *sharedController; - (void)showPlayer { ITDebugLog(@"Beginning show player."); - if ( ( playerRunningState == ITMTRemotePlayerRunning) ) { + //if ( ( playerRunningState == ITMTRemotePlayerRunning) ) { ITDebugLog(@"Showing player interface."); NS_DURING [[self currentRemote] showPrimaryInterface]; NS_HANDLER [self networkError:localException]; NS_ENDHANDLER - } else { + /*} else { ITDebugLog(@"Launching player."); NS_DURING NSString *path; if ( (path = [df stringForKey:@"CustomPlayerPath"]) ) { } else { - path = [[self currentRemote] playerFullName]; + pathITDebugLog(@"Showing player interface."); = [[self currentRemote] playerFullName]; } if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { ITDebugLog(@"Error Launching Player"); @@ -555,7 +552,7 @@ static MainController *sharedController; NS_HANDLER [self networkError:localException]; NS_ENDHANDLER - } + }*/ ITDebugLog(@"Finished show player."); } @@ -588,6 +585,11 @@ static MainController *sharedController; // // +- (MenuController *)menuController +{ + return menuController; +} + - (void)closePreferences { ITDebugLog(@"Preferences closed."); @@ -627,7 +629,7 @@ static MainController *sharedController; ITHotKey *hotKey; ITDebugLog(@"Setting up hot keys."); - if (playerRunningState == ITMTRemotePlayerNotRunning) { + if (playerRunningState == ITMTRemotePlayerNotRunning && ![[NetworkController sharedController] isConnectedToServer]) { return; } @@ -759,11 +761,14 @@ static MainController *sharedController; NSString *title = nil; NSString *album = nil; NSString *artist = nil; + NSString *composer = nil; NSString *time = nil; NSString *track = nil; NSImage *art = nil; int rating = -1; + ITDebugLog(@"Showing track info status window."); + NS_DURING source = [[self currentRemote] currentSource]; title = [[self currentRemote] currentSongTitle]; @@ -771,10 +776,20 @@ static MainController *sharedController; [self networkError:localException]; NS_ENDHANDLER - ITDebugLog(@"Showing track info status window."); - if ( title ) { - + if ( [df boolForKey:@"showAlbumArtwork"] ) { + NSSize oldSize, newSize; + NS_DURING + art = [[self currentRemote] currentSongAlbumArt]; + oldSize = [art size]; + if (oldSize.width > oldSize.height) newSize = NSMakeSize(110,oldSize.height * (110.0f / oldSize.width)); + else newSize = NSMakeSize(oldSize.width * (110.0f / oldSize.height),110); + art = [[[[NSImage alloc] initWithData:[art TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize]; + NS_HANDLER + [self networkError:localException]; + NS_ENDHANDLER + } + if ( [df boolForKey:@"showAlbum"] ) { NS_DURING album = [[self currentRemote] currentSongAlbum]; @@ -791,6 +806,14 @@ static MainController *sharedController; NS_ENDHANDLER } + if ( [df boolForKey:@"showComposer"] ) { + NS_DURING + composer = [[self currentRemote] currentSongComposer]; + NS_HANDLER + [self networkError:localException]; + NS_ENDHANDLER + } + if ( [df boolForKey:@"showTime"] ) { NS_DURING time = [NSString stringWithFormat:@"%@: %@ / %@", @@ -832,27 +855,15 @@ static MainController *sharedController; rating = ( currentRating * 5 ); } } - - if ( [df boolForKey:@"showAlbumArtwork"] ) { - NSSize oldSize, newSize; - NS_DURING - art = [[self currentRemote] currentSongAlbumArt]; - oldSize = [art size]; - if (oldSize.width > oldSize.height) newSize = NSMakeSize(110,oldSize.height * (110.0f / oldSize.width)); - else newSize = NSMakeSize(oldSize.width * (110.0f / oldSize.height),110); - art = [[[[NSImage alloc] initWithData:[art TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize]; - NS_HANDLER - [self networkError:localException]; - NS_ENDHANDLER - } - } else { title = NSLocalizedString(@"noSongPlaying", @"No song is playing."); } + ITDebugLog(@"Showing current track info status window."); [statusWindowController showSongInfoWindowWithSource:source title:title album:album artist:artist + composer:composer time:time track:track rating:rating @@ -1076,6 +1087,11 @@ static MainController *sharedController; if (result == 1) { [[PreferencesController sharedPrefs] resetRemotePlayerTextFields]; currentRemote = [[[networkController networkObject] remote] retain]; + + [self setupHotKeys]; + //playerRunningState = ITMTRemotePlayerRunning; + playerRunningState = [[self currentRemote] playerRunningState]; + [refreshTimer invalidate]; refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:([networkController isConnectedToServer] ? 10.0 : 0.5) target:self @@ -1104,32 +1120,57 @@ static MainController *sharedController; [currentRemote release]; currentRemote = [remoteArray objectAtIndex:0]; [networkController disconnect]; + + if ([[self currentRemote] playerRunningState] == ITMTRemotePlayerRunning) { + [self applicationLaunched:nil]; + } else { + [self applicationTerminated:nil]; + } [self timerUpdate]; return YES; } -- (void)checkForRemoteServer:(NSTimer *)timer +- (void)checkForRemoteServer { ITDebugLog(@"Checking for remote server."); + [NSThread detachNewThreadSelector:@selector(runRemoteServerCheck:) toTarget:self withObject:nil]; +} + +- (void)runRemoteServerCheck:(id)sender +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + ITDebugLog(@"Remote server check running."); if ([networkController checkForServerAtHost:[df stringForKey:@"sharedPlayerHost"]]) { ITDebugLog(@"Remote server found."); - [timer invalidate]; - if (![networkController isServerOn] && ![networkController isConnectedToServer]) { - [[StatusWindowController sharedController] showReconnectQueryWindow]; - } + [self performSelectorOnMainThread:@selector(remoteServerFound:) withObject:nil waitUntilDone:NO]; } else { ITDebugLog(@"Remote server not found."); + [self performSelectorOnMainThread:@selector(remoteServerNotFound:) withObject:nil waitUntilDone:NO]; } + [pool release]; +} + +- (void)remoteServerFound:(id)sender +{ + if (![networkController isServerOn] && ![networkController isConnectedToServer]) { + [[StatusWindowController sharedController] showReconnectQueryWindow]; + } +} + +- (void)remoteServerNotFound:(id)sender +{ + [NSTimer scheduledTimerWithTimeInterval:90.0 target:self selector:@selector(checkForRemoteServer) userInfo:nil repeats:NO]; } - (void)networkError:(NSException *)exception { ITDebugLog(@"Remote exception thrown: %@: %@", [exception name], [exception reason]); if ( ((exception == nil) || [[exception name] isEqualToString:NSPortTimeoutException]) && [networkController isConnectedToServer]) { - NSRunCriticalAlertPanel(@"Remote MenuTunes Disconnected", @"The MenuTunes server you were connected to stopped responding or quit. MenuTunes will revert back to the local player.", @"OK", nil, nil); + //NSRunCriticalAlertPanel(@"Remote MenuTunes Disconnected", @"The MenuTunes server you were connected to stopped responding or quit. MenuTunes will revert back to the local player.", @"OK", nil, nil); + [[StatusWindowController sharedController] showNetworkErrorQueryWindow]; if ([self disconnectFromServer]) { [[PreferencesController sharedPrefs] resetRemotePlayerTextFields]; - [NSTimer scheduledTimerWithTimeInterval:45 target:self selector:@selector(checkForRemoteServer:) userInfo:nil repeats:YES]; + [NSTimer scheduledTimerWithTimeInterval:90.0 target:self selector:@selector(checkForRemoteServer) userInfo:nil repeats:NO]; } else { ITDebugLog(@"CRITICAL ERROR, DISCONNECTING!"); } @@ -1139,7 +1180,7 @@ static MainController *sharedController; - (void)reconnect { if ([self connectToServer] == 0) { - [NSTimer scheduledTimerWithTimeInterval:45 target:self selector:@selector(checkForRemoteServer:) userInfo:nil repeats:YES]; + [NSTimer scheduledTimerWithTimeInterval:90.0 target:self selector:@selector(checkForRemoteServer) userInfo:nil repeats:NO]; } [[StatusWindow sharedWindow] setLocked:NO]; [[StatusWindow sharedWindow] vanish:self]; @@ -1161,7 +1202,7 @@ static MainController *sharedController; - (void)applicationLaunched:(NSNotification *)note { NS_DURING - if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[[self currentRemote] playerFullName]]) { + if (!note || ([[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[[self currentRemote] playerFullName]] && ![[NetworkController sharedController] isConnectedToServer])) { ITDebugLog(@"Remote application launched."); playerRunningState = ITMTRemotePlayerRunning; [[self currentRemote] begin]; @@ -1183,7 +1224,7 @@ static MainController *sharedController; - (void)applicationTerminated:(NSNotification *)note { NS_DURING - if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[[self currentRemote] playerFullName]]) { + if (!note || [[[note userInfo] objectForKey:@"NSApplicationName"] isEqualToString:[[self currentRemote] playerFullName]] && ![[NetworkController sharedController] isConnectedToServer]) { ITDebugLog(@"Remote application terminated."); playerRunningState = ITMTRemotePlayerNotRunning; [[self currentRemote] halt];