WebSockets MQTT Subscription

 // Copyright (C) 2017 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

 #include "clientsubscription.h"

 #include <QtCore/QCoreApplication>
 #include <QtCore/QLoggingCategory>

 Q_LOGGING_CATEGORY(lcWebSocketMqtt, "qtdemo.websocket.mqtt")

 ClientSubscription::ClientSubscription(QObject *parent) : QObject(parent)
 {
     connect(this, &ClientSubscription::errorOccured, qApp, &QCoreApplication::quit);
 }

 void ClientSubscription::setUrl(const QUrl &url)
 {
     m_url = url;
 }

 void ClientSubscription::setTopic(const QString &topic)
 {
     m_topic = topic;
 }

 void ClientSubscription::setVersion(int v)
 {
     m_version = v;
 }

 void ClientSubscription::connectAndSubscribe()
 {
     qCDebug(lcWebSocketMqtt) << "Connecting to broker at " << m_url;

     m_device.setUrl(m_url);
     m_device.setProtocol(m_version == 3 ? "mqttv3.1" : "mqtt");

     connect(&m_device, &WebSocketIODevice::socketConnected, this, [this]() {
         qCDebug(lcWebSocketMqtt) << "WebSocket connected, initializing MQTT connection.";

         m_client.setProtocolVersion(m_version == 3 ? QMqttClient::MQTT_3_1 : QMqttClient::MQTT_3_1_1);
         m_client.setTransport(&m_device, QMqttClient::IODevice);

         connect(&m_client, &QMqttClient::connected, this, [this]() {
             qCDebug(lcWebSocketMqtt) << "MQTT connection established";

             m_subscription = m_client.subscribe(m_topic);
             if (!m_subscription) {
                 qDebug() << "Failed to subscribe to " << m_topic;
                 emit errorOccured();
             }

             connect(m_subscription, &QMqttSubscription::stateChanged,
                     [](QMqttSubscription::SubscriptionState s) {
                 qCDebug(lcWebSocketMqtt) << "Subscription state changed:" << s;
             });

             connect(m_subscription, &QMqttSubscription::messageReceived,
                     [this](QMqttMessage msg) {
                 handleMessage(msg.payload());
             });
         });

         m_client.connectToHost();
     });
     if (!m_device.open(QIODevice::ReadWrite))
         qDebug() << "Could not open socket device";
 }

 void ClientSubscription::handleMessage(const QByteArray &msgContent)
 {
     // Should happen when the internal device has ready read?
     qInfo() << "New message:" << msgContent;
 }