-
Notifications
You must be signed in to change notification settings - Fork 0
/
WebSocketServer.cpp
90 lines (74 loc) · 2.18 KB
/
WebSocketServer.cpp
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
#include "WebSocketServer.h"
#include "Kromophone.h"
#include "Settings.h"
#include "Logger.h"
#include "Settings.h"
#include <QWebSocket>
#include <QJsonDocument>
WebSocketServer::WebSocketServer(QObject *parent)
: MessageProcessor(parent),
server(nullptr)
{
server = new QWebSocketServer(QStringLiteral("Kromophone"), QWebSocketServer::NonSecureMode);
if (server->listen(QHostAddress::Any, WebSocketServer::Port))
{
connect(server, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);
connect(server, &QWebSocketServer::closed, this, &WebSocketServer::onConnectionClosed);
}
else
{
LOG_WARNING() << "Could not start websocket server";
}
Kromophone* app = qobject_cast<Kromophone*>(parent);
if (app != nullptr)
{
connect(app, &Kromophone::colorChanged, this, &WebSocketServer::onColorChanged);
}
foreach (Setting* setting, SettingsCreator::settingsList())
{
connect(setting, &Setting::valueChanged, this, &WebSocketServer::onSettingChanged);
}
}
void WebSocketServer::onNewConnection()
{
QWebSocket* socket = server->nextPendingConnection();
connectSignals(socket);
clients << socket;
sendSettings(socket);
}
void WebSocketServer::onConnectionClosed()
{
QWebSocket* socket = qobject_cast<QWebSocket*>(sender());
clients.removeAll(socket);
socket->deleteLater();
}
void WebSocketServer::onColorChanged(const QColor &color)
{
QVariantMap msg {
{"type", "color"},
{"value", color}
};
sendMessage(msg);
}
void WebSocketServer::sendMessage(const QVariantMap &msg)
{
QByteArray json = QJsonDocument::fromVariant(msg).toJson();
foreach (QWebSocket* client, clients)
{
client->sendTextMessage(json);
}
}
void WebSocketServer::sendSettings(QWebSocket *client)
{
QVariantMap settings;
foreach (auto setting, SettingsCreator::displayedSettings())
{
settings[setting] = SettingsCreator::get(setting).value();
}
QVariantMap msg {
{"type", "settings"},
{"settings", settings}
};
QByteArray json = QJsonDocument::fromVariant(msg).toJson();
client->sendTextMessage(json);
}