diff -r 6df227b5e4c9 -r 6b2d19ed521a project_files/HedgewarsMobile/Classes/ServerSetup.m --- a/project_files/HedgewarsMobile/Classes/ServerSetup.m Sun Oct 30 23:24:36 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,227 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2011 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * File created on 10/01/2010. - */ - - -#import "ServerSetup.h" -#import -#import - -#import "hwconsts.h" - -#define BUFFER_SIZE 256 - -@implementation ServerSetup -@synthesize systemSettings; - - -+(NSInteger) randomPort { - srandom(time(NULL)); - NSInteger res = (random() % 64511) + 1024; - return (res == NETGAME_DEFAULT_PORT) ? [ServerSetup randomPort] : res; -} - -+(BOOL) isNetworkReachable { - // Create zero addy - struct sockaddr_in zeroAddress; - bzero(&zeroAddress, sizeof(zeroAddress)); - zeroAddress.sin_len = sizeof(zeroAddress); - zeroAddress.sin_family = AF_INET; - - // Recover reachability flags - SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); - SCNetworkReachabilityFlags flags; - - BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); - CFRelease(defaultRouteReachability); - - if (!didRetrieveFlags) { - NSLog(@"Error. Could not recover network reachability flags"); - return NO; - } - - BOOL isReachable = flags & kSCNetworkFlagsReachable; - BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; - BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection; - - NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"]; - NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL - cachePolicy:NSURLRequestReloadIgnoringLocalCacheData - timeoutInterval:20.0]; - NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:nil]; - BOOL testResult = testConnection ? YES : NO; - [testConnection release]; - - return ((isReachable && !needsConnection) || nonWiFi) ? testResult : NO; -} - --(id) init { - if (self = [super init]) { - self.systemSettings = nil; //nsuserdefault - } - return self; -} - --(void) dealloc { - - [super dealloc]; -} - --(int) sendToServer:(NSString *)command { - NSString *message = [[NSString alloc] initWithFormat:@"%@\n\n",command]; - int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]); - [message release]; - return result; -} - --(int) sendToServer:(NSString *)command withArgument:(NSString *)argument { - NSString *message = [[NSString alloc] initWithFormat:@"%@\n%@\n\n",command,argument]; - int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]); - [message release]; - return result; -} - --(void) serverProtocol { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - IPaddress ip; - BOOL clientQuit = NO; - char *buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE); - int dim = BUFFER_SIZE; - uint8_t msgSize; - - if (SDLNet_Init() < 0) { - DLog(@"SDLNet_Init: %s", SDLNet_GetError()); - clientQuit = YES; - } - - // Resolving the host using NULL make network interface to listen - if (SDLNet_ResolveHost(&ip, "netserver.hedgewars.org", NETGAME_DEFAULT_PORT) < 0 && !clientQuit) { - DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError()); - clientQuit = YES; - } - - // Open a connection with the IP provided (listen on the host's port) - if (!(sd = SDLNet_TCP_Open(&ip)) && !clientQuit) { - DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), NETGAME_DEFAULT_PORT); - clientQuit = YES; - } - - DLog(@"Found server on port %d", NETGAME_DEFAULT_PORT); - while (!clientQuit) { - int index = 0; - BOOL exitBufferLoop = NO; - memset(buffer, '\0', dim); - - while (exitBufferLoop != YES) { - msgSize = SDLNet_TCP_Recv(sd, &buffer[index], 2); - - // exit in case of error - if (msgSize <= 0) { - DLog(@"SDLNet_TCP_Recv: %s", SDLNet_GetError()); - clientQuit = YES; - break; - } - - // update index position and check for End-Of-Message - index += msgSize; - if (strncmp(&buffer[index-2], "\n\n", 2) == 0) { - exitBufferLoop = YES; - } - - // if message is too big allocate new space - if (index >= dim) { - dim += BUFFER_SIZE; - buffer = (char *)realloc(buffer, dim); - if (buffer == NULL) { - clientQuit = YES; - break; - } - } - } - - NSString *bufferedMessage = [[NSString alloc] initWithBytes:buffer length:index-2 encoding:NSASCIIStringEncoding]; - NSArray *listOfCommands = [bufferedMessage componentsSeparatedByString:@"\n"]; - [bufferedMessage release]; - NSString *command = [listOfCommands objectAtIndex:0]; - DLog(@"size = %d, %@", index-2, listOfCommands); - if ([command isEqualToString:@"PING"]) { - if ([listOfCommands count] > 1) - [self sendToServer:@"PONG" withArgument:[listOfCommands objectAtIndex:1]]; - else - [self sendToServer:@"PONG"]; - DLog(@"PONG"); - } - else if ([command isEqualToString:@"NICK"]) { - //what is this for? - } - else if ([command isEqualToString:@"PROTO"]) { - //what is this for? - } - else if ([command isEqualToString:@"ROOM"]) { - //TODO: stub - } - else if ([command isEqualToString:@"LOBBY:LEFT"]) { - //TODO: stub - } - else if ([command isEqualToString:@"LOBBY:JOINED"]) { - //TODO: stub - } - else if ([command isEqualToString:@"ASKPASSWORD"]) { - NSString *pwd = [self.systemSettings objectForKey:@"password"]; - [self sendToServer:@"PASSWORD" withArgument:pwd]; - } - else if ([command isEqualToString:@"CONNECTED"]) { - int netProto; - char *versionStr; - HW_versionInfo(&netProto, &versionStr); - NSString *nick = [self.systemSettings objectForKey:@"username"]; - [self sendToServer:@"NICK" withArgument:nick]; - [self sendToServer:@"PROTO" withArgument:[NSString stringWithFormat:@"%d",netProto]]; - } - else if ([command isEqualToString:@"SERVER_MESSAGE"]) { - DLog(@"%@", [listOfCommands objectAtIndex:1]); - } - else if ([command isEqualToString:@"WARNING"]) { - if ([listOfCommands count] > 1) - DLog(@"Server warning - %@", [listOfCommands objectAtIndex:1]); - else - DLog(@"Server warning - unknown"); - } - else if ([command isEqualToString:@"ERROR"]) { - DLog(@"Server error - %@", [listOfCommands objectAtIndex:1]); - } - else if ([command isEqualToString:@"BYE"]) { - //TODO: handle "Reconnected too fast" - DLog(@"Server disconnected, reason: %@", [listOfCommands objectAtIndex:1]); - clientQuit = YES; - } - else { - DLog(@"Unknown/Unsupported message received: %@", command); - } - } - DLog(@"Server closed connection, ending thread"); - - free(buffer); - SDLNet_TCP_Close(sd); - SDLNet_Quit(); - - [pool release]; -} - -@end