Clean up
This commit is contained in:
parent
9c2cc223a6
commit
0920b7de49
@ -40,6 +40,7 @@ class EvDashApp {
|
|||||||
|
|
||||||
this.socket.addEventListener('open', () => {
|
this.socket.addEventListener('open', () => {
|
||||||
this.updateStatus('Connected', 'connected');
|
this.updateStatus('Connected', 'connected');
|
||||||
|
this.sendExampleMessage()
|
||||||
});
|
});
|
||||||
|
|
||||||
this.socket.addEventListener('message', event => {
|
this.socket.addEventListener('message', event => {
|
||||||
|
|||||||
@ -49,7 +49,28 @@ EvDashEngine::EvDashEngine(ThingManager *thingManager, EvDashWebServerResource *
|
|||||||
m_webServerResource{webServerResource}
|
m_webServerResource{webServerResource}
|
||||||
{
|
{
|
||||||
m_webSocketServer = new QWebSocketServer(QStringLiteral("EvDashEngine"), QWebSocketServer::NonSecureMode, this);
|
m_webSocketServer = new QWebSocketServer(QStringLiteral("EvDashEngine"), QWebSocketServer::NonSecureMode, this);
|
||||||
connect(m_webSocketServer, &QWebSocketServer::newConnection, this, &EvDashEngine::handleNewConnection);
|
|
||||||
|
connect(m_webSocketServer, &QWebSocketServer::newConnection, this, [this](){
|
||||||
|
QWebSocket *socket = m_webSocketServer->nextPendingConnection();
|
||||||
|
if (!socket) {
|
||||||
|
qCWarning(dcEvDashExperience()) << "Interface: Received new connection but socket was null";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(socket, &QWebSocket::textMessageReceived, this, [this, socket](const QString &message) {
|
||||||
|
processTextMessage(socket, message);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(socket, &QWebSocket::disconnected, this, [this, socket](){
|
||||||
|
m_clients.removeAll(socket);
|
||||||
|
qCDebug(dcEvDashExperience()) << "WebSocket client disconnected" << socket->peerAddress() << "Remaining clients:" << m_clients.count();
|
||||||
|
socket->deleteLater();
|
||||||
|
});
|
||||||
|
|
||||||
|
m_clients.append(socket);
|
||||||
|
qCDebug(dcEvDashExperience()) << "WebSocket client connected" << socket->peerAddress() << "Total clients:" << m_clients.count();
|
||||||
|
});
|
||||||
|
|
||||||
connect(m_webSocketServer, &QWebSocketServer::acceptError, this, [this](QAbstractSocket::SocketError error) {
|
connect(m_webSocketServer, &QWebSocketServer::acceptError, this, [this](QAbstractSocket::SocketError error) {
|
||||||
qCWarning(dcEvDashExperience()) << "WebSocket accept error" << error << m_webSocketServer->errorString();
|
qCWarning(dcEvDashExperience()) << "WebSocket accept error" << error << m_webSocketServer->errorString();
|
||||||
});
|
});
|
||||||
@ -59,25 +80,25 @@ EvDashEngine::EvDashEngine(ThingManager *thingManager, EvDashWebServerResource *
|
|||||||
|
|
||||||
EvDashEngine::~EvDashEngine()
|
EvDashEngine::~EvDashEngine()
|
||||||
{
|
{
|
||||||
if (m_webSocketServer->isListening()) {
|
if (m_webSocketServer->isListening())
|
||||||
m_webSocketServer->close();
|
m_webSocketServer->close();
|
||||||
}
|
|
||||||
|
|
||||||
for (QWebSocket *client : qAsConst(m_clients)) {
|
for (QWebSocket *client : qAsConst(m_clients)) {
|
||||||
if (client->state() == QAbstractSocket::ConnectedState) {
|
if (client->state() == QAbstractSocket::ConnectedState)
|
||||||
client->close(QWebSocketProtocol::CloseCodeGoingAway, QStringLiteral("Server shutting down"));
|
client->close(QWebSocketProtocol::CloseCodeGoingAway, QStringLiteral("Server shutting down"));
|
||||||
}
|
|
||||||
client->deleteLater();
|
client->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_clients.clear();
|
m_clients.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EvDashEngine::startWebSocket(quint16 port)
|
bool EvDashEngine::startWebSocket(quint16 port)
|
||||||
{
|
{
|
||||||
if (m_webSocketServer->isListening()) {
|
if (m_webSocketServer->isListening()) {
|
||||||
if (m_webSocketServer->serverPort() == port && port != 0) {
|
if (m_webSocketServer->serverPort() == port && port != 0)
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
m_webSocketServer->close();
|
m_webSocketServer->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,42 +113,6 @@ bool EvDashEngine::startWebSocket(quint16 port)
|
|||||||
return listening;
|
return listening;
|
||||||
}
|
}
|
||||||
|
|
||||||
quint16 EvDashEngine::webSocketPort() const
|
|
||||||
{
|
|
||||||
if (!m_webSocketServer->isListening()) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return m_webSocketServer->serverPort();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvDashEngine::handleNewConnection()
|
|
||||||
{
|
|
||||||
QWebSocket *socket = m_webSocketServer->nextPendingConnection();
|
|
||||||
if (!socket) {
|
|
||||||
qCWarning(dcEvDashExperience()) << "Received new connection but socket was null";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
connect(socket, &QWebSocket::textMessageReceived, this, [this, socket](const QString &message) {
|
|
||||||
processTextMessage(socket, message);
|
|
||||||
});
|
|
||||||
connect(socket, &QWebSocket::disconnected, this, &EvDashEngine::handleSocketDisconnected);
|
|
||||||
|
|
||||||
m_clients.append(socket);
|
|
||||||
qCDebug(dcEvDashExperience()) << "WebSocket client connected" << socket->peerAddress() << "Total clients:" << m_clients.count();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvDashEngine::handleSocketDisconnected()
|
|
||||||
{
|
|
||||||
QWebSocket *socket = qobject_cast<QWebSocket *>(sender());
|
|
||||||
if (!socket)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_clients.removeAll(socket);
|
|
||||||
qCDebug(dcEvDashExperience()) << "WebSocket client disconnected" << socket->peerAddress() << "Remaining clients:" << m_clients.count();
|
|
||||||
socket->deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvDashEngine::processTextMessage(QWebSocket *socket, const QString &message)
|
void EvDashEngine::processTextMessage(QWebSocket *socket, const QString &message)
|
||||||
{
|
{
|
||||||
if (!socket)
|
if (!socket)
|
||||||
@ -138,7 +123,7 @@ void EvDashEngine::processTextMessage(QWebSocket *socket, const QString &message
|
|||||||
|
|
||||||
if (parseError.error != QJsonParseError::NoError || !doc.isObject()) {
|
if (parseError.error != QJsonParseError::NoError || !doc.isObject()) {
|
||||||
qCWarning(dcEvDashExperience()) << "Invalid WebSocket payload" << parseError.errorString();
|
qCWarning(dcEvDashExperience()) << "Invalid WebSocket payload" << parseError.errorString();
|
||||||
QJsonObject errorReply{
|
QJsonObject errorReply {
|
||||||
{QStringLiteral("version"), QStringLiteral("1.0")},
|
{QStringLiteral("version"), QStringLiteral("1.0")},
|
||||||
{QStringLiteral("event"), QStringLiteral("error")},
|
{QStringLiteral("event"), QStringLiteral("error")},
|
||||||
{QStringLiteral("payload"), QJsonObject{
|
{QStringLiteral("payload"), QJsonObject{
|
||||||
@ -169,15 +154,16 @@ QJsonObject EvDashEngine::handleApiRequest(const QJsonObject &request) const
|
|||||||
const QString action = request.value(QStringLiteral("action")).toString();
|
const QString action = request.value(QStringLiteral("action")).toString();
|
||||||
|
|
||||||
if (action.compare(QStringLiteral("ping"), Qt::CaseInsensitive) == 0) {
|
if (action.compare(QStringLiteral("ping"), Qt::CaseInsensitive) == 0) {
|
||||||
|
|
||||||
response.insert(QStringLiteral("event"), QStringLiteral("statusUpdate"));
|
response.insert(QStringLiteral("event"), QStringLiteral("statusUpdate"));
|
||||||
|
|
||||||
QJsonObject payload;
|
QJsonObject payload;
|
||||||
payload.insert(QStringLiteral("status"), QStringLiteral("ok"));
|
payload.insert(QStringLiteral("status"), QStringLiteral("ok"));
|
||||||
payload.insert(QStringLiteral("timestamp"), QDateTime::currentDateTimeUtc().toString(Qt::ISODateWithMs));
|
payload.insert(QStringLiteral("timestamp"), QDateTime::currentDateTimeUtc().toString(Qt::ISODateWithMs));
|
||||||
|
|
||||||
const QJsonObject requestPayload = request.value(QStringLiteral("payload")).toObject();
|
const QJsonObject requestPayload = request.value(QStringLiteral("payload")).toObject();
|
||||||
if (!requestPayload.isEmpty()) {
|
if (!requestPayload.isEmpty())
|
||||||
payload.insert(QStringLiteral("echo"), requestPayload);
|
payload.insert(QStringLiteral("echo"), requestPayload);
|
||||||
}
|
|
||||||
|
|
||||||
response.insert(QStringLiteral("payload"), payload);
|
response.insert(QStringLiteral("payload"), payload);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -44,20 +44,11 @@ class EvDashEngine : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit EvDashEngine(ThingManager *thingManager, EvDashWebServerResource *webServerResource, QObject *parent = nullptr);
|
explicit EvDashEngine(ThingManager *thingManager, EvDashWebServerResource *webServerResource, QObject *parent = nullptr);
|
||||||
|
|
||||||
~EvDashEngine() override;
|
~EvDashEngine() override;
|
||||||
|
|
||||||
bool startWebSocket(quint16 port = 0);
|
|
||||||
quint16 webSocketPort() const;
|
|
||||||
QString webSocketPath() const;
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void webSocketListeningChanged(bool listening);
|
void webSocketListeningChanged(bool listening);
|
||||||
|
|
||||||
private slots:
|
|
||||||
void handleNewConnection();
|
|
||||||
void handleSocketDisconnected();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ThingManager *m_thingManager = nullptr;
|
ThingManager *m_thingManager = nullptr;
|
||||||
EvDashWebServerResource *m_webServerResource = nullptr;
|
EvDashWebServerResource *m_webServerResource = nullptr;
|
||||||
@ -65,6 +56,7 @@ private:
|
|||||||
|
|
||||||
QList<QWebSocket *> m_clients;
|
QList<QWebSocket *> m_clients;
|
||||||
|
|
||||||
|
bool startWebSocket(quint16 port = 0);
|
||||||
void processTextMessage(QWebSocket *socket, const QString &message);
|
void processTextMessage(QWebSocket *socket, const QString &message);
|
||||||
QJsonObject handleApiRequest(const QJsonObject &request) const;
|
QJsonObject handleApiRequest(const QJsonObject &request) const;
|
||||||
void sendReply(QWebSocket *socket, QJsonObject response) const;
|
void sendReply(QWebSocket *socket, QJsonObject response) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user