2020-10-02 10:20:54 +00:00
|
|
|
/*
|
|
|
|
Sailfin: a Jellyfin client written using Qt
|
2021-02-17 18:42:10 +00:00
|
|
|
Copyright (C) 2021 Chris Josten
|
2020-10-02 10:20:54 +00:00
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
License along with this library; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
#ifndef JELLYFIN_WEBSOCKET_H
|
|
|
|
#define JELLYFIN_WEBSOCKET_H
|
|
|
|
|
|
|
|
#include <QJsonDocument>
|
|
|
|
#include <QJsonArray>
|
|
|
|
#include <QJsonObject>
|
|
|
|
#include <QJsonValue>
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QObject>
|
|
|
|
#include <QtGlobal>
|
|
|
|
#include <QTimer>
|
|
|
|
#include <QUuid>
|
|
|
|
|
|
|
|
#include <QtWebSockets/QWebSocket>
|
|
|
|
|
2021-02-17 18:42:10 +00:00
|
|
|
#include "apiclient.h"
|
2020-10-02 10:20:54 +00:00
|
|
|
|
|
|
|
namespace Jellyfin {
|
|
|
|
class ApiClient;
|
2021-02-17 18:42:10 +00:00
|
|
|
|
|
|
|
namespace DTO {
|
2020-10-09 00:33:08 +00:00
|
|
|
class UserData;
|
2021-02-17 18:42:10 +00:00
|
|
|
}
|
2020-10-09 00:33:08 +00:00
|
|
|
/**
|
|
|
|
* @brief Keeps a connection with the Jellyfin server to receive real time updates.
|
|
|
|
*
|
|
|
|
* This class will parse these messages and send them to ApiClient, which will emit signals for
|
|
|
|
* the interested classes.
|
|
|
|
*/
|
2020-10-02 10:20:54 +00:00
|
|
|
class WebSocket : public QObject {
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* @brief WebSocket creates a webSocket for a Jellyfin server to handle real time updates.
|
|
|
|
* @param client The client to create the socket for.
|
|
|
|
*
|
|
|
|
* The socket will automatically set the ApiClient to its parent.
|
|
|
|
*/
|
|
|
|
explicit WebSocket(ApiClient *client);
|
|
|
|
enum MessageType {
|
|
|
|
ForceKeepAlive,
|
2020-10-09 00:33:08 +00:00
|
|
|
KeepAlive,
|
|
|
|
UserDataChanged
|
2020-10-02 10:20:54 +00:00
|
|
|
};
|
2021-02-14 12:29:30 +00:00
|
|
|
Q_PROPERTY(QAbstractSocket::SocketState state READ state NOTIFY stateChanged)
|
2020-10-02 10:20:54 +00:00
|
|
|
Q_ENUM(MessageType)
|
2021-02-14 12:29:30 +00:00
|
|
|
|
|
|
|
QAbstractSocket::SocketState state() const {
|
|
|
|
return m_webSocket.state();
|
|
|
|
}
|
2020-10-02 10:20:54 +00:00
|
|
|
public slots:
|
|
|
|
void open();
|
|
|
|
private slots:
|
|
|
|
void textMessageReceived(const QString &message);
|
|
|
|
void onConnected();
|
2020-10-08 01:00:08 +00:00
|
|
|
void onDisconnected();
|
2020-10-02 10:20:54 +00:00
|
|
|
|
|
|
|
void sendKeepAlive();
|
2021-02-14 12:29:30 +00:00
|
|
|
void onWebsocketStateChanged(QAbstractSocket::SocketState newState) { emit stateChanged(newState); }
|
2020-10-02 10:20:54 +00:00
|
|
|
signals:
|
|
|
|
void commandReceived(QString arts, QVariantMap args);
|
2021-02-14 12:29:30 +00:00
|
|
|
void stateChanged(QAbstractSocket::SocketState newState);
|
2020-10-02 10:20:54 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
ApiClient *m_apiClient;
|
|
|
|
QWebSocket m_webSocket;
|
|
|
|
|
|
|
|
QTimer m_keepAliveTimer;
|
2021-02-14 12:29:30 +00:00
|
|
|
QTimer m_retryTimer;
|
|
|
|
int m_reconnectAttempt = 0;
|
2020-10-02 10:20:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
void setupKeepAlive(int data);
|
|
|
|
void sendMessage(MessageType type, QJsonValue data = QJsonValue());
|
|
|
|
QString generateMessageId();
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // JELLYFIN_WEBSOCKET_H
|