summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJannis Voelker <jannis.voelker@basyskom.com>2018-02-28 16:10:16 +0100
committerJannis Völker <jannis.voelker@basyskom.com>2018-03-06 08:13:58 +0000
commit53d45c64ce06daedd99b9470b404f550821a832a (patch)
tree8878156826786e0b083676808ec4af8822b2a34a
parent5587856daeec88a05cfd6a68499ed846e710f595 (diff)
Don't create default constructed entries in m_attributeMapping (uacpp)
Using QHash::operator[] with a key that does not exist inserts a default constructed value. modifyMonitoring() and disableMonitoring() in uacppbackend.cpp use m_attributeMapping[handle][attr] to check if an entry exists. Calling these methods for handle/attribute pairs that are not being monitored fills m_attributeMapping with default constructed values. Checking if the QHash contains the expected values avoids that. Change-Id: I80804a1b3af5d7f9fa86a14c6f9a371a36614f6e Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/plugins/opcua/uacpp/quacppbackend.cpp16
-rw-r--r--src/plugins/opcua/uacpp/quacppbackend.h4
2 files changed, 17 insertions, 3 deletions
diff --git a/src/plugins/opcua/uacpp/quacppbackend.cpp b/src/plugins/opcua/uacpp/quacppbackend.cpp
index 694ead1..8f4bc2d 100644
--- a/src/plugins/opcua/uacpp/quacppbackend.cpp
+++ b/src/plugins/opcua/uacpp/quacppbackend.cpp
@@ -358,7 +358,7 @@ void UACppAsyncBackend::enableMonitoring(uintptr_t handle, const UaNodeId &id, Q
void UACppAsyncBackend::modifyMonitoring(uintptr_t handle, QOpcUa::NodeAttribute attr, QOpcUaMonitoringParameters::Parameter item, QVariant value)
{
- QUACppSubscription *subscription = m_attributeMapping[handle][attr];
+ QUACppSubscription *subscription = getSubscriptionForItem(handle, attr);
if (!subscription) {
qCWarning(QT_OPCUA_PLUGINS_UACPP, "Could not modify parameter for %lu, the monitored item does not exist", handle);
QOpcUaMonitoringParameters p;
@@ -373,7 +373,7 @@ void UACppAsyncBackend::modifyMonitoring(uintptr_t handle, QOpcUa::NodeAttribute
void UACppAsyncBackend::disableMonitoring(uintptr_t handle, QOpcUa::NodeAttributes attr)
{
qt_forEachAttribute(attr, [&](QOpcUa::NodeAttribute attribute){
- QUACppSubscription *sub = m_attributeMapping[handle][attribute];
+ QUACppSubscription *sub = getSubscriptionForItem(handle, attribute);
if (sub) {
sub->removeAttributeMonitoredItem(handle, attribute);
if (sub->monitoredItemsCount() == 0)
@@ -438,6 +438,18 @@ QUACppSubscription *UACppAsyncBackend::getSubscription(const QOpcUaMonitoringPar
return sub;
}
+QUACppSubscription *UACppAsyncBackend::getSubscriptionForItem(uintptr_t handle, QOpcUa::NodeAttribute attr)
+{
+ auto entriesForHandle = m_attributeMapping.find(handle);
+ if (entriesForHandle == m_attributeMapping.end())
+ return nullptr;
+ auto subscription = entriesForHandle->find(attr);
+ if (subscription == entriesForHandle->end())
+ return nullptr;
+
+ return subscription.value();
+}
+
bool UACppAsyncBackend::removeSubscription(quint32 subscriptionId)
{
auto sub = m_subscriptions.find(subscriptionId);
diff --git a/src/plugins/opcua/uacpp/quacppbackend.h b/src/plugins/opcua/uacpp/quacppbackend.h
index df5edea..241f86c 100644
--- a/src/plugins/opcua/uacpp/quacppbackend.h
+++ b/src/plugins/opcua/uacpp/quacppbackend.h
@@ -60,10 +60,12 @@ public Q_SLOTS:
void disableMonitoring(uintptr_t handle, QOpcUa::NodeAttributes attr);
void callMethod(uintptr_t handle, const UaNodeId &objectId, const UaNodeId &methodId, QVector<QOpcUa::TypedVariant> args);
- QUACppSubscription *getSubscription(const QOpcUaMonitoringParameters &settings);
bool removeSubscription(quint32 subscriptionId);
public:
+ QUACppSubscription *getSubscription(const QOpcUaMonitoringParameters &settings);
+ QUACppSubscription *getSubscriptionForItem(uintptr_t handle, QOpcUa::NodeAttribute attr);
+
Q_DISABLE_COPY(UACppAsyncBackend);
UaClientSdk::UaSession *m_nativeSession;
QUACppClient *m_clientImpl;