File indexing completed on 2025-07-13 03:32:37

0001 /*
0002     File                 : MQTTErrorWidget.cpp
0003     Project              : LabPlot
0004     Description          : Widget for informing about an MQTT error, and for trying to solve it
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2018 Kovacs Ferencz <kferike98@gmail.com>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "src/kdefrontend/datasources/MQTTErrorWidget.h"
0011 
0012 #include "backend/datasources/MQTTClient.h"
0013 #include <QMqttMessage>
0014 #include <QMqttSubscription>
0015 #include <QMqttTopicFilter>
0016 
0017 MQTTErrorWidget::MQTTErrorWidget(QMqttClient::ClientError error, MQTTClient* client, QWidget* parent)
0018     : QWidget(parent)
0019     , m_error(error)
0020     , m_client(client) {
0021     ui.setupUi(this);
0022     bool close = false;
0023     // showing the appropriate options according to the error type
0024     switch (m_error) {
0025     case QMqttClient::ClientError::IdRejected:
0026         ui.lePassword->hide();
0027         ui.lPassword->hide();
0028         ui.leUserName->hide();
0029         ui.lUserName->hide();
0030         ui.lErrorType->setText(QStringLiteral("The client ID is malformed. This might be related to its length.\nSet new ID!"));
0031         break;
0032     case QMqttClient::ClientError::BadUsernameOrPassword:
0033         ui.lId->hide();
0034         ui.leId->hide();
0035         ui.lErrorType->setText(QStringLiteral("The data in the username or password is malformed.\nSet new username and password!"));
0036         break;
0037     case QMqttClient::ClientError::NotAuthorized:
0038         ui.lId->hide();
0039         ui.leId->hide();
0040         ui.lErrorType->setText(QStringLiteral("The client is not authorized to connect."));
0041         break;
0042     case QMqttClient::ClientError::ServerUnavailable:
0043         ui.lePassword->hide();
0044         ui.lPassword->hide();
0045         ui.leUserName->hide();
0046         ui.lUserName->hide();
0047         ui.lErrorType->setText(QStringLiteral("The network connection has been established, but the service is unavailable on the broker side."));
0048         break;
0049     case QMqttClient::ClientError::UnknownError:
0050         ui.lePassword->hide();
0051         ui.lPassword->hide();
0052         ui.leUserName->hide();
0053         ui.lUserName->hide();
0054         ui.lErrorType->setText(QStringLiteral("An unknown error occurred."));
0055         break;
0056     case QMqttClient::NoError:
0057     case QMqttClient::InvalidProtocolVersion:
0058     case QMqttClient::TransportInvalid:
0059     case QMqttClient::ProtocolViolation:
0060     case QMqttClient::Mqtt5SpecificError:
0061         close = true;
0062         break;
0063     default:
0064         close = true;
0065         break;
0066     }
0067     connect(ui.bChange, &QPushButton::clicked, this, &MQTTErrorWidget::tryToReconnect);
0068     setAttribute(Qt::WA_DeleteOnClose);
0069     if (close)
0070         this->close();
0071 }
0072 
0073 /*!
0074  *\brief Try to reconnect in MQTTClient after reseting options that might cause the error
0075  */
0076 void MQTTErrorWidget::tryToReconnect() {
0077     bool ok = false;
0078     switch (m_error) {
0079     case QMqttClient::ClientError::IdRejected:
0080         if (!ui.leId->text().isEmpty()) {
0081             m_client->setMQTTClientId(ui.leId->text());
0082             m_client->read();
0083             ok = true;
0084         }
0085         break;
0086     case QMqttClient::ClientError::BadUsernameOrPassword:
0087         if (!ui.lePassword->text().isEmpty() && !ui.leUserName->text().isEmpty()) {
0088             m_client->setMQTTClientAuthentication(ui.leUserName->text(), ui.lePassword->text());
0089             m_client->read();
0090             ok = true;
0091         }
0092         break;
0093     case QMqttClient::ClientError::NotAuthorized:
0094         if (!ui.lePassword->text().isEmpty() && !ui.leUserName->text().isEmpty()) {
0095             m_client->setMQTTClientAuthentication(ui.leUserName->text(), ui.lePassword->text());
0096             m_client->read();
0097             ok = true;
0098         }
0099         break;
0100     case QMqttClient::NoError:
0101     case QMqttClient::InvalidProtocolVersion:
0102     case QMqttClient::TransportInvalid:
0103     case QMqttClient::ServerUnavailable:
0104     case QMqttClient::UnknownError:
0105     case QMqttClient::ProtocolViolation:
0106     case QMqttClient::Mqtt5SpecificError:
0107         break;
0108     default:
0109         break;
0110     }
0111     if (ok)
0112         this->close();
0113 }