-
Notifications
You must be signed in to change notification settings - Fork 0
/
hall.h
144 lines (110 loc) · 2.9 KB
/
hall.h
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
143
144
#ifndef HALL_H
#define HALL_H
#include <map>
#include <utility>
#include <qglobal.h>
#include "room.h"
#include "protocol.h"
#include "server.h"
class Login;
class Pin;
class HallAction;
class Join;
class Create;
// This is the server instance that manages connected clients
// who haven't joined any room yet.
class Hall : public Server {
Q_OBJECT
public:
static Hall *Get() { return &hall_; }
~Hall() override;
void welcome(Client *client) override;
// Set up the default rooms.
void setupRooms() {
CreateRoom("default").first->startLooper();
}
signals:
// Signals a new connection has been accepted by TCP socket server.
void newConnection(qintptr socketDescriptor);
public slots:
// Creates a new client to handle the new connection.
void newClient(qintptr socketDescriptor);
// Processes a client has quit the Hall.
void quit(Client *client);
private:
static Hall hall_;
static std::map<QString, Room *> opens_;
static std::pair<Room *, bool> CreateRoom(const QString &name, const QString &pin = "");
explicit Hall(QObject *parent = 0);
std::map<QString, Client *> users_;
friend class Login;
friend class Pin;
friend class HallAction;
friend class Join;
friend class Create;
};
// The protocol that handles client's login behavior.
class Login : public Protocol {
public:
Login(Hall *hall, Client *client);
~Login() override;
const QString *intro() const override;
bool execute(const QString &input, QStringList *output) override;
bool finished() override;
private:
static QString welcome_;
Hall *hall_;
Client *client_;
QString name_;
};
// The protocol that enforce a client to enter pin code
// before joining a private room.
class Pin : public Protocol {
public:
Pin(Room *room, Client *client);
~Pin() override;
const QString *intro() const override;
bool execute(const QString &input, QStringList *output) override;
bool finished() override;
private:
static QString msg_;
Room *room_;
Client *client_;
bool pass_;
};
// The protocol that delegates all actions a client can use
// in the Hall.
class HallAction : public Protocol {
public:
HallAction(Hall *hall, Client *client);
~HallAction() override;
const QString *intro() const override;
bool execute(const QString &input, QStringList *output) override;
bool finished() override;
private:
static QString actionList_;
Hall *hall_;
Client *client_;
};
// The protocol that progresses the client to join a room.
class Join : public Command {
public:
Join(Hall *hall, Client *client);
~Join() override;
using Command::execute;
protected:
bool execute(QStringList *output) override;
private:
Hall *hall_;
Client *client_;
};
// The protocol that progresses the client to create a room.
class Create : public Command {
public:
Create();
~Create() override;
using Command::execute;
protected:
bool execute(QStringList *output) override;
};
#endif // HALL_H