diff -r 8e83c7e31720 -r c0da3a98c01c cocoaTouch/gameSetup.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cocoaTouch/gameSetup.m Sun Jan 10 00:52:20 2010 +0000 @@ -0,0 +1,162 @@ +// +// gameSetup.m +// hwengine +// +// Created by Vittorio on 10/01/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import +#import "SDL_uikitappdelegate.h" +#import "gameSetup.h" +#import "SDL_net.h" +#import "PascalImports.h" + +#define IPC_PORT 51342 +#define IPC_PORT_STR "51342" +#define BUFFER_SIZE 256 + + +@implementation gameSetup + +void engineProtocolThread () { + TCPsocket sd, csd; /* Socket descriptor, Client socket descriptor */ + IPaddress ip; + int idx, eProto; + BOOL serverQuit, clientQuit; + char buffer[BUFFER_SIZE], string[BUFFER_SIZE]; + Uint8 msgSize; + Uint16 gameTicks; + + if (SDLNet_Init() < 0) { + fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError()); + exit(EXIT_FAILURE); + } + + /* Resolving the host using NULL make network interface to listen */ + if (SDLNet_ResolveHost(&ip, NULL, IPC_PORT) < 0) { + fprintf(stderr, "SDLNet_ResolveHost: %s\n", SDLNet_GetError()); + exit(EXIT_FAILURE); + } + + /* Open a connection with the IP provided (listen on the host's port) */ + if (!(sd = SDLNet_TCP_Open(&ip))) { + fprintf(stderr, "SDLNet_TCP_Open: %s\n", SDLNet_GetError()); + exit(EXIT_FAILURE); + } + + NSLog(@"engineProtocolThread - Waiting for a client"); + + serverQuit = NO; + while (!serverQuit) { + + /* This check the sd if there is a pending connection. + * If there is one, accept that, and open a new socket for communicating */ + if ((csd = SDLNet_TCP_Accept(sd))) { + + NSLog(@"engineProtocolThread - Client found"); + + //first byte of the command alwayas contain the size of the command + SDLNet_TCP_Recv(csd, &msgSize, sizeof(Uint8)); + + SDLNet_TCP_Recv(csd, buffer, msgSize); + gameTicks = SDLNet_Read16(&buffer[msgSize - 2]); + NSLog(@"engineProtocolThread - %d: received [%s]", gameTicks, buffer); + + if ('C' == buffer[0]) { + NSLog(@"engineProtocolThread - Client found and connected"); + clientQuit = NO; + } else { + NSLog(@"engineProtocolThread - wrong Connected message, closing"); + clientQuit = YES; + } + + while (!clientQuit){ + /* Now we can communicate with the client using csd socket + * sd will remain opened waiting other connections */ + idx = 0; + msgSize = 0; + memset(buffer, 0, BUFFER_SIZE); + memset(string, 0, BUFFER_SIZE); + SDLNet_TCP_Recv(csd, &msgSize, sizeof(Uint8)); + + SDLNet_TCP_Recv(csd, buffer, msgSize); + gameTicks = SDLNet_Read16(&buffer[msgSize - 2]); + NSLog(@"engineProtocolThread - %d: received [%s]", gameTicks, buffer); + + switch (buffer[0]) { + case '?': + NSLog(@"Ping? Pong!"); + string[idx++] = 0x01; + string[idx++] = '!'; + + SDLNet_TCP_Send(csd, string, idx); + break; + case 'E': + NSLog(@"ERROR - last console line: [%s]", buffer); + clientQuit = YES; + break; + default: + sscanf(buffer, "%*s %d", &eProto); + if (HW_protoVer() == eProto) { + NSLog(@"Setting protocol version %s", buffer); + } else { + NSLog(@"ERROR - wrong protocol number: [%s] - expecting %d", buffer, eProto); + clientQuit = YES; + } + + break; + } + + /* + // Terminate this connection + if(strcmp(buffer, "exit") == 0) { + quit2 = 1; + printf("Terminate connection\n"); + } + // Quit the thread + if(strcmp(buffer, "quit") == 0) { + quit2 = 1; + quit = 1; + printf("Quit program\n"); + } + */ + } + } + + /* Close the client socket */ + SDLNet_TCP_Close(csd); + } + + SDLNet_TCP_Close(sd); + SDLNet_Quit(); + + pthread_exit(NULL); +} + +void setupArgsForLocalPlay() { + forward_argc = 18; + forward_argv = (char **)realloc(forward_argv, forward_argc * sizeof(char *)); + //forward_argv[i] = malloc( (strlen(argv[i])+1) * sizeof(char)); + forward_argv[ 1] = forward_argv[0]; // (UNUSED) + forward_argv[ 2] = "320"; // cScreenWidth (NO EFFECT) + forward_argv[ 3] = "480"; // cScreenHeight (NO EFFECT) + forward_argv[ 4] = "32"; // cBitsStr + forward_argv[ 5] = IPC_PORT_STR; // ipcPort; <- (MAIN TODO) + forward_argv[ 6] = "1"; // cFullScreen (NO EFFECT) + forward_argv[ 7] = "0"; // isSoundEnabled (TOSET) + forward_argv[ 8] = "1"; // cVSyncInUse (UNUSED) + forward_argv[ 9] = "en.txt"; // cLocaleFName (TOSET) + forward_argv[10] = "100"; // cInitVolume (TOSET) + forward_argv[11] = "8"; // cTimerInterval + forward_argv[12] = "Data"; // PathPrefix + forward_argv[13] = "1"; // cShowFPS (TOSET?) + forward_argv[14] = "0"; // cAltDamage (TOSET) + forward_argv[15] = "Koda"; // UserNick (DecodeBase64(ParamStr(15)) FTW) <- TODO + forward_argv[16] = "0"; // isMusicEnabled (TOSET) + forward_argv[17] = "0"; // cReducedQuality + + return; +} + +@end