-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMainMenu.cpp
More file actions
142 lines (115 loc) · 4.91 KB
/
MainMenu.cpp
File metadata and controls
142 lines (115 loc) · 4.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <iostream>
#include "StringParser.h"
#include "ServerStats.h"
#include "GameClass2.h"
#include "HeadsTailsServer.h"
#include "ThreadContext.h"
using namespace std;
class MainMenu
{
private:
char buffer[1024] = {0}; // buffer for socket listening
char DISCONNECT_RPC[1024] = "rpc=disconnect;";
char SELECT_HT_RPC[1024] = "rpc=selectgame;game=1;";
char SELECTGAME2_RPC[1024] = "rpc=selectgame;game=2;";
char SERVER_STATS_RPC[1024] = "rpc=returnStats;";
int socket; // socket to listen from
public:
MainMenu(int socket) {
this->socket = socket;
}
// MAIN MENU LOOP: takes a thread and reads/sends until it reads the disconnect RPC
void loopThread(ServerStats &serverStats, ThreadContext &context) {
bool connected = true;
int readStatus;
while (connected)
{
memset(buffer, 0, sizeof(buffer));
// Here is where we read all RPCs from client
readStatus = read(socket, buffer, 1024);
if (readStatus == 0) {
connected = false;
}
std::cout << "Buffer reads \'" << buffer << "\', in MM." << std::endl;
// start of game 1: Heads-Tails selection ------------------------------
if (strcmp(buffer , SELECT_HT_RPC) == 0 )
{
send(socket, buffer , strlen(buffer) , 0 );
memset(buffer, 0, sizeof(buffer));
cout << "constructor about to be called" << endl;
HeadsTailsServer *htSession = nullptr;
htSession = new HeadsTailsServer(socket, serverStats);
int gameRetVal = htSession->gameMenu(context);
cout << "destructor about to be called" << endl;
delete htSession;
if (gameRetVal == 1)
{ // 1 is the disconnect code
disconnectMainMenu(socket, DISCONNECT_RPC);
connected = false;
}
}
// end of of game 1: Heads-Tails selection ------------------------------
// Start of game slot 2 selection ------------------------------
// Application Programmer: your game can be interfaced here.
if (strcmp(buffer , SELECTGAME2_RPC) == 0 )
{
send(socket, buffer , strlen(buffer) , 0 );
memset(buffer, 0, sizeof(buffer));
GameClass2 *GameClass2Ptr = nullptr;
GameClass2Ptr = new GameClass2(socket, serverStats);
int gameRetVal = GameClass2Ptr->gameMenu();
delete GameClass2Ptr;
if (gameRetVal == 1) {
disconnectMainMenu(socket, DISCONNECT_RPC);
connected = false;
} else {
send(socket , buffer, strlen(buffer) , 0 );
}
}
// end of of game slot 2 selection ------------------------------
// Returns server information
else if (strcmp(buffer, SERVER_STATS_RPC) == 0 )
{
memset(buffer, 0, sizeof(buffer));
char lifetimeClientsBuffer[100];
//char highScoreBuffer[100];
char lifetime[23] = ": Lifetime Clients || ";
char clients[21] = ": Active Clients || ";
// char highScore[17] = ": High Score || ";
sprintf(lifetimeClientsBuffer,"%d", serverStats.getLifetimeConnections());
strcat(lifetimeClientsBuffer, lifetime);
sprintf(buffer,"%d", serverStats.getNumActiveClients());
strcat(buffer, clients);
// sprintf(highScoreBuffer,"%d", serverStats.getHeadsTailsHS());
// strcat(highScoreBuffer, highScore);
strcat(buffer, lifetimeClientsBuffer);
// strcat(buffer, highScoreBuffer);
send(socket, buffer, strlen(buffer), 0 );
}
// disconnect rpc call made by client VOLUNTARILY
else if (strcmp(buffer , DISCONNECT_RPC) == 0 )
{
disconnectMainMenu(socket, DISCONNECT_RPC);
connected = false;
}
else
{
send(socket , buffer, strlen(buffer) , 0 );
}
}
}
// Sends a message to client, and then closes the socket assigned to current client.
// return 0 if successful, -1 if failed
int disconnectMainMenu(int socket_num, char *buff) {
// char disconnectMsg[1024] = {0};
send(socket_num, buff, strlen(buff) , 0 );
// close active socket
return close(socket_num);
}
};