1.1 --- a/src/client.c Mon Mar 17 15:39:36 2014 +0100 1.2 +++ b/src/client.c Wed Mar 19 10:08:25 2014 +0100 1.3 @@ -29,55 +29,67 @@ 1.4 1.5 #include "terminal-chess.h" 1.6 #include "input.h" 1.7 +#include "game.h" 1.8 #include <ncurses.h> 1.9 1.10 -int client_run(Settings *settings) { 1.11 - Server server; 1.12 - int exit_code = EXIT_SUCCESS; 1.13 - 1.14 - if (net_find(&server, settings->serverhost, settings->port)) { 1.15 +static int client_connect(Server *server, char *host, char *port) { 1.16 + if (net_find(server, host, port)) { 1.17 fprintf(stderr, "Can't find server\n"); 1.18 - exit_code = EXIT_FAILURE; 1.19 - goto quit; 1.20 + return 1; 1.21 } 1.22 1.23 - if (net_connect(&server)) { 1.24 + if (net_connect(server)) { 1.25 perror("Can't connect to server"); 1.26 - exit_code = EXIT_FAILURE; 1.27 - goto quit; 1.28 + return 1; 1.29 } 1.30 + 1.31 + return 0; 1.32 +} 1.33 1.34 - /* net version handshake */ 1.35 - int fd = server.fd; 1.36 - if (net_recieve_code(fd) != NETCODE_VERSION) { 1.37 +static int client_handshake(Server *server) { 1.38 + if (net_recieve_code(server->fd) != NETCODE_VERSION) { 1.39 fprintf(stderr, "Server uses an incompatible software version.\n"); 1.40 - exit_code = EXIT_FAILURE; 1.41 - goto quit; 1.42 + return 1; 1.43 } else { 1.44 - net_send_code(fd, NETCODE_VERSION); 1.45 + net_send_code(server->fd, NETCODE_VERSION); 1.46 } 1.47 1.48 printw("Connection established!\n\n"); 1.49 refresh(); 1.50 + 1.51 + return 0; 1.52 +} 1.53 1.54 - if (net_recieve_code(fd) == NETCODE_GAMEINFO) { 1.55 - net_recieve_data(fd, &(settings->gameinfo), 1.56 +int client_run(Settings *settings) { 1.57 + Server server; 1.58 + 1.59 + if (client_connect(&server, settings->serverhost, settings->port)) { 1.60 + net_destroy(&server); 1.61 + return EXIT_FAILURE; 1.62 + } 1.63 + 1.64 + if (client_handshake(&server)) { 1.65 + net_destroy(&server); 1.66 + return EXIT_FAILURE; 1.67 + } 1.68 + 1.69 + if (net_recieve_code(server.fd) == NETCODE_GAMEINFO) { 1.70 + net_recieve_data(server.fd, &(settings->gameinfo), 1.71 sizeof(settings->gameinfo)); 1.72 dump_gameinfo(&(settings->gameinfo)); 1.73 printw("Accept challenge (y/n)? "); 1.74 if (prompt_yesno()) { 1.75 - net_send_code(fd, NETCODE_ACCEPT); 1.76 - // TODO: start game 1.77 + net_send_code(server.fd, NETCODE_ACCEPT); 1.78 + game_start(settings, server.fd); 1.79 } else { 1.80 - net_send_code(fd, NETCODE_DECLINE); 1.81 + net_send_code(server.fd, NETCODE_DECLINE); 1.82 } 1.83 } else { 1.84 fprintf(stderr, "Server sent invalid gameinfo.\n"); 1.85 - exit_code = EXIT_FAILURE; 1.86 - goto quit; 1.87 + net_destroy(&server); 1.88 + return EXIT_FAILURE; 1.89 } 1.90 1.91 -quit: 1.92 net_destroy(&server); 1.93 - return exit_code; 1.94 + return EXIT_SUCCESS; 1.95 }