src/client.c

changeset 6
daaf6e5b3501
parent 5
f7dfef88947d
child 7
41468077b5bb
equal deleted inserted replaced
5:f7dfef88947d 6:daaf6e5b3501
27 * 27 *
28 */ 28 */
29 29
30 #include "terminal-chess.h" 30 #include "terminal-chess.h"
31 #include "input.h" 31 #include "input.h"
32 #include "game.h"
32 #include <ncurses.h> 33 #include <ncurses.h>
33 34
34 int client_run(Settings *settings) { 35 static int client_connect(Server *server, char *host, char *port) {
35 Server server; 36 if (net_find(server, host, port)) {
36 int exit_code = EXIT_SUCCESS;
37
38 if (net_find(&server, settings->serverhost, settings->port)) {
39 fprintf(stderr, "Can't find server\n"); 37 fprintf(stderr, "Can't find server\n");
40 exit_code = EXIT_FAILURE; 38 return 1;
41 goto quit;
42 } 39 }
43 40
44 if (net_connect(&server)) { 41 if (net_connect(server)) {
45 perror("Can't connect to server"); 42 perror("Can't connect to server");
46 exit_code = EXIT_FAILURE; 43 return 1;
47 goto quit;
48 } 44 }
45
46 return 0;
47 }
49 48
50 /* net version handshake */ 49 static int client_handshake(Server *server) {
51 int fd = server.fd; 50 if (net_recieve_code(server->fd) != NETCODE_VERSION) {
52 if (net_recieve_code(fd) != NETCODE_VERSION) {
53 fprintf(stderr, "Server uses an incompatible software version.\n"); 51 fprintf(stderr, "Server uses an incompatible software version.\n");
54 exit_code = EXIT_FAILURE; 52 return 1;
55 goto quit;
56 } else { 53 } else {
57 net_send_code(fd, NETCODE_VERSION); 54 net_send_code(server->fd, NETCODE_VERSION);
58 } 55 }
59 56
60 printw("Connection established!\n\n"); 57 printw("Connection established!\n\n");
61 refresh(); 58 refresh();
59
60 return 0;
61 }
62 62
63 if (net_recieve_code(fd) == NETCODE_GAMEINFO) { 63 int client_run(Settings *settings) {
64 net_recieve_data(fd, &(settings->gameinfo), 64 Server server;
65
66 if (client_connect(&server, settings->serverhost, settings->port)) {
67 net_destroy(&server);
68 return EXIT_FAILURE;
69 }
70
71 if (client_handshake(&server)) {
72 net_destroy(&server);
73 return EXIT_FAILURE;
74 }
75
76 if (net_recieve_code(server.fd) == NETCODE_GAMEINFO) {
77 net_recieve_data(server.fd, &(settings->gameinfo),
65 sizeof(settings->gameinfo)); 78 sizeof(settings->gameinfo));
66 dump_gameinfo(&(settings->gameinfo)); 79 dump_gameinfo(&(settings->gameinfo));
67 printw("Accept challenge (y/n)? "); 80 printw("Accept challenge (y/n)? ");
68 if (prompt_yesno()) { 81 if (prompt_yesno()) {
69 net_send_code(fd, NETCODE_ACCEPT); 82 net_send_code(server.fd, NETCODE_ACCEPT);
70 // TODO: start game 83 game_start(settings, server.fd);
71 } else { 84 } else {
72 net_send_code(fd, NETCODE_DECLINE); 85 net_send_code(server.fd, NETCODE_DECLINE);
73 } 86 }
74 } else { 87 } else {
75 fprintf(stderr, "Server sent invalid gameinfo.\n"); 88 fprintf(stderr, "Server sent invalid gameinfo.\n");
76 exit_code = EXIT_FAILURE; 89 net_destroy(&server);
77 goto quit; 90 return EXIT_FAILURE;
78 } 91 }
79 92
80 quit:
81 net_destroy(&server); 93 net_destroy(&server);
82 return exit_code; 94 return EXIT_SUCCESS;
83 } 95 }

mercurial