project_files/HedgewarsMobile/Classes/ServerSetup.m
author koda
Tue, 23 Aug 2011 03:46:17 +0200
changeset 5662 99083392cd4f
parent 5483 fc755bb8096d
child 6078 8c0cc07731e5
permissions -rw-r--r--
FREE AT LAST!!! SDL came around a (mostly) sane way for implementing rotation events, so we can scrap all the workaround code that has been added to workaround it!! Also this allows us to use proper (internal) multitasking handling and can simplify optional settings and other yet unexplored features. Yay!
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"
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    23
#import "PascalImports.h"
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    24
#import "CommodityFunctions.h"
5201
7b9aa7aac336 * moved colours and default port from .cpp.in to .h
koda
parents: 4976
diff changeset
    25
#import "hwconsts.h"
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    26
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    27
#define BUFFER_SIZE 256
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    28
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    29
@implementation ServerSetup
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    30
@synthesize systemSettings;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    31
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    32
-(id) init {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    33
    if (self = [super init]) {
5206
db775bddf771 settings.plist is no more, long live nsuserdefaults
koda
parents: 5201
diff changeset
    34
        self.systemSettings = nil; //nsuserdefault
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    35
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    36
    return self;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    37
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    38
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    39
-(void) dealloc {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    40
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    41
    [super dealloc];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    42
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    43
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    44
-(int) sendToServer:(NSString *)command {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    45
    NSString *message = [[NSString alloc] initWithFormat:@"%@\n\n",command];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    46
    int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    47
    [message release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    48
    return result;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    49
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    50
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    51
-(int) sendToServer:(NSString *)command withArgument:(NSString *)argument {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    52
    NSString *message = [[NSString alloc] initWithFormat:@"%@\n%@\n\n",command,argument];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    53
    int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    54
    [message release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    55
    return result;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    56
}
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    57
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    58
-(void) serverProtocol {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    59
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    60
    IPaddress ip;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    61
    BOOL clientQuit = NO;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    62
    char *buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    63
    int dim = BUFFER_SIZE;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    64
    uint8_t msgSize;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    65
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    66
    if (SDLNet_Init() < 0) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    67
        DLog(@"SDLNet_Init: %s", SDLNet_GetError());
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    68
        clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    69
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    70
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    71
    // 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
    72
    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
    73
        DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    74
        clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    75
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    76
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    77
    // 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
    78
    if (!(sd = SDLNet_TCP_Open(&ip)) && !clientQuit) {
5201
7b9aa7aac336 * moved colours and default port from .cpp.in to .h
koda
parents: 4976
diff changeset
    79
        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
    80
        clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    81
    }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    82
5201
7b9aa7aac336 * moved colours and default port from .cpp.in to .h
koda
parents: 4976
diff changeset
    83
    DLog(@"Found server on port %d", NETGAME_DEFAULT_PORT);
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    84
    while (!clientQuit) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    85
        int index = 0;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    86
        BOOL exitBufferLoop = NO;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    87
        memset(buffer, '\0', dim);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    88
        
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    89
        while (exitBufferLoop != YES) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    90
            msgSize = SDLNet_TCP_Recv(sd, &buffer[index], 2);
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
            // exit in case of error
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    93
            if (msgSize <= 0) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    94
                DLog(@"SDLNet_TCP_Recv: %s", SDLNet_GetError());
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    95
                clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    96
                break;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
    97
            }
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
            // update index position and check for End-Of-Message
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   100
            index += msgSize;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   101
            if (strncmp(&buffer[index-2], "\n\n", 2) == 0) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   102
                exitBufferLoop = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   103
            }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   104
            
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   105
            // if message is too big allocate new space
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   106
            if (index >= dim) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   107
                dim += BUFFER_SIZE;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   108
                buffer = (char *)realloc(buffer, dim);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   109
                if (buffer == NULL) {
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
                    break;
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
            }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   114
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   115
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   116
        NSString *bufferedMessage = [[NSString alloc] initWithBytes:buffer length:index-2 encoding:NSASCIIStringEncoding];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   117
        NSArray *listOfCommands = [bufferedMessage componentsSeparatedByString:@"\n"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   118
        [bufferedMessage release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   119
        NSString *command = [listOfCommands objectAtIndex:0];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   120
        DLog(@"size = %d, %@", index-2, listOfCommands);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   121
        if ([command isEqualToString:@"PING"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   122
            if ([listOfCommands count] > 1)
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   123
                [self sendToServer:@"PONG" withArgument:[listOfCommands objectAtIndex:1]];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   124
            else
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   125
                [self sendToServer:@"PONG"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   126
            DLog(@"PONG");
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   127
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   128
        else if ([command isEqualToString:@"NICK"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   129
            //what is this for?
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
        else if ([command isEqualToString:@"PROTO"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   132
            //what is this for?
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
        else if ([command isEqualToString:@"ROOM"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   135
            //TODO: stub
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   136
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   137
        else if ([command isEqualToString:@"LOBBY:LEFT"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   138
            //TODO: stub
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
        else if ([command isEqualToString:@"LOBBY:JOINED"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   141
            //TODO: stub
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   142
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   143
        else if ([command isEqualToString:@"ASKPASSWORD"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   144
            NSString *pwd = [self.systemSettings objectForKey:@"password"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   145
            [self sendToServer:@"PASSWORD" withArgument:pwd];
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
        else if ([command isEqualToString:@"CONNECTED"]) {
4603
d362ab6c7f53 damn. it.
koda
parents: 4547
diff changeset
   148
            int netProto;
4547
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   149
            char *versionStr;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   150
            HW_versionInfo(&netProto, &versionStr);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   151
            NSString *nick = [self.systemSettings objectForKey:@"username"];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   152
            [self sendToServer:@"NICK" withArgument:nick];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   153
            [self sendToServer:@"PROTO" withArgument:[NSString stringWithFormat:@"%d",netProto]];
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
        else if ([command isEqualToString:@"SERVER_MESSAGE"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   156
            DLog(@"%@", [listOfCommands objectAtIndex:1]);
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
        else if ([command isEqualToString:@"WARNING"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   159
            if ([listOfCommands count] > 1)
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   160
                DLog(@"Server warning - %@", [listOfCommands objectAtIndex:1]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   161
            else
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   162
                DLog(@"Server warning - unknown");
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   163
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   164
        else if ([command isEqualToString:@"ERROR"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   165
            DLog(@"Server error - %@", [listOfCommands objectAtIndex:1]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   166
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   167
        else if ([command isEqualToString:@"BYE"]) {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   168
            //TODO: handle "Reconnected too fast"
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   169
            DLog(@"Server disconnected, reason: %@", [listOfCommands objectAtIndex:1]);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   170
            clientQuit = YES;
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   171
        }
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   172
        else {
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   173
            DLog(@"Unknown/Unsupported message received: %@", command);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   174
        }
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
    DLog(@"Server closed connection, ending thread");
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   177
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   178
    free(buffer);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   179
    SDLNet_TCP_Close(sd);
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   180
    SDLNet_Quit();
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
    [pool release];
b70004a576a3 move server connection stuff in its own class
koda
parents:
diff changeset
   183
}
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
@end