parent
4a8e27b031
commit
758cc0926d
@ -1,79 +0,0 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020-2021, The Monero Project.
|
||||
|
||||
#include <QObject>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QScreen>
|
||||
#include <QDesktopWidget>
|
||||
#include "wsclient.h"
|
||||
#include "conversations.h"
|
||||
|
||||
WSClient::WSClient(Conversations *ctx, const QString &url, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_ctx(ctx) {
|
||||
connect(&this->webSocket, &QWebSocket::binaryMessageReceived, this, &WSClient::onbinaryMessageReceived);
|
||||
connect(&this->webSocket, &QWebSocket::connected, this, &WSClient::onConnected);
|
||||
connect(&this->webSocket, &QWebSocket::disconnected, this, &WSClient::closed);
|
||||
connect(&this->webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, &WSClient::onError);
|
||||
|
||||
this->url = QString("ws://%1/ws").arg(url);
|
||||
qCritical() << this->url;
|
||||
connect(&m_pingTimer, &QTimer::timeout, [this]{
|
||||
if (this->webSocket.state() == QAbstractSocket::ConnectedState)
|
||||
this->webSocket.ping();
|
||||
});
|
||||
m_pingTimer.setInterval(30 * 1000);
|
||||
m_pingTimer.start();
|
||||
}
|
||||
|
||||
void WSClient::sendMsg(const QByteArray &data) {
|
||||
auto state = this->webSocket.state();
|
||||
if(state == QAbstractSocket::ConnectedState)
|
||||
this->webSocket.sendBinaryMessage(data);
|
||||
}
|
||||
|
||||
void WSClient::start() {
|
||||
// connect & reconnect on errors/close
|
||||
#ifdef QT_DEBUG
|
||||
qDebug() << "WebSocket connect:" << url.url();
|
||||
#endif
|
||||
this->webSocket.open(QUrl(this->url));
|
||||
|
||||
if(!this->m_connectionTimer.isActive()) {
|
||||
connect(&this->m_connectionTimer, &QTimer::timeout, this, &WSClient::checkConnection);
|
||||
this->m_connectionTimer.start(2000);
|
||||
}
|
||||
}
|
||||
|
||||
void WSClient::checkConnection() {
|
||||
auto state = this->webSocket.state();
|
||||
if(state == QAbstractSocket::UnconnectedState) {
|
||||
#ifdef QT_DEBUG
|
||||
qDebug() << "WebSocket reconnect";
|
||||
#endif
|
||||
this->start();
|
||||
}
|
||||
}
|
||||
|
||||
void WSClient::onConnected() {
|
||||
#ifdef QT_DEBUG
|
||||
qDebug() << "WebSocket connected";
|
||||
#endif
|
||||
emit connectionEstablished();
|
||||
}
|
||||
|
||||
void WSClient::onError(QAbstractSocket::SocketError error) {
|
||||
qCritical() << "WebSocket error: " << error;
|
||||
auto state = this->webSocket.state();
|
||||
if(state == QAbstractSocket::ConnectedState || state == QAbstractSocket::ConnectingState)
|
||||
this->webSocket.abort();
|
||||
}
|
||||
|
||||
void WSClient::onbinaryMessageReceived(const QByteArray &message) {
|
||||
#ifdef QT_DEBUG
|
||||
qDebug() << "WebSocket (client) received:" << message;
|
||||
#endif
|
||||
QJsonDocument doc = QJsonDocument::fromJson(message);
|
||||
QJsonObject object = doc.object();
|
||||
emit WSMessage(object);
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020-2021, The Monero Project.
|
||||
|
||||
#ifndef ECHOCLIENT_H
|
||||
#define ECHOCLIENT_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QWebSocket>
|
||||
#include <QTimer>
|
||||
|
||||
class Conversations;
|
||||
class WSClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit WSClient(Conversations *ctx, const QString &url, QObject *parent = nullptr);
|
||||
void start();
|
||||
void sendMsg(const QByteArray &data);
|
||||
QWebSocket webSocket;
|
||||
QString url;
|
||||
|
||||
signals:
|
||||
void closed();
|
||||
void connectionEstablished();
|
||||
void WSMessage(QJsonObject message);
|
||||
|
||||
private slots:
|
||||
void onConnected();
|
||||
void onbinaryMessageReceived(const QByteArray &message);
|
||||
void checkConnection();
|
||||
void onError(QAbstractSocket::SocketError error);
|
||||
|
||||
private:
|
||||
QTimer m_connectionTimer;
|
||||
QTimer m_pingTimer;
|
||||
Conversations *m_ctx;
|
||||
};
|
||||
|
||||
#endif // ECHOCLIENT_H
|
Loading…
Reference in new issue