[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [labplot/gsoc2018_mqtt] src: Better algorithm for checking if a topic contains another one
From: Ferencz Kovacs <null () kde ! org>
Date: 2018-06-30 17:45:04
Message-ID: E1fZJvk-0000Xs-SY () code ! kde ! org
[Download RAW message or body]
Git commit caaae64a228f53126b922f9ca182be1cb3314f34 by Ferencz Kovacs.
Committed on 30/06/2018 at 17:44.
Pushed by ferenczkovacs into branch 'gsoc2018_mqtt'.
Better algorithm for checking if a topic contains another one
M +30 -22 src/backend/datasources/MQTTClient.cpp
M +2 -0 src/backend/datasources/MQTTClient.h
M +19 -16 src/kdefrontend/datasources/ImportFileWidget.cpp
M +28 -16 src/kdefrontend/dockwidgets/LiveDataDock.cpp
M +1 -0 src/kdefrontend/dockwidgets/LiveDataDock.h
https://commits.kde.org/labplot/caaae64a228f53126b922f9ca182be1cb3314f34
diff --git a/src/backend/datasources/MQTTClient.cpp b/src/backend/datasources/MQTTClient.cpp
index 7dbc2e9a..3d373df3 100644
--- a/src/backend/datasources/MQTTClient.cpp
+++ b/src/backend/datasources/MQTTClient.cpp
@@ -900,28 +900,11 @@ void MQTTClient::newMQTTSubscription(const QString& topic, quint8 QoS) {
qDebug()<<"Check for inferior subscriptions";
bool found = false;
QVector<MQTTSubscriptions*> inferiorSubscriptions;
- if(topic.contains('#') || topic.contains('+')) {
- if(topic.contains('#')) {
- for(int i = 0; i < m_mqttSubscriptions.size(); ++i) {
- if(m_mqttSubscriptions[i]->subscriptionName().startsWith(topic.left(topic.count() - 2))
- && m_mqttSubscriptions[i]->subscriptionName() != topic){
- found = true;
- inferiorSubscriptions.push_back(m_mqttSubscriptions[i]);
- }
- }
- }
- else if (topic.contains('+')) {
- int pos = topic.indexOf('+');
- QString start = topic.left(pos);
- QString end = topic.right(topic.count() - pos);
- for(int i = 0; i < m_mqttSubscriptions.size(); ++i) {
- if(m_mqttSubscriptions[i]->subscriptionName().startsWith(start)
- && m_mqttSubscriptions[i]->subscriptionName().endsWith(end)
- && m_mqttSubscriptions[i]->subscriptionName() != topic) {
- found = true;
- inferiorSubscriptions.push_back(m_mqttSubscriptions[i]);
- }
- }
+
+ for(int i = 0; i < m_mqttSubscriptions.size(); ++i) {
+ if(checkTopicContains(topic, m_mqttSubscriptions[i]->subscriptionName())) {
+ found = true;
+ inferiorSubscriptions.push_back(m_mqttSubscriptions[i]);
}
}
@@ -1001,4 +984,29 @@ void MQTTClient::subscriptionLoaded(const QString &name) {
}
}
}
+
+bool MQTTClient::checkTopicContains(const QString &superior, const QString& inferior) {
+ if (superior == inferior)
+ return true;
+ else {
+ if(superior.contains("/")) {
+ QStringList superiorList = superior.split('/', QString::SkipEmptyParts);
+ QStringList inferiorList = inferior.split('/', QString::SkipEmptyParts);
+
+ bool ok = true;
+ for(int i = 0; i < superiorList.size(); ++i) {
+ if(superiorList.at(i) != inferiorList.at(i)) {
+ if((superiorList.at(i) != "+") &&
+ !(superiorList.at(i) == "#" && i == superiorList.size() - 1)) {
+ qDebug() <<superiorList.at(i)<<" "<<inferiorList.at(i);
+ ok = false;
+ break;
+ }
+ }
+ }
+ return ok;
+ }
+ return false;
+ }
+}
#endif
diff --git a/src/backend/datasources/MQTTClient.h b/src/backend/datasources/MQTTClient.h
index 537ef849..8ddbec7b 100644
--- a/src/backend/datasources/MQTTClient.h
+++ b/src/backend/datasources/MQTTClient.h
@@ -103,6 +103,8 @@ public:
void addMqttSubscriptions(const QMqttTopicFilter&, const quint8&);
QVector<QString> mqttSubscribtions() const;
+ bool checkTopicContains(const QString& superior, const QString& inferior);
+
QString clientHostName() const;
quint16 clientPort() const;
QString clientPassword() const;
diff --git a/src/kdefrontend/datasources/ImportFileWidget.cpp b/src/kdefrontend/datasources/ImportFileWidget.cpp
index 11896c43..4fafcb53 100644
--- a/src/kdefrontend/datasources/ImportFileWidget.cpp
+++ b/src/kdefrontend/datasources/ImportFileWidget.cpp
@@ -2081,26 +2081,29 @@ void ImportFileWidget::mqttErrorChanged(QMqttClient::ClientError clientError) {
}
bool ImportFileWidget::checkTopicContains(const QString& superior, const QString& inferior) {
- if(superior == inferior)
+ if (superior == inferior)
return true;
-
- if(superior.contains('#') || superior.contains('+')) {
- if(superior.contains('#')) {
- if(inferior.startsWith(superior.left(superior.count() - 2)) ){
- return true;
- }
- }
- else if (superior.contains('+')) {
- int pos = superior.indexOf('+');
- QString start = superior.left(pos);
- QString end = superior.right(superior.count() - pos);
- if(inferior.startsWith(start) && inferior.endsWith(end)) {
- return true;
+ else {
+ if(superior.contains("/")) {
+ QStringList superiorList = superior.split('/', QString::SkipEmptyParts);
+ QStringList inferiorList = inferior.split('/', QString::SkipEmptyParts);
+
+ bool ok = true;
+ for(int i = 0; i < superiorList.size(); ++i) {
+ if(superiorList.at(i) != inferiorList.at(i)) {
+ if((superiorList.at(i) != "+") &&
+ !(superiorList.at(i) == "#" && i == superiorList.size() - 1)) {
+ qDebug() <<superiorList.at(i)<<" "<<inferiorList.at(i);
+ ok = false;
+ break;
+ }
+ }
}
+ return ok;
}
- }
- return false;
+ return false;
+ }
}
QString ImportFileWidget::checkCommonLevel(const QString& first, const QString& second) {
diff --git a/src/kdefrontend/dockwidgets/LiveDataDock.cpp b/src/kdefrontend/dockwidgets/LiveDataDock.cpp
index d7e01431..e2563be5 100644
--- a/src/kdefrontend/dockwidgets/LiveDataDock.cpp
+++ b/src/kdefrontend/dockwidgets/LiveDataDock.cpp
@@ -773,22 +773,9 @@ void LiveDataDock::addSubscription() {
for(int i = 0; i < ui.lwSubscriptions->count(); ++i){
item = ui.lwSubscriptions->item(i);
QString subscriptionName = item->text();
- if(subscriptionName.contains('#') || subscriptionName.contains('+')) {
- if(subscriptionName.contains('#')) {
- if(newTopicName.startsWith(subscriptionName.left(subscriptionName.count() - 2)) ){
- noWildcard = false;
- break;
- }
- }
- else if (subscriptionName.contains('+')) {
- int pos = subscriptionName.indexOf('+');
- QString start = subscriptionName.left(pos);
- QString end = subscriptionName.right(subscriptionName.count() - pos);
- if(newTopicName.startsWith(start) && newTopicName.endsWith(end)) {
- noWildcard = false;
- break;
- }
- }
+ if(checkTopicContains(subscriptionName, newTopicName)) {
+ noWildcard = false;
+ break;
}
}
if(noWildcard) {
@@ -861,4 +848,29 @@ void LiveDataDock::mqttButtonUnsubscribe(const QString& item) {
m_mqttUnsubscribeName = item;
qDebug()<<"LiveDataDock: Unsubscribe from:"<<m_mqttUnsubscribeName;
}
+
+bool LiveDataDock::checkTopicContains(const QString &superior, const QString &inferior) {
+ if (superior == inferior)
+ return true;
+ else {
+ if(superior.contains("/")) {
+ QStringList superiorList = superior.split('/', QString::SkipEmptyParts);
+ QStringList inferiorList = inferior.split('/', QString::SkipEmptyParts);
+
+ bool ok = true;
+ for(int i = 0; i < superiorList.size(); ++i) {
+ if(superiorList.at(i) != inferiorList.at(i)) {
+ if((superiorList.at(i) != "+") &&
+ !(superiorList.at(i) == "#" && i == superiorList.size() - 1)) {
+ qDebug() <<superiorList.at(i)<<" "<<inferiorList.at(i);
+ ok = false;
+ break;
+ }
+ }
+ }
+ return ok;
+ }
+ return false;
+ }
+}
#endif
diff --git a/src/kdefrontend/dockwidgets/LiveDataDock.h b/src/kdefrontend/dockwidgets/LiveDataDock.h
index 24603c0d..92ead52f 100644
--- a/src/kdefrontend/dockwidgets/LiveDataDock.h
+++ b/src/kdefrontend/dockwidgets/LiveDataDock.h
@@ -50,6 +50,7 @@ public:
void setLiveDataSources(const QList<LiveDataSource*>& sources);
#ifdef HAVE_MQTT
void setMQTTClients(const QList<MQTTClient*>& clients);
+ bool checkTopicContains(const QString& superior, const QString& inferior);
#endif
~LiveDataDock();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic