diff options
author | Jannis Voelker <jannis.voelker@basyskom.com> | 2018-02-28 16:10:16 +0100 |
---|---|---|
committer | Jannis Völker <jannis.voelker@basyskom.com> | 2018-03-06 08:13:58 +0000 |
commit | 53d45c64ce06daedd99b9470b404f550821a832a (patch) | |
tree | 8878156826786e0b083676808ec4af8822b2a34a | |
parent | 5587856daeec88a05cfd6a68499ed846e710f595 (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.cpp | 16 | ||||
-rw-r--r-- | src/plugins/opcua/uacpp/quacppbackend.h | 4 |
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; |