summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaurice Kalinowski <maurice.kalinowski@qt.io>2018-03-08 15:12:00 +0100
committerJannis Völker <jannis.voelker@basyskom.com>2018-03-14 09:55:46 +0000
commita7281ad15be2cd72f0e34f713db78fa2a4b944d2 (patch)
tree6919e96de2db2bdb2e5afafa1aacec2143c3f87b
parent3818af475b50981d8163594abb2f6f6f7b928369 (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.cpp14
-rw-r--r--src/plugins/opcua/uacpp/quacppbackend.h2
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;