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 }