diff options
author | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2018-03-08 15:12:00 +0100 |
---|---|---|
committer | Jannis Völker <jannis.voelker@basyskom.com> | 2018-03-14 09:55:46 +0000 |
commit | a7281ad15be2cd72f0e34f713db78fa2a4b944d2 (patch) | |
tree | 6919e96de2db2bdb2e5afafa1aacec2143c3f87b | |
parent | 3818af475b50981d8163594abb2f6f6f7b928369 (diff) |
uacpp: Remove subscriptions when connection is closed
This fixed a potential reconnecting issue where subscriptions from a
previous session are kept stored.
Change-Id: If7e76d5988476fe9d8b113c766b89ae7ea1ff8e2
Reviewed-by: Jannis Völker <jannis.voelker@basyskom.com>
Reviewed-by: Frank Meerkoetter <frank.meerkoetter@basyskom.com>
-rw-r--r-- | src/plugins/opcua/uacpp/quacppbackend.cpp | 14 | ||||
-rw-r--r-- | src/plugins/opcua/uacpp/quacppbackend.h | 2 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/plugins/opcua/uacpp/quacppbackend.cpp b/src/plugins/opcua/uacpp/quacppbackend.cpp index fc4f477..83038c5 100644 --- a/src/plugins/opcua/uacpp/quacppbackend.cpp +++ b/src/plugins/opcua/uacpp/quacppbackend.cpp @@ -69,6 +69,8 @@ UACppAsyncBackend::UACppAsyncBackend(QUACppClient *parent) UACppAsyncBackend::~UACppAsyncBackend() { + cleanupSubscriptions(); + if (m_nativeSession) { if (m_nativeSession->isConnected() != OpcUa_False) { qCWarning(QT_OPCUA_PLUGINS_UACPP) << "UACPP: Deleting backend while still connected"; @@ -94,6 +96,7 @@ void UACppAsyncBackend::connectionStatusChanged(OpcUa_UInt32 clientConnectionId, case UaClient::Disconnected: qCDebug(QT_OPCUA_PLUGINS_UACPP) << "Connection closed"; emit stateAndOrErrorChanged(QOpcUaClient::Disconnected, QOpcUaClient::NoError); + cleanupSubscriptions(); break; case UaClient::Connected: qCDebug(QT_OPCUA_PLUGINS_UACPP) << "Connection established"; @@ -105,6 +108,7 @@ void UACppAsyncBackend::connectionStatusChanged(OpcUa_UInt32 clientConnectionId, case UaClient::ConnectionErrorApiReconnect: qCDebug(QT_OPCUA_PLUGINS_UACPP) << "Connection status changed to ConnectionErrorApiReconnect"; emit stateAndOrErrorChanged(QOpcUaClient::Disconnected, QOpcUaClient::ConnectionError); + cleanupSubscriptions(); break; case UaClient::ServerShutdown: qCWarning(QT_OPCUA_PLUGINS_UACPP) << "Unimplemented: Connection status changed to ServerShutdown"; @@ -196,8 +200,9 @@ void UACppAsyncBackend::connectToEndpoint(const QUrl &url) void UACppAsyncBackend::disconnectFromEndpoint() { - UaStatus result; + cleanupSubscriptions(); + UaStatus result; ServiceSettings serviceSettings; // Default settings const OpcUa_Boolean deleteSubscriptions{OpcUa_True}; @@ -468,6 +473,13 @@ QUACppSubscription *UACppAsyncBackend::getSubscriptionForItem(uintptr_t handle, return subscription.value(); } +void UACppAsyncBackend::cleanupSubscriptions() +{ + qDeleteAll(m_subscriptions); + m_subscriptions.clear(); + m_attributeMapping.clear(); +} + 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 e8b0674..5c02386 100644 --- a/src/plugins/opcua/uacpp/quacppbackend.h +++ b/src/plugins/opcua/uacpp/quacppbackend.h @@ -66,7 +66,7 @@ public Q_SLOTS: public: QUACppSubscription *getSubscription(const QOpcUaMonitoringParameters &settings); QUACppSubscription *getSubscriptionForItem(uintptr_t handle, QOpcUa::NodeAttribute attr); - + void cleanupSubscriptions(); Q_DISABLE_COPY(UACppAsyncBackend); UaClientSdk::UaSession *m_nativeSession; QUACppClient *m_clientImpl; |