summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-08-14 10:24:42 +0200
committerMarc Mutz <marc.mutz@qt.io>2023-08-15 21:50:19 +0000
commit4ffd33fa3704079b61aa104cee54416f30d51f6e (patch)
tree5e3b69fa3205b31477b987352ae3ce5b2ca4ac6b
parentcc0cec471b9e6b3eed68d3bc11461d2bbccfe246 (diff)
QOpcUaConnectionSettings: use chrono types for timeouts
More type-safe, larger range, more intuitive literals (10min instead of 10*60*1000). Allows to use saturation arithmetic when handing the values to the backend, instead of the incorrect truncation arithmetic that would occur as part of the implicit conversion to quint32. Found in API-review. As a drive-by, fix a few grammar issues in the docs. Pick-to: 6.6 Change-Id: Ie559202e6e48d1e07d0ee14fb7cbcc3e0c635a77 Reviewed-by: Jannis Völker <jannis.voelker@basyskom.com> Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
-rw-r--r--src/opcua/client/qopcuaconnectionsettings.cpp56
-rw-r--r--src/opcua/client/qopcuaconnectionsettings.h18
-rw-r--r--src/plugins/opcua/open62541/qopen62541backend.cpp10
3 files changed, 45 insertions, 39 deletions
diff --git a/src/opcua/client/qopcuaconnectionsettings.cpp b/src/opcua/client/qopcuaconnectionsettings.cpp
index 861d128..ea8ee15 100644
--- a/src/opcua/client/qopcuaconnectionsettings.cpp
+++ b/src/opcua/client/qopcuaconnectionsettings.cpp
@@ -5,6 +5,8 @@
#include <QtCore/qstringlist.h>
+using namespace std::chrono_literals;
+
QT_BEGIN_NAMESPACE
/*!
@@ -23,10 +25,10 @@ class QOpcUaConnectionSettingsData : public QSharedData
public:
QStringList sessionLocaleIds;
- quint32 secureChannelLifeTimeMs = 10 * 60 * 1000;
- quint32 sessionTimeoutMs = 20 * 60 * 1000;
- quint32 requestTimeoutMs = 5 * 1000;
- quint32 connectTimeoutMs = 5 * 1000;
+ std::chrono::milliseconds secureChannelLifeTime = 10min;
+ std::chrono::milliseconds sessionTimeout = 20min;
+ std::chrono::milliseconds requestTimeout = 5s;
+ std::chrono::milliseconds connectTimeout = 5s;
};
/*!
@@ -69,9 +71,9 @@ QOpcUaConnectionSettings::~QOpcUaConnectionSettings()
bool QOpcUaConnectionSettings::operator==(const QOpcUaConnectionSettings &rhs) const
{
return data->sessionLocaleIds == rhs.data->sessionLocaleIds &&
- data->secureChannelLifeTimeMs == rhs.data->secureChannelLifeTimeMs &&
- data->sessionTimeoutMs == rhs.data->sessionTimeoutMs &&
- data->requestTimeoutMs == rhs.data->requestTimeoutMs;
+ data->secureChannelLifeTime == rhs.data->secureChannelLifeTime &&
+ data->sessionTimeout == rhs.data->sessionTimeout &&
+ data->requestTimeout == rhs.data->requestTimeout;
}
/*!
@@ -96,37 +98,37 @@ void QOpcUaConnectionSettings::setSessionLocaleIds(const QStringList &localeIds)
/*!
Returns the secure channel lifetime.
*/
-quint32 QOpcUaConnectionSettings::secureChannelLifeTimeMs() const
+std::chrono::milliseconds QOpcUaConnectionSettings::secureChannelLifeTime() const
{
- return data->secureChannelLifeTimeMs;
+ return data->secureChannelLifeTime;
}
/*!
- Sets \a lifeTimeMs as new the new secure channel lifetime.
+ Sets \a lifeTime as the new secure channel lifetime.
For details, see \l{https://reference.opcfoundation.org/v104/Core/docs/Part4/5.5.2/#Table11}
*/
-void QOpcUaConnectionSettings::setSecureChannelLifeTimeMs(quint32 lifeTimeMs)
+void QOpcUaConnectionSettings::setSecureChannelLifeTime(std::chrono::milliseconds lifeTime)
{
- data->secureChannelLifeTimeMs = lifeTimeMs;
+ data->secureChannelLifeTime = lifeTime;
}
/*!
Returns the requested session timeout.
*/
-quint32 QOpcUaConnectionSettings::sessionTimeoutMs() const
+std::chrono::milliseconds QOpcUaConnectionSettings::sessionTimeout() const
{
- return data->sessionTimeoutMs;
+ return data->sessionTimeout;
}
/*!
- Sets \a timeoutMs as the new requested session timeout.
+ Sets \a timeout as the new requested session timeout.
For details, see \l{https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.2/#Table15}
*/
-void QOpcUaConnectionSettings::setSessionTimeoutMs(quint32 timeoutMs)
+void QOpcUaConnectionSettings::setSessionTimeout(std::chrono::milliseconds timeout)
{
- data->sessionTimeoutMs = timeoutMs;
+ data->sessionTimeout = timeout;
}
/*!
@@ -134,17 +136,17 @@ void QOpcUaConnectionSettings::setSessionTimeoutMs(quint32 timeoutMs)
This value determines how long a synchronous service call will wait for a reply.
*/
-quint32 QOpcUaConnectionSettings::requestTimeoutMs() const
+std::chrono::milliseconds QOpcUaConnectionSettings::requestTimeout() const
{
- return data->requestTimeoutMs;
+ return data->requestTimeout;
}
/*!
- Sets \a timeoutMs as new request timeout.
+ Sets \a timeout as the new request timeout.
*/
-void QOpcUaConnectionSettings::setRequestTimeoutMs(quint32 timeoutMs)
+void QOpcUaConnectionSettings::setRequestTimeout(std::chrono::milliseconds timeout)
{
- data->requestTimeoutMs = timeoutMs;
+ data->requestTimeout = timeout;
}
/*!
@@ -152,17 +154,17 @@ void QOpcUaConnectionSettings::setRequestTimeoutMs(quint32 timeoutMs)
This value determines how long the connect will wait for a reply.
*/
-quint32 QOpcUaConnectionSettings::connectTimeoutMs() const
+std::chrono::milliseconds QOpcUaConnectionSettings::connectTimeout() const
{
- return data->connectTimeoutMs;
+ return data->connectTimeout;
}
/*!
- Sets \a timeoutMs as new connect timeout.
+ Sets \a timeout as the new connect timeout.
*/
-void QOpcUaConnectionSettings::setConnectTimeoutMs(quint32 timeoutMs)
+void QOpcUaConnectionSettings::setConnectTimeout(std::chrono::milliseconds timeout)
{
- data->connectTimeoutMs = timeoutMs;
+ data->connectTimeout = timeout;
}
QT_END_NAMESPACE
diff --git a/src/opcua/client/qopcuaconnectionsettings.h b/src/opcua/client/qopcuaconnectionsettings.h
index ba4d85b..e174daf 100644
--- a/src/opcua/client/qopcuaconnectionsettings.h
+++ b/src/opcua/client/qopcuaconnectionsettings.h
@@ -10,6 +10,8 @@
#include <QtCore/qmetatype.h>
#include <QtCore/qshareddata.h>
+#include <chrono>
+
QT_BEGIN_NAMESPACE
class QOpcUaConnectionSettingsData;
@@ -26,17 +28,17 @@ public:
QStringList sessionLocaleIds() const;
void setSessionLocaleIds(const QStringList &localeIds);
- quint32 secureChannelLifeTimeMs() const;
- void setSecureChannelLifeTimeMs(quint32 lifeTimeMs);
+ std::chrono::milliseconds secureChannelLifeTime() const;
+ void setSecureChannelLifeTime(std::chrono::milliseconds lifeTime);
- quint32 sessionTimeoutMs() const;
- void setSessionTimeoutMs(quint32 timeoutMs);
+ std::chrono::milliseconds sessionTimeout() const;
+ void setSessionTimeout(std::chrono::milliseconds timeout);
- quint32 requestTimeoutMs() const;
- void setRequestTimeoutMs(quint32 timeoutMs);
+ std::chrono::milliseconds requestTimeout() const;
+ void setRequestTimeout(std::chrono::milliseconds timeout);
- quint32 connectTimeoutMs() const;
- void setConnectTimeoutMs(quint32 timeoutMs);
+ std::chrono::milliseconds connectTimeout() const;
+ void setConnectTimeout(std::chrono::milliseconds timeout);
private:
QSharedDataPointer<QOpcUaConnectionSettingsData> data;
diff --git a/src/plugins/opcua/open62541/qopen62541backend.cpp b/src/plugins/opcua/open62541/qopen62541backend.cpp
index 1cf3b2a..bc326af 100644
--- a/src/plugins/opcua/open62541/qopen62541backend.cpp
+++ b/src/plugins/opcua/open62541/qopen62541backend.cpp
@@ -15,6 +15,7 @@
#include <QtCore/qloggingcategory.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qurl.h>
+#include <QtCore/private/qnumeric_p.h> // for qt_saturate
#include <algorithm>
#include <limits>
@@ -927,9 +928,10 @@ void Open62541AsyncBackend::connectToEndpoint(const QOpcUaEndpointDescription &e
UA_ClientConfig_setDefault(conf);
}
- conf->timeout = connectionSettings.connectTimeoutMs();
- conf->secureChannelLifeTime = connectionSettings.secureChannelLifeTimeMs();
- conf->requestedSessionTimeout = connectionSettings.sessionTimeoutMs();
+ using Timeout_t = decltype(conf->timeout);
+ conf->timeout = qt_saturate<Timeout_t>(connectionSettings.connectTimeout().count());
+ conf->secureChannelLifeTime = qt_saturate<Timeout_t>(connectionSettings.secureChannelLifeTime().count());
+ conf->requestedSessionTimeout = qt_saturate<Timeout_t>(connectionSettings.sessionTimeout().count());
if (!connectionSettings.sessionLocaleIds().isEmpty()) {
conf->sessionLocaleIds = static_cast<UA_String *>(UA_Array_new(connectionSettings.sessionLocaleIds().size(), &UA_TYPES[UA_TYPES_STRING]));
@@ -1014,7 +1016,7 @@ void Open62541AsyncBackend::connectToEndpoint(const QOpcUaEndpointDescription &e
return;
}
- conf->timeout = connectionSettings.requestTimeoutMs();
+ conf->timeout = qt_saturate<Timeout_t>(connectionSettings.requestTimeout().count());
m_useStateCallback = true;
m_clientIterateTimer.start(m_clientIterateInterval);