X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/107e67ed9e5791f210cfaf2185e75ea5b5e84792..b27aba7ff5351d788e6250b7dd0e38c15a001817:/NetworkController.m diff --git a/NetworkController.m b/NetworkController.m index 9edb713..7c2e209 100755 --- a/NetworkController.m +++ b/NetworkController.m @@ -14,6 +14,7 @@ #import "NetworkController.h" #import "MainController.h" #import "NetworkObject.h" +#import "PreferencesController.h" #import #import @@ -32,6 +33,8 @@ static NetworkController *sharedController; sharedController = self; browser = [[NSNetServiceBrowser alloc] init]; [browser setDelegate:self]; + rootObject = [[NetworkObject alloc] init]; + serverPort = [[NSSocketPort alloc] initWithTCPPort:SERVER_PORT]; } return self; } @@ -40,11 +43,12 @@ static NetworkController *sharedController; { [self disconnect]; if (serverOn) { - [serverConnection invalidate]; [serverConnection release]; } [serverPass release]; [clientPass release]; + [serverPort release]; + [rootObject release]; [clientProxy release]; [remoteServices release]; [browser release]; @@ -73,16 +77,17 @@ static NetworkController *sharedController; NSData *fullPass; //Turn on NS_DURING - serverPort = [[NSSocketPort alloc] initWithTCPPort:SERVER_PORT]; serverConnection = [[NSConnection alloc] initWithReceivePort:serverPort sendPort:serverPort]; - [serverConnection setRootObject:[[NetworkObject alloc] init]]; + [serverConnection setRootObject:rootObject]; + [rootObject makeValid]; [serverConnection registerName:@"ITMTPlayerHost"]; - [serverConnection setDelegate:self]; NS_HANDLER + [serverConnection setRootObject:nil]; [serverConnection release]; [serverPort release]; ITDebugLog(@"Error starting server!"); + return; NS_ENDHANDLER ITDebugLog(@"Started server."); if (!name) { @@ -93,7 +98,7 @@ static NetworkController *sharedController; name:name port:SERVER_PORT]; fullPass = [[NSUserDefaults standardUserDefaults] dataForKey:@"sharedPlayerPassword"]; - if (fullPass) { + if ([fullPass length]) { [fullPass getBytes:&buffer range:NSMakeRange(6, 4)]; [serverPass release]; serverPass = [[NSData alloc] initWithBytes:&buffer length:strlen(&buffer)]; @@ -102,24 +107,28 @@ static NetworkController *sharedController; } [service publish]; serverOn = YES; + ITDebugLog(@"Server service published."); } else if (serverOn && !status && [serverConnection isValid]) { //Turn off [service stop]; + [service release]; + [rootObject invalidate]; [serverConnection registerName:nil]; - [[serverConnection rootObject] release]; - [serverPort invalidate]; [serverConnection invalidate]; + //[serverConnection setRootObject:nil]; + //[[serverConnection sendPort] autorelease]; [serverConnection release]; ITDebugLog(@"Stopped server."); serverOn = NO; } } -- (BOOL)connectToHost:(NSString *)host +- (int)connectToHost:(NSString *)host { NSData *fullPass = [[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"]; unsigned char buffer; ITDebugLog(@"Connecting to host: %@", host); + [remoteHost release]; remoteHost = [host copy]; if (fullPass) { [fullPass getBytes:&buffer range:NSMakeRange(6, 4)]; @@ -132,19 +141,49 @@ static NetworkController *sharedController; clientPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT host:host]; clientConnection = [[NSConnection connectionWithReceivePort:nil sendPort:clientPort] retain]; - [clientConnection setDelegate:self]; - [clientConnection setReplyTimeout:5]; + [clientConnection setReplyTimeout:10]; clientProxy = [[clientConnection rootProxy] retain]; + connectedToServer = YES; NS_HANDLER [clientConnection release]; [clientPort release]; ITDebugLog(@"Connection to host failed: %@", host); - return NO; + return 0; NS_ENDHANDLER + + if (!clientProxy) { + ITDebugLog(@"Null proxy! Couldn't connect!"); + [self disconnect]; + return 0; + } + + if ([clientProxy requiresPassword]) { + ITDebugLog(@"Server requires password."); + //Check to see if a password is set in defaults + if ([[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"] == nil) { + ITDebugLog(@"Asking for password."); + if (![[PreferencesController sharedPrefs] showPasswordPanel]) { + ITDebugLog(@"Giving up connection attempt."); + [self disconnect]; + return -1; + } + } + + //Send the password + ITDebugLog(@"Sending password."); + while (![clientProxy sendPassword:[[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"]]) { + ITDebugLog(@"Invalid password!"); + if (![[PreferencesController sharedPrefs] showInvalidPasswordPanel]) { + ITDebugLog(@"Giving up connection attempt."); + [self disconnect]; + return -1; + } + } + } + ITDebugLog(@"Connected to host: %@", host); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disconnect) name:NSConnectionDidDieNotification object:clientConnection]; - connectedToServer = YES; - return YES; + return 1; } - (BOOL)disconnect @@ -155,7 +194,6 @@ static NetworkController *sharedController; remoteHost = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; [clientProxy release]; - [clientConnection invalidate]; [clientConnection release]; return YES; } @@ -164,9 +202,10 @@ static NetworkController *sharedController; { NSData *fullPass = [[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"]; unsigned char buffer; - NSConnection *testConnection; - NSSocketPort *testPort; + NSConnection *testConnection = nil; + NSSocketPort *testPort = nil; NetworkObject *tempProxy; + BOOL valid; ITDebugLog(@"Checking for shared remote at %@.", host); if (fullPass) { [fullPass getBytes:&buffer range:NSMakeRange(6, 4)]; @@ -178,23 +217,41 @@ static NetworkController *sharedController; NS_DURING testPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT - host:host]; + host:host]; testConnection = [[NSConnection connectionWithReceivePort:nil sendPort:testPort] retain]; - [testConnection setReplyTimeout:2]; - tempProxy = [testConnection rootProxy]; - [testConnection setDelegate:self]; + [testConnection setReplyTimeout:5]; + [testConnection setRequestTimeout:5]; + tempProxy = (NetworkObject *)[testConnection rootProxy]; [tempProxy serverName]; + valid = [tempProxy isValid]; NS_HANDLER ITDebugLog(@"Connection to host failed: %@", host); - [testConnection invalidate]; [testConnection release]; [testPort release]; return NO; NS_ENDHANDLER - [testConnection invalidate]; + + if (!tempProxy) { + ITDebugLog(@"Null proxy! Couldn't connect!"); + [testConnection release]; + [testPort release]; + return NO; + } [testConnection release]; [testPort release]; - return YES; + return valid; +} + +- (void)resetServerName +{ + if ([self isServerOn]) { + [service stop]; + [service release]; + service = [[NSNetService alloc] initWithDomain:@"" + type:@"_mttp._tcp." + name:[[NSUserDefaults standardUserDefaults] stringForKey:@"sharedPlayerName"] + port:SERVER_PORT]; + } } - (BOOL)isServerOn @@ -227,27 +284,17 @@ static NetworkController *sharedController; return remoteServices; } -/*- (BOOL)authenticateComponents:(NSArray*)components withData:(NSData *)authenticationData -{ - return YES; - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"enableSharingPassword"] || [authenticationData isEqualToData:serverPass]) { - return YES; - } else { - return NO; - } -} - -- (NSData *)authenticationDataForComponents:(NSArray *)components -{ - return clientPass; -}*/ - - (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing { ITDebugLog(@"Found service named %@.", [aNetService name]); [remoteServices addObject:aNetService]; [aNetService setDelegate:self]; - [aNetService resolve]; + //Figure out if it responds to the 10.4 method + if ([aNetService respondsToSelector:@selector(resolveWithTimeout:)]) { + (void)[aNetService resolveWithTimeout:5.0]; + } else { + [aNetService resolve]; + } if (!moreComing) { [[NSNotificationCenter defaultCenter] postNotificationName:@"ITMTFoundNetService" object:nil]; } @@ -265,8 +312,10 @@ static NetworkController *sharedController; - (void)netServiceDidResolveAddress:(NSNetService *)sender { ITDebugLog(@"Resolved service named %@.", [sender name]); - NSLog(@"Resolved service named %@.", [sender name]); [[NSNotificationCenter defaultCenter] postNotificationName:@"ITMTFoundNetService" object:nil]; + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"useSharedPlayer"] && !connectedToServer) { + [[MainController sharedController] checkForRemoteServerAndConnectImmediately:NO]; + } [sender stop]; }