project_files/HedgewarsMobile/Classes/ServerSetup.m
author nemo
Sun, 02 Oct 2011 10:36:43 -0400
changeset 6081 537bbd5c1a62
parent 6078 8c0cc07731e5
permissions -rw-r--r--
Basic test implementation of an ice flag. Allows for slick parts of terrain. Intended for ice gun, or "ice" mask on portions of land objects. In this test variant it is triggered on girders/objects/bridges of the snow/christmas theme, or on a map that uses blue as a mask colour. Probably needs sheepluva's slope detection to make slopes more slippery to climb.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     1
/*
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     2
 * Hedgewars-iOS, a Hedgewars port for iOS devices
4976
088d40d8aba2 Happy 2011 :)
koda
parents: 4603
diff changeset
     3
 * Copyright (c) 2009-2011 Vittorio Giovara <vittorio.giovara@gmail.com>
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     4
 *
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     8
 *
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    12
 * GNU General Public License for more details.
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    13
 *
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    17
 *
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    18
 * File created on 10/01/2010.
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    19
 */
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    20
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    21
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    22
#import "ServerSetup.h"
6078
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    23
#import <netinet/in.h>
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    24
#import <SystemConfiguration/SCNetworkReachability.h>
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    25
5201
7b9aa7aac336 * moved colours and default port from .cpp.in to .h
koda
parents: 4976
diff changeset
    26
#import "hwconsts.h"
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    27
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    28
#define BUFFER_SIZE 256
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    29
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    30
@implementation ServerSetup
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    31
@synthesize systemSettings;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    32
6078
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    33
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    34
+(NSInteger) randomPort {
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    35
    srandom(time(NULL));
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    36
    NSInteger res = (random() % 64511) + 1024;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    37
    return (res == NETGAME_DEFAULT_PORT) ? [ServerSetup randomPort] : res;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    38
}
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    39
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    40
+(BOOL) isNetworkReachable {
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    41
    // Create zero addy
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    42
    struct sockaddr_in zeroAddress;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    43
    bzero(&zeroAddress, sizeof(zeroAddress));
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    44
    zeroAddress.sin_len = sizeof(zeroAddress);
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    45
    zeroAddress.sin_family = AF_INET;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    46
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    47
    // Recover reachability flags
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    48
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    49
    SCNetworkReachabilityFlags flags;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    50
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    51
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    52
    CFRelease(defaultRouteReachability);
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    53
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    54
    if (!didRetrieveFlags) {
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    55
        NSLog(@"Error. Could not recover network reachability flags");
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    56
        return NO;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    57
    }
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    58
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    59
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    60
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    61
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    62
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    63
    NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    64
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    65
                                                 cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    66
                                             timeoutInterval:20.0];
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    67
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:nil];
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    68
    BOOL testResult = testConnection ? YES : NO;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    69
    [testConnection release];
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    70
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    71
    return ((isReachable && !needsConnection) || nonWiFi) ? testResult : NO;
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    72
}
8c0cc07731e5 headers cleanup, converted some function-only sources into proper class method files, more use of OOP power, removed some 'respondsToSelector' calls, moved defines into their own header, more use of objc categories
koda
parents: 5483
diff changeset
    73
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    74
-(id) init {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    75
    if (self = [super init]) {
5206
db775bddf771 settings.plist is no more, long live nsuserdefaults
koda
parents: 5201
diff changeset
    76
        self.systemSettings = nil; //nsuserdefault
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    77
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    78
    return self;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    79
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    80
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    81
-(void) dealloc {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    82
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    83
    [super dealloc];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    84
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    85
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    86
-(int) sendToServer:(NSString *)command {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    87
    NSString *message = [[NSString alloc] initWithFormat:@"%@\n\n",command];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    88
    int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    89
    [message release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    90
    return result;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    91
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    92
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    93
-(int) sendToServer:(NSString *)command withArgument:(NSString *)argument {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    94
    NSString *message = [[NSString alloc] initWithFormat:@"%@\n%@\n\n",command,argument];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    95
    int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    96
    [message release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    97
    return result;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    98
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    99
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   100
-(void) serverProtocol {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   101
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   102
    IPaddress ip;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   103
    BOOL clientQuit = NO;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   104
    char *buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   105
    int dim = BUFFER_SIZE;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   106
    uint8_t msgSize;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   107
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   108
    if (SDLNet_Init() < 0) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   109
        DLog(@"SDLNet_Init: %s", SDLNet_GetError());
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   110
        clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   111
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   112
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   113
    // Resolving the host using NULL make network interface to listen
5201
7b9aa7aac336 * moved colours and default port from .cpp.in to .h
koda
parents: 4976
diff changeset
   114
    if (SDLNet_ResolveHost(&ip, "netserver.hedgewars.org", NETGAME_DEFAULT_PORT) < 0 && !clientQuit) {
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   115
        DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   116
        clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   117
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   118
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   119
    // Open a connection with the IP provided (listen on the host's port)
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   120
    if (!(sd = SDLNet_TCP_Open(&ip)) && !clientQuit) {
5201
7b9aa7aac336 * moved colours and default port from .cpp.in to .h
koda
parents: 4976
diff changeset
   121
        DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), NETGAME_DEFAULT_PORT);
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   122
        clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   123
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   124
5201
7b9aa7aac336 * moved colours and default port from .cpp.in to .h
koda
parents: 4976
diff changeset
   125
    DLog(@"Found server on port %d", NETGAME_DEFAULT_PORT);
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   126
    while (!clientQuit) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   127
        int index = 0;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   128
        BOOL exitBufferLoop = NO;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   129
        memset(buffer, '\0', dim);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   130
        
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   131
        while (exitBufferLoop != YES) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   132
            msgSize = SDLNet_TCP_Recv(sd, &buffer[index], 2);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   133
            
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   134
            // exit in case of error
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   135
            if (msgSize <= 0) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   136
                DLog(@"SDLNet_TCP_Recv: %s", SDLNet_GetError());
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   137
                clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   138
                break;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   139
            }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   140
            
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   141
            // update index position and check for End-Of-Message
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   142
            index += msgSize;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   143
            if (strncmp(&buffer[index-2], "\n\n", 2) == 0) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   144
                exitBufferLoop = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   145
            }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   146
            
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   147
            // if message is too big allocate new space
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   148
            if (index >= dim) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   149
                dim += BUFFER_SIZE;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   150
                buffer = (char *)realloc(buffer, dim);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   151
                if (buffer == NULL) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   152
                    clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   153
                    break;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   154
                }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   155
            }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   156
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   157
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   158
        NSString *bufferedMessage = [[NSString alloc] initWithBytes:buffer length:index-2 encoding:NSASCIIStringEncoding];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   159
        NSArray *listOfCommands = [bufferedMessage componentsSeparatedByString:@"\n"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   160
        [bufferedMessage release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   161
        NSString *command = [listOfCommands objectAtIndex:0];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   162
        DLog(@"size = %d, %@", index-2, listOfCommands);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   163
        if ([command isEqualToString:@"PING"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   164
            if ([listOfCommands count] > 1)
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   165
                [self sendToServer:@"PONG" withArgument:[listOfCommands objectAtIndex:1]];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   166
            else
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   167
                [self sendToServer:@"PONG"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   168
            DLog(@"PONG");
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   169
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   170
        else if ([command isEqualToString:@"NICK"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   171
            //what is this for?
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   172
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   173
        else if ([command isEqualToString:@"PROTO"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   174
            //what is this for?
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   175
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   176
        else if ([command isEqualToString:@"ROOM"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   177
            //TODO: stub
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   178
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   179
        else if ([command isEqualToString:@"LOBBY:LEFT"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   180
            //TODO: stub
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   181
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   182
        else if ([command isEqualToString:@"LOBBY:JOINED"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   183
            //TODO: stub
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   184
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   185
        else if ([command isEqualToString:@"ASKPASSWORD"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   186
            NSString *pwd = [self.systemSettings objectForKey:@"password"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   187
            [self sendToServer:@"PASSWORD" withArgument:pwd];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   188
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   189
        else if ([command isEqualToString:@"CONNECTED"]) {
4603
d362ab6c7f53 damn. it.
koda
parents: 4547
diff changeset
   190
            int netProto;
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   191
            char *versionStr;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   192
            HW_versionInfo(&netProto, &versionStr);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   193
            NSString *nick = [self.systemSettings objectForKey:@"username"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   194
            [self sendToServer:@"NICK" withArgument:nick];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   195
            [self sendToServer:@"PROTO" withArgument:[NSString stringWithFormat:@"%d",netProto]];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   196
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   197
        else if ([command isEqualToString:@"SERVER_MESSAGE"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   198
            DLog(@"%@", [listOfCommands objectAtIndex:1]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   199
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   200
        else if ([command isEqualToString:@"WARNING"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   201
            if ([listOfCommands count] > 1)
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   202
                DLog(@"Server warning - %@", [listOfCommands objectAtIndex:1]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   203
            else
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   204
                DLog(@"Server warning - unknown");
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   205
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   206
        else if ([command isEqualToString:@"ERROR"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   207
            DLog(@"Server error - %@", [listOfCommands objectAtIndex:1]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   208
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   209
        else if ([command isEqualToString:@"BYE"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   210
            //TODO: handle "Reconnected too fast"
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   211
            DLog(@"Server disconnected, reason: %@", [listOfCommands objectAtIndex:1]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   212
            clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   213
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   214
        else {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   215
            DLog(@"Unknown/Unsupported message received: %@", command);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   216
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   217
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   218
    DLog(@"Server closed connection, ending thread");
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   219
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   220
    free(buffer);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   221
    SDLNet_TCP_Close(sd);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   222
    SDLNet_Quit();
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   223
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   224
    [pool release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   225
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   226
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   227
@end