#ifndef CONTROLLER_H #define CONTROLLER_H #define SERVICE_VERSION "2.25.0" #define COOKIE_MAX_AGE 31536000 #define TICKET_MAX_AGE 30 #define REQUEST_TIMEOUT 5000 #include #include #include #include #include "database.h" #include "homed.h" struct Ticket { QString token; qint64 expire; }; class Controller : public HOMEd { Q_OBJECT public: enum class Command { restartService, updateDashboards, updateIcons, updateNames }; Controller(const QString &configFile); Q_ENUM(Command) private: Database *m_database; QTcpServer *m_tcpServer; QWebSocketServer *m_webSocket; QTimer *m_timer; QMetaEnum m_commands; QString m_frontend, m_title, m_username, m_password, m_guest; bool m_debug, m_auth; QList m_retained, m_types; QMap m_messages; QList m_sockets; QMap > m_clients; QMap m_tickets; QString includeList(const QString &path, const QString &filter, const QString &tag); QString ticketToken(const QString &ticket); void httpResponse(QTcpSocket *socket, quint16 code, const QMap &headers = QMap (), const QByteArray &response = QByteArray()); void fileResponse(QTcpSocket *socket, const QString &fileName); public slots: void quit(void) override; private slots: void mqttConnected(void) override; void mqttDisconnected(void) override; void mqttReceived(const QByteArray &message, const QMqttTopicName &topic) override; void socketConnected(void); void socketDisconnected(void); void readyRead(void); void clientConnected(void); void clientDisconnected(void); void textMessageReceived(const QString &message); void pingClients(void); }; #endif