X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/05ed443780b3696c53e100d7eee9ae63c633e22d..4ceec63fa54ca0281b26107bcfc78617c9854d4c:/NetworkController.m diff --git a/NetworkController.m b/NetworkController.m index 65962ba..ac10ab6 100755 --- a/NetworkController.m +++ b/NetworkController.m @@ -1,19 +1,7 @@ -/* - * MenuTunes - * NetworkController - * Rendezvous network controller - * - * Original Author : Kent Sutherland - * Responsibility : Kent Sutherland - * - * Copyright (c) 2003 iThink Software. - * All Rights Reserved - * - */ - #import "NetworkController.h" #import "MainController.h" #import "NetworkObject.h" +#import "PreferencesController.h" #import #import @@ -32,6 +20,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; } @@ -44,6 +34,8 @@ static NetworkController *sharedController; } [serverPass release]; [clientPass release]; + [serverPort release]; + [rootObject release]; [clientProxy release]; [remoteServices release]; [browser release]; @@ -72,16 +64,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"]; NS_HANDLER - [[serverConnection rootObject] release]; + [serverConnection setRootObject:nil]; [serverConnection release]; [serverPort release]; ITDebugLog(@"Error starting server!"); + return; NS_ENDHANDLER ITDebugLog(@"Started server."); if (!name) { @@ -92,7 +85,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)]; @@ -101,11 +94,16 @@ 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]; + [serverConnection invalidate]; + //[serverConnection setRootObject:nil]; + //[[serverConnection sendPort] autorelease]; [serverConnection release]; ITDebugLog(@"Stopped server."); serverOn = NO; @@ -130,33 +128,48 @@ static NetworkController *sharedController; clientPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT host:host]; clientConnection = [[NSConnection connectionWithReceivePort:nil sendPort:clientPort] retain]; - [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 NO; + 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."); - if (![clientProxy sendPassword:[[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"]]) { + while (![clientProxy sendPassword:[[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"]]) { ITDebugLog(@"Invalid password!"); - [self disconnect]; - return -1; + 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 = 1; return 1; } @@ -176,9 +189,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)]; @@ -192,9 +206,11 @@ static NetworkController *sharedController; testPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT host:host]; testConnection = [[NSConnection connectionWithReceivePort:nil sendPort:testPort] retain]; - [testConnection setReplyTimeout:2]; + [testConnection setReplyTimeout:5]; + [testConnection setRequestTimeout:5]; tempProxy = (NetworkObject *)[testConnection rootProxy]; [tempProxy serverName]; + valid = [tempProxy isValid]; NS_HANDLER ITDebugLog(@"Connection to host failed: %@", host); [testConnection release]; @@ -202,7 +218,7 @@ static NetworkController *sharedController; return NO; NS_ENDHANDLER - if (!clientProxy) { + if (!tempProxy) { ITDebugLog(@"Null proxy! Couldn't connect!"); [testConnection release]; [testPort release]; @@ -210,7 +226,19 @@ static NetworkController *sharedController; } [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 @@ -248,7 +276,12 @@ static NetworkController *sharedController; 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]; } @@ -266,8 +299,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]; }