-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdsconvoserver.h
87 lines (74 loc) · 2.28 KB
/
dsconvoserver.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
#ifndef DSCONVOSERVER_H
#define DSCONVOSERVER_H
#include <QObject>
#include <QVariant>
#include <QSet>
#include <QHash>
#include <QTcpServer>
#include <QSqlDatabase>
#include "dsconvoserverconnection.h"
class DSConvoServer : public QObject
{
Q_OBJECT
public:
enum State {
Inactive,
Waiting,
Error,
Listening,
Connection,
Disconnection,
Send,
Recv,
Closing,
};
static constexpr const char SERVER_USERNAME[] = "dsconvo";
explicit DSConvoServer(QObject *parent = nullptr);
~DSConvoServer();
inline const QHostAddress &address() const { return address_; }
inline void setAddress(const QHostAddress &a) { address_ = a; }
inline quint16 port() const { return port_; }
inline void setPort(quint16 p) { port_ = p; }
inline bool listening() const { return server->isListening(); }
inline State state() const { return state_; }
inline const QVariant &stateData() const { return stateData_; }
QString stateString() const;
bool listen();
void close();
void clearError();
void broadcastMessage(const QString &message);
signals:
void stateChanged();
void messaged(const DSConvo::Protocol::MessageBroadcast &m);
private:
void setState(State state, const QVariant &data = QVariant::fromValue(nullptr));
QString makeDisplayName(const QString &username) const;
inline void addUser(const QString &username)
{
users.insert(username);
displayNames.insert(username, makeDisplayName(username));
}
inline bool removeUser(const QString &username)
{
return users.remove(username) && displayNames.remove(username);
}
QTcpServer *server;
QHostAddress address_;
quint16 port_;
QSet<DSConvoServerConnection*> clients;
QSet<QString> users;
QHash<QString, QString> displayNames;
State state_;
QVariant stateData_;
QSqlDatabase db;
private slots:
void newConnection();
void clientDataSent(const QByteArray&);
void clientDataReceived(const QByteArray&);
void clientDisconnected();
void clientHelloRequested(QString &u, DSConvoServerConnection::HelloReplyError *r);
void clientHelloAccepted();
void clientMessageAccepted(const QString &m);
void clientFarewellSent();
};
#endif