#import "MenuController.h"
#import "PreferencesController.h"
#import "NetworkController.h"
+#import "NetworkObject.h"
#import <ITKit/ITHotKeyCenter.h>
#import <ITKit/ITHotKey.h>
#import <ITKit/ITKeyCombo.h>
statusWindowController = [StatusWindowController sharedController];
menuController = [[MenuController alloc] init];
df = [[NSUserDefaults standardUserDefaults] retain];
+ [[PreferencesController sharedPrefs] setController:self];
timerUpdating = NO;
blinged = NO;
}
networkController = [[NetworkController alloc] init];
if ([df boolForKey:@"enableSharing"]) {
[self setServerStatus:YES];
- } else if ([df boolForKey:@"useSharedPlayer"] && [df boolForKey:@"alwaysUseSharedPlayer"]) {
- [self connectToServer];
+ } else if ([df boolForKey:@"useSharedPlayer"]) {
+ if ([self connectToServer] == 0) {
+ [NSTimer scheduledTimerWithTimeInterval:45 target:self selector:@selector(checkForRemoteServer:) userInfo:nil repeats:YES];
+ }
}
//Setup for notification of the remote player launching or quitting
timerUpdating = YES;
NS_DURING
- latestPlaylistClass = [[self currentRemote] currentPlaylistClass];
- [menuController rebuildSubmenus];
-
- if ( [df boolForKey:@"showSongInfoOnChange"] ) {
- [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0];
- }
-
- [self setLatestSongIdentifier:[[self currentRemote] playerStateUniqueIdentifier]];
+ latestPlaylistClass = [[self currentRemote] currentPlaylistClass];
+ [menuController rebuildSubmenus];
+
+ if ( [df boolForKey:@"showSongInfoOnChange"] ) {
+ [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0];
+ }
+
+ [self setLatestSongIdentifier:[[self currentRemote] playerStateUniqueIdentifier]];
NS_HANDLER
[self networkError:localException];
NS_ENDHANDLER
- (void)showPreferences
{
ITDebugLog(@"Show preferences.");
- [[PreferencesController sharedPrefs] setController:self];
[[PreferencesController sharedPrefs] showPrefsWindow:self];
}
}
}
-- (BOOL)connectToServer
+- (int)connectToServer
{
+ int result;
+ ITDebugLog(@"Attempting to connect to shared remote.");
+ result = [networkController connectToHost:[df stringForKey:@"sharedPlayerHost"]];
//Connect
- if ([networkController connectToHost:[df stringForKey:@"sharedPlayerHost"]]) {
- currentRemote = [networkController sharedRemote];
- [refreshTimer invalidate];
- return YES;
+ if (result == 1) {
+ [[PreferencesController sharedPrefs] resetRemotePlayerTextFields];
+ currentRemote = [[[networkController networkObject] remote] retain];
+ [self timerUpdate];
+ ITDebugLog(@"Connection successful.");
+ return 1;
+ } else if (result == 0) {
+ ITDebugLog(@"Connection failed.");
+ currentRemote = [remoteArray objectAtIndex:0];
+ return 0;
} else {
+ //Do something about the password being invalid
+ ITDebugLog(@"Connection failed.");
currentRemote = [remoteArray objectAtIndex:0];
- return NO;
+ return -1;
}
}
- (BOOL)disconnectFromServer
{
+ ITDebugLog(@"Disconnecting from shared remote.");
//Disconnect
+ [currentRemote release];
currentRemote = [remoteArray objectAtIndex:0];
[networkController disconnect];
[self timerUpdate];
return YES;
}
+- (void)checkForRemoteServer:(NSTimer *)timer
+{
+ ITDebugLog(@"Checking for remote server.");
+ if ([networkController checkForServerAtHost:[df stringForKey:@"sharedPlayerHost"]]) {
+ ITDebugLog(@"Remote server found.");
+ [timer invalidate];
+ if (![networkController isConnectedToServer]) {
+ [[StatusWindowController sharedController] showReconnectQueryWindow];
+ }
+ } else {
+ ITDebugLog(@"Remote server not found.");
+ }
+}
+
- (void)networkError:(NSException *)exception
{
ITDebugLog(@"Remote exception thrown: %@: %@", [exception name], [exception reason]);
- NSRunAlertPanel(@"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);
- if ([networkController isConnectedToServer] && [self disconnectFromServer]) {
- } else {
- ITDebugLog(@"CRITICAL ERROR DISCONNECTING!");
+ NSLog(@"%@", [exception reason]);
+ if ([[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);
+ if ([self disconnectFromServer]) {
+ [[PreferencesController sharedPrefs] resetRemotePlayerTextFields];
+ [NSTimer scheduledTimerWithTimeInterval:45 target:self selector:@selector(checkForRemoteServer:) userInfo:nil repeats:YES];
+ } else {
+ ITDebugLog(@"CRITICAL ERROR, DISCONNECTING!");
+ }
}
}
+- (void)reconnect
+{
+ if ([self connectToServer] == 0) {
+ [NSTimer scheduledTimerWithTimeInterval:45 target:self selector:@selector(checkForRemoteServer:) userInfo:nil repeats:YES];
+ }
+ [[StatusWindow sharedWindow] setLocked:NO];
+ [[StatusWindow sharedWindow] vanish:self];
+ [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES];
+}
+
+- (void)cancelReconnect
+{
+ [[StatusWindow sharedWindow] setLocked:NO];
+ [[StatusWindow sharedWindow] vanish:self];
+ [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES];
+}
+
/*************************************************************************/
#pragma mark -
#pragma mark WORKSPACE NOTIFICATION HANDLERS
- (void)applicationWillTerminate:(NSNotification *)note
{
- [self clearHotKeys];
[networkController stopRemoteServerSearch];
+ [self clearHotKeys];
[[NSStatusBar systemStatusBar] removeStatusItem:statusItem];
}
[super dealloc];
}
-
@end
\ No newline at end of file