#import "NetworkController.h"
#import "MainController.h"
-#import "netinet/in.h"
-#import "arpa/inet.h"
+#import "NetworkObject.h"
+#import "PreferencesController.h"
#import <ITFoundation/ITDebug.h>
#import <ITFoundation/ITFoundation.h>
-#import <ITMTRemote/ITMTRemote.h>
static NetworkController *sharedController;
sharedController = self;
browser = [[NSNetServiceBrowser alloc] init];
[browser setDelegate:self];
+ rootObject = [[NetworkObject alloc] init];
+ serverPort = [[NSSocketPort alloc] initWithTCPPort:SERVER_PORT];
}
return self;
}
{
[self disconnect];
if (serverOn) {
- [serverConnection invalidate];
[serverConnection release];
}
+ [serverPass release];
+ [clientPass release];
+ [serverPort release];
+ [rootObject release];
[clientProxy release];
[remoteServices release];
[browser release];
{
if (!serverOn && status) {
NSString *name = [[NSUserDefaults standardUserDefaults] stringForKey:@"sharedPlayerName"];
+ unsigned char buffer;
+ NSData *fullPass;
//Turn on
NS_DURING
- serverPort = [[NSSocketPort alloc] initWithTCPPort:SERVER_PORT];
serverConnection = [[NSConnection alloc] initWithReceivePort:serverPort
sendPort:serverPort];
- [serverConnection setRootObject:[[MainController sharedController] currentRemote]];
+ [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) {
type:@"_mttp._tcp."
name:name
port:SERVER_PORT];
+ fullPass = [[NSUserDefaults standardUserDefaults] dataForKey:@"sharedPlayerPassword"];
+ if ([fullPass length]) {
+ [fullPass getBytes:&buffer range:NSMakeRange(6, 4)];
+ [serverPass release];
+ serverPass = [[NSData alloc] initWithBytes:&buffer length:strlen(&buffer)];
+ } else {
+ serverPass = nil;
+ }
[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];
- [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)];
+ [clientPass release];
+ clientPass = [[NSData alloc] initWithBytes:&buffer length:strlen(&buffer)];
+ } else {
+ clientPass = nil;
+ }
NS_DURING
clientPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT
host:host];
clientConnection = [[NSConnection connectionWithReceivePort:nil sendPort:clientPort] retain];
+ [clientConnection setReplyTimeout:5];
clientProxy = [[clientConnection rootProxy] retain];
+ connectedToServer = YES;
NS_HANDLER
+ [clientConnection release];
+ [clientPort release];
ITDebugLog(@"Connection to host failed: %@", host);
- return NO;
+ return 0;
NS_ENDHANDLER
- [clientConnection setReplyTimeout:5];
+
+ if (!clientProxy) {
+ ITDebugLog(@"Null proxy! Couldn't connect!");
+ [self disconnect];
+ return NO;
+ }
+
+ 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
{
ITDebugLog(@"Disconnecting from host.");
connectedToServer = NO;
+ [remoteHost release];
+ remoteHost = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
[clientProxy release];
- [clientConnection invalidate];
[clientConnection release];
return YES;
}
+- (BOOL)checkForServerAtHost:(NSString *)host
+{
+ NSData *fullPass = [[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"];
+ unsigned char buffer;
+ NSConnection *testConnection;
+ NSSocketPort *testPort;
+ NetworkObject *tempProxy;
+ BOOL valid;
+ ITDebugLog(@"Checking for shared remote at %@.", host);
+ if (fullPass) {
+ [fullPass getBytes:&buffer range:NSMakeRange(6, 4)];
+ [clientPass release];
+ clientPass = [[NSData alloc] initWithBytes:&buffer length:strlen(&buffer)];
+ } else {
+ clientPass = nil;
+ }
+
+ NS_DURING
+ testPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT
+ host:host];
+ testConnection = [[NSConnection connectionWithReceivePort:nil sendPort:testPort] retain];
+ [testConnection setReplyTimeout:2];
+ [testConnection setRequestTimeout:2];
+ tempProxy = (NetworkObject *)[testConnection rootProxy];
+ [tempProxy serverName];
+ valid = [tempProxy isValid];
+ NS_HANDLER
+ ITDebugLog(@"Connection to host failed: %@", host);
+ [testConnection release];
+ [testPort release];
+ return NO;
+ NS_ENDHANDLER
+
+ if (!tempProxy) {
+ ITDebugLog(@"Null proxy! Couldn't connect!");
+ [testConnection release];
+ [testPort release];
+ return NO;
+ }
+ [testConnection release];
+ [testPort release];
+ 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
{
return serverOn;
return connectedToServer;
}
-- (ITMTRemote *)sharedRemote
+- (NSString *)remoteHost
+{
+ return remoteHost;
+}
+
+- (NetworkObject *)networkObject
{
- return (ITMTRemote *)clientProxy;
+ return clientProxy;
}
- (NSArray *)remoteServices
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
+ ITDebugLog(@"Found service named %@.", [aNetService name]);
+ [remoteServices addObject:aNetService];
[aNetService setDelegate:self];
[aNetService resolve];
- ITDebugLog(@"Found service named %@.", [aNetService name]);
+ if (!moreComing) {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"ITMTFoundNetService" object:nil];
+ }
+}
+
+- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveService:(NSNetService*)aNetService moreComing:(BOOL)moreComing
+{
+ ITDebugLog(@"Removed service named %@.", [aNetService name]);
+ [remoteServices removeObject:aNetService];
if (!moreComing) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"ITMTFoundNetService" object:nil];
}
- (void)netServiceDidResolveAddress:(NSNetService *)sender
{
- [remoteServices addObject:[NSDictionary dictionaryWithObjectsAndKeys:[sender name], @"name",
- [NSString stringWithCString:inet_ntoa((*(struct sockaddr_in*)[[[sender addresses] objectAtIndex:0] bytes]).sin_addr)], @"ip",
- nil, nil]];
ITDebugLog(@"Resolved service named %@.", [sender name]);
- NSLog(@"found!");
[[NSNotificationCenter defaultCenter] postNotificationName:@"ITMTFoundNetService" object:nil];
+ if ([[NSUserDefaults standardUserDefaults] boolForKey:@"useSharedPlayer"] && !connectedToServer) {
+ [[MainController sharedController] checkForRemoteServer];
+ }
+ [sender stop];
}
- (void)netServiceWillResolve:(NSNetService *)sender