summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2024-02-19 11:46:42 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2024-02-20 17:34:02 +0100
commit35def0334130b40410fc9bb3f805837e57ee59ed (patch)
treea75060ca98715b6ee777c43cf22f0f53dc6d0f49
parent229832178517c54e7b719207ec1d377d7180049d (diff)
Use std::optional instead of bool to indicate success of de/encoding
QOpcUaGenericStructHandler is a new class in Qt 6.7, and has two functions that return values but might fail. The modern C++ way of doing this is to return a std::optional, rather than return a bool with the value returned through an out-parameter (or a default- constructed value with a boolean out-parameter to indicate success). Found during API review. Pick-to: 6.7 Change-Id: Ib2ba6098f53eccab73beace6844028d0b674ca65 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--examples/opcua/opcuaviewer/treeitem.cpp7
-rw-r--r--src/opcua/client/qopcuagenericstructhandler.cpp32
-rw-r--r--src/opcua/client/qopcuagenericstructhandler.h6
-rw-r--r--tests/auto/qopcuaclient/tst_client.cpp241
4 files changed, 140 insertions, 146 deletions
diff --git a/examples/opcua/opcuaviewer/treeitem.cpp b/examples/opcua/opcuaviewer/treeitem.cpp
index c8ced61..1cbbc02 100644
--- a/examples/opcua/opcuaviewer/treeitem.cpp
+++ b/examples/opcua/opcuaviewer/treeitem.cpp
@@ -343,10 +343,9 @@ QString TreeItem::variantToString(const QVariant &value, const QString &typeNode
if (mModel->genericStructHandler() &&
mModel->genericStructHandler()->dataTypeKindForTypeId(mModel->genericStructHandler()->typeIdForBinaryEncodingId(obj.encodingTypeId()))
== QOpcUaGenericStructHandler::DataTypeKind::Struct) {
- bool decodeSuccess = false;
- const auto decodedValue = mModel->genericStructHandler()->decode(obj, decodeSuccess);
- if (decodeSuccess)
- return decodedValue.toString();
+ const auto decodedValue = mModel->genericStructHandler()->decode(obj);
+ if (decodedValue)
+ return decodedValue->toString();
}
return u"[TypeId: \"%1\", Encoding: %2, Body: 0x%3]"_s.arg(obj.encodingTypeId(),
diff --git a/src/opcua/client/qopcuagenericstructhandler.cpp b/src/opcua/client/qopcuagenericstructhandler.cpp
index 42b79ba..3cf0af8 100644
--- a/src/opcua/client/qopcuagenericstructhandler.cpp
+++ b/src/opcua/client/qopcuagenericstructhandler.cpp
@@ -56,13 +56,12 @@ QT_BEGIN_NAMESPACE
auto extObj = node->valueAttribute().value<QOpcUaExtensionObject>();
qDebug() << "Got object of type" << handler.typeNameForBinaryEncodingId(extObj.encodingTypeId());
- bool success = false;
- auto result = handler.decode(extObj, success);
+ const auto result = handler.decode(extObj);
- if (!success)
+ if (!result)
return;
- qDebug() << result;
+ qDebug() << *result;
});
});
\endcode
@@ -81,10 +80,9 @@ QT_BEGIN_NAMESPACE
value.fieldsRef()["MandatoryMember"] = 23.0;
value.fieldsRef()["OptionalMember"] = 42.0;
- QOpcUaExtensionObject ext;
- bool success = handler.encode(value, ext);
+ const auto ext = handler.encode(value);
- if (!success)
+ if (!ext)
return;
// Use the extension object to write a node's value attribute, in a method parameter, etc...
@@ -136,20 +134,26 @@ bool QOpcUaGenericStructHandler::initialize()
}
/*!
- Decodes \a extensionObject to a \l QOpcUaGenericStructValue. If the decoder fails, a default constructed value is returned.
- \a success indicates if the decoding was successful after the method has returned.
+ Decodes \a extensionObject to a \l QOpcUaGenericStructValue. If the decoder fails, \c std::nullopt is returned.
*/
-QOpcUaGenericStructValue QOpcUaGenericStructHandler::decode(const QOpcUaExtensionObject &extensionObject, bool &success) const
+std::optional<QOpcUaGenericStructValue> QOpcUaGenericStructHandler::decode(const QOpcUaExtensionObject &extensionObject) const
{
- return d_func()->decode(extensionObject, success);
+ bool success = false;
+ auto result = d_func()->decode(extensionObject, success);
+ if (!success)
+ return std::nullopt;
+ return result;
}
/*!
- Encodes \a value into the extension object \a output. Returns \c true if the value was successfully encoded.
+ Returns \a value encoded as a \l QOpcUaExtensionObject, or \c std::nullopt if the value could not be encoded.
*/
-bool QOpcUaGenericStructHandler::encode(const QOpcUaGenericStructValue &value, QOpcUaExtensionObject &output)
+std::optional<QOpcUaExtensionObject> QOpcUaGenericStructHandler::encode(const QOpcUaGenericStructValue &value)
{
- return d_func()->encode(value, output);
+ QOpcUaExtensionObject output;
+ if (!d_func()->encode(value, output))
+ return std::nullopt;
+ return output;
}
/*!
diff --git a/src/opcua/client/qopcuagenericstructhandler.h b/src/opcua/client/qopcuagenericstructhandler.h
index 16c0ac1..de8b47b 100644
--- a/src/opcua/client/qopcuagenericstructhandler.h
+++ b/src/opcua/client/qopcuagenericstructhandler.h
@@ -9,6 +9,8 @@
#include <QtCore/qobject.h>
+#include <optional>
+
#ifndef QOPCUAGENERICSTRUCTHANDLER_H
#define QOPCUAGENERICSTRUCTHANDLER_H
@@ -25,8 +27,8 @@ public:
bool initialize();
- QOpcUaGenericStructValue decode(const QOpcUaExtensionObject &extensionObject, bool &success) const;
- bool encode(const QOpcUaGenericStructValue &value, QOpcUaExtensionObject &output);
+ std::optional<QOpcUaGenericStructValue> decode(const QOpcUaExtensionObject &extensionObject) const;
+ std::optional<QOpcUaExtensionObject> encode(const QOpcUaGenericStructValue &value);
QOpcUaGenericStructValue createGenericStructValueForTypeId(const QString &typeId);
diff --git a/tests/auto/qopcuaclient/tst_client.cpp b/tests/auto/qopcuaclient/tst_client.cpp
index c025f68..7fd6a30 100644
--- a/tests/auto/qopcuaclient/tst_client.cpp
+++ b/tests/auto/qopcuaclient/tst_client.cpp
@@ -6041,35 +6041,33 @@ void Tst_QOpcUaClient::decodeGenericStruct()
QCOMPARE(results.at(5).statusCode(), QOpcUa::UaStatusCode::Good);
QCOMPARE(results.at(6).statusCode(), QOpcUa::UaStatusCode::Good);
- bool decodeSuccess = false;
-
{
auto nestedStructExt = results.at(0).value().value<QOpcUaExtensionObject>();
- auto decodedData = decoder.decode(nestedStructExt, decodeSuccess);
- QCOMPARE(decodeSuccess, true);
- qDebug() << decodedData;
+ auto decodedData = decoder.decode(nestedStructExt);
+ QVERIFY(decodedData);
+ qDebug() << *decodedData;
- QCOMPARE(decodedData.typeName(), "QtTestStructType");
+ QCOMPARE(decodedData->typeName(), "QtTestStructType");
- QCOMPARE(decodedData.fields().value("EnumMember").toInt(), 1);
- QCOMPARE(decodedData.fields().value("Int64ArrayMember").value<QList<qint64>>(),
+ QCOMPARE(decodedData->fields().value("EnumMember").toInt(), 1);
+ QCOMPARE(decodedData->fields().value("Int64ArrayMember").value<QList<qint64>>(),
QList<qint64>({std::numeric_limits<qint64>::max(),
std::numeric_limits<qint64>::max() - 1,
std::numeric_limits<qint64>::min()}));
- QCOMPARE(decodedData.fields().value("LocalizedTextMember").value<QOpcUaLocalizedText>().locale(), "en");
- QCOMPARE(decodedData.fields().value("LocalizedTextMember").value<QOpcUaLocalizedText>().text(), "TestText");
+ QCOMPARE(decodedData->fields().value("LocalizedTextMember").value<QOpcUaLocalizedText>().locale(), "en");
+ QCOMPARE(decodedData->fields().value("LocalizedTextMember").value<QOpcUaLocalizedText>().text(), "TestText");
- QCOMPARE(decodedData.fields().value("QualifiedNameMember").value<QOpcUaQualifiedName>().namespaceIndex(), 1);
- QCOMPARE(decodedData.fields().value("QualifiedNameMember").value<QOpcUaQualifiedName>().name(), "TestName");
+ QCOMPARE(decodedData->fields().value("QualifiedNameMember").value<QOpcUaQualifiedName>().namespaceIndex(), 1);
+ QCOMPARE(decodedData->fields().value("QualifiedNameMember").value<QOpcUaQualifiedName>().name(), "TestName");
- QCOMPARE(decodedData.fields().value("StringMember").value<QString>(), "TestString");
+ QCOMPARE(decodedData->fields().value("StringMember").value<QString>(), "TestString");
- auto nestedStructValue = decodedData.fields().value("NestedStructMember").value<QOpcUaGenericStructValue>();
+ auto nestedStructValue = decodedData->fields().value("NestedStructMember").value<QOpcUaGenericStructValue>();
QCOMPARE(nestedStructValue.typeName(), "QtInnerTestStructType");
QCOMPARE(nestedStructValue.fields().value("DoubleSubtypeMember").toDouble(), 42.0);
- auto nestedStructArrayValue = decodedData.fields().value("NestedStructArrayMember").value<QList<QOpcUaGenericStructValue>>();
+ auto nestedStructArrayValue = decodedData->fields().value("NestedStructArrayMember").value<QList<QOpcUaGenericStructValue>>();
QCOMPARE(nestedStructArrayValue.size(), 2);
QCOMPARE(nestedStructArrayValue.at(0).typeName(), "QtInnerTestStructType");
QCOMPARE(nestedStructArrayValue.at(0).fields().value("DoubleSubtypeMember").toDouble(), 23.0);
@@ -6079,71 +6077,71 @@ void Tst_QOpcUaClient::decodeGenericStruct()
{
auto unionExt = results.at(1).value().value<QOpcUaExtensionObject>();
- auto decodedData = decoder.decode(unionExt, decodeSuccess);
- QCOMPARE(decodeSuccess, true);
- qDebug() << decodedData;
+ auto decodedData = decoder.decode(unionExt);
+ QVERIFY(decodedData);
+ qDebug() << *decodedData;
- QCOMPARE(decodedData.typeName(), "QtTestUnionType");
- QCOMPARE(decodedData.fields().value("Member1"), 42);
+ QCOMPARE(decodedData->typeName(), "QtTestUnionType");
+ QCOMPARE(decodedData->fields().value("Member1"), 42);
}
{
auto unionExt = results.at(2).value().value<QOpcUaExtensionObject>();
- auto decodedData = decoder.decode(unionExt, decodeSuccess);
- QCOMPARE(decodeSuccess, true);
- qDebug() << decodedData;
+ auto decodedData = decoder.decode(unionExt);
+ QVERIFY(decodedData);
+ qDebug() << *decodedData;
- QCOMPARE(decodedData.typeName(), "QtTestUnionType");
+ QCOMPARE(decodedData->typeName(), "QtTestUnionType");
- auto unionFieldValue = decodedData.fields().value("Member2").value<QOpcUaGenericStructValue>();
+ auto unionFieldValue = decodedData->fields().value("Member2").value<QOpcUaGenericStructValue>();
QCOMPARE(unionFieldValue.fields().value("DoubleSubtypeMember").toDouble(), 23.0);
}
// Struct type with optional field with optional field set
{
auto optionalFieldExt = results.at(3).value().value<QOpcUaExtensionObject>();
- auto decodedData = decoder.decode(optionalFieldExt, decodeSuccess);
- QCOMPARE(decodeSuccess, true);
- qDebug() << decodedData;
+ auto decodedData = decoder.decode(optionalFieldExt);
+ QVERIFY(decodedData);
+ qDebug() << *decodedData;
- QCOMPARE(decodedData.typeName(), "QtStructWithOptionalFieldType");
+ QCOMPARE(decodedData->typeName(), "QtStructWithOptionalFieldType");
- QCOMPARE(decodedData.fields().value("MandatoryMember").toDouble(), 42.0);
- QCOMPARE(decodedData.fields().value("OptionalMember").toDouble(), 23.0);
+ QCOMPARE(decodedData->fields().value("MandatoryMember").toDouble(), 42.0);
+ QCOMPARE(decodedData->fields().value("OptionalMember").toDouble(), 23.0);
}
// Struct type with optional field without optional field set
{
auto optionalFieldExt = results.at(4).value().value<QOpcUaExtensionObject>();
- auto decodedData = decoder.decode(optionalFieldExt, decodeSuccess);
- QCOMPARE(decodeSuccess, true);
- qDebug() << decodedData;
+ auto decodedData = decoder.decode(optionalFieldExt);
+ QVERIFY(decodedData);
+ qDebug() << *decodedData;
- QCOMPARE(decodedData.typeName(), "QtStructWithOptionalFieldType");
+ QCOMPARE(decodedData->typeName(), "QtStructWithOptionalFieldType");
- QCOMPARE(decodedData.fields().value("MandatoryMember").toDouble(), 42.0);
- QCOMPARE(decodedData.fields().contains("OptionalMember"), false);
+ QCOMPARE(decodedData->fields().value("MandatoryMember").toDouble(), 42.0);
+ QCOMPARE(decodedData->fields().contains("OptionalMember"), false);
}
{
auto diagnosticInfoExt = results.at(5).value().value<QOpcUaExtensionObject>();
- auto decodedData = decoder.decode(diagnosticInfoExt, decodeSuccess);
- qDebug() << decodedData;
- QCOMPARE(decodedData.fields().contains("DiagnosticInfoMember"), true);
- QCOMPARE(decodedData.fields().value("DiagnosticInfoMember").value<QOpcUaDiagnosticInfo>(), testDiagnosticInfos.at(0));
- QCOMPARE(decodedData.fields().contains("DiagnosticInfoArrayMember"), true);
- QCOMPARE(decodedData.fields().value("DiagnosticInfoArrayMember").value<QList<QOpcUaDiagnosticInfo>>(), testDiagnosticInfos);
- QCOMPARE(decodeSuccess, true);
+ auto decodedData = decoder.decode(diagnosticInfoExt);
+ QVERIFY(decodedData);
+ qDebug() << *decodedData;
+ QCOMPARE(decodedData->fields().contains("DiagnosticInfoMember"), true);
+ QCOMPARE(decodedData->fields().value("DiagnosticInfoMember").value<QOpcUaDiagnosticInfo>(), testDiagnosticInfos.at(0));
+ QCOMPARE(decodedData->fields().contains("DiagnosticInfoArrayMember"), true);
+ QCOMPARE(decodedData->fields().value("DiagnosticInfoArrayMember").value<QList<QOpcUaDiagnosticInfo>>(), testDiagnosticInfos);
}
{
auto dataValueExt = results.at(6).value().value<QOpcUaExtensionObject>();
- auto decodedData = decoder.decode(dataValueExt, decodeSuccess);
- qDebug() << decodedData;
- QCOMPARE(decodeSuccess, true);
+ auto decodedData = decoder.decode(dataValueExt);
+ QVERIFY(decodedData);
+ qDebug() << *decodedData;
- QVERIFY(decodedData.fields().contains("DataValueMember"));
- const auto dv = decodedData.fields().value("DataValueMember").value<QOpcUaDataValue>();
+ QVERIFY(decodedData->fields().contains("DataValueMember"));
+ const auto dv = decodedData->fields().value("DataValueMember").value<QOpcUaDataValue>();
QCOMPARE(dv.statusCode(), QOpcUa::UaStatusCode::BadInternalError);
QCOMPARE(dv.serverTimestamp(), QDateTime::fromMSecsSinceEpoch(1698655307000));
QCOMPARE(dv.sourceTimestamp(), QDateTime::fromMSecsSinceEpoch(1698655306000));
@@ -6153,8 +6151,8 @@ void Tst_QOpcUaClient::decodeGenericStruct()
QCOMPARE(v.value(), (QList<QString>{"TestString 1", "TestString 2", "TestString 3", "TestString 4"}));
QCOMPARE(v.arrayDimensions(), (QList<qint32>{ 2, 2 }));
- QVERIFY(decodedData.fields().contains("VariantMember"));
- const auto var = decodedData.fields().value("VariantMember").value<QOpcUaVariant>();
+ QVERIFY(decodedData->fields().contains("VariantMember"));
+ const auto var = decodedData->fields().value("VariantMember").value<QOpcUaVariant>();
QVERIFY(var.arrayDimensions().isEmpty());
QCOMPARE(var.type(), QOpcUaVariant::ValueType::UInt64);
QCOMPARE(var.value(), 42);
@@ -6200,22 +6198,22 @@ void Tst_QOpcUaClient::encodeGenericStruct()
value.fieldsRef()["NestedStructArrayMember"] =
QVariant::fromValue(QList<QOpcUaGenericStructValue>({innerValue1, innerValue2}));
- QOpcUaExtensionObject ext;
- success = handler.encode(value, ext);
- QCOMPARE(success, true);
+ auto ext = handler.encode(value);
+ QVERIFY(ext);
- const auto decoded = handler.decode(ext, success);
+ const auto decoded = handler.decode(*ext);
+ QVERIFY(decoded);
- QCOMPARE(decoded.fields().value("StringMember"), "StringMember");
- QCOMPARE(decoded.fields().value("LocalizedTextMember"), QOpcUaLocalizedText("en", "Localized text"));
- QCOMPARE(decoded.fields().value("QualifiedNameMember"), QOpcUaQualifiedName(1, "Qualified name"));
- QCOMPARE(decoded.fields().value("Int64ArrayMember"), QVariant::fromValue(QList<qint64>({1, 2, 3, 4})));
- QCOMPARE(decoded.fields().value("EnumMember"), 42);
+ QCOMPARE(decoded->fields().value("StringMember"), "StringMember");
+ QCOMPARE(decoded->fields().value("LocalizedTextMember"), QOpcUaLocalizedText("en", "Localized text"));
+ QCOMPARE(decoded->fields().value("QualifiedNameMember"), QOpcUaQualifiedName(1, "Qualified name"));
+ QCOMPARE(decoded->fields().value("Int64ArrayMember"), QVariant::fromValue(QList<qint64>({1, 2, 3, 4})));
+ QCOMPARE(decoded->fields().value("EnumMember"), 42);
- const auto innerDecoded = decoded.fields().value("NestedStructMember").value<QOpcUaGenericStructValue>();
+ const auto innerDecoded = decoded->fields().value("NestedStructMember").value<QOpcUaGenericStructValue>();
QCOMPARE(innerDecoded.fields().value("DoubleSubtypeMember"), 42.0);
- auto nestedStructArrayValue = decoded.fields().value("NestedStructArrayMember").value<QList<QOpcUaGenericStructValue>>();
+ auto nestedStructArrayValue = decoded->fields().value("NestedStructArrayMember").value<QList<QOpcUaGenericStructValue>>();
QCOMPARE(nestedStructArrayValue.size(), 2);
QCOMPARE(nestedStructArrayValue.at(0).typeName(), "QtInnerTestStructType");
QCOMPARE(nestedStructArrayValue.at(0).fields().value("DoubleSubtypeMember").toDouble(), 23.0);
@@ -6223,25 +6221,24 @@ void Tst_QOpcUaClient::encodeGenericStruct()
QCOMPARE(nestedStructArrayValue.at(1).fields().value("DoubleSubtypeMember").toDouble(), 42.0);
QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=4;i=6009"));
- WRITE_VALUE_ATTRIBUTE(node, ext, QOpcUa::Types::ExtensionObject);
+ WRITE_VALUE_ATTRIBUTE(node, *ext, QOpcUa::Types::ExtensionObject);
}
{
auto unionValue = handler.createGenericStructValueForTypeId("ns=4;i=3005");
unionValue.fieldsRef()["Member1"] = 23;
- QOpcUaExtensionObject ext;
- success = handler.encode(unionValue, ext);
- QCOMPARE(success, true);
- QCOMPARE(ext.encodingTypeId(), unionValue.structureDefinition().defaultEncodingId());
+ auto ext = handler.encode(unionValue);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), unionValue.structureDefinition().defaultEncodingId());
- const auto decoded = handler.decode(ext, success);
- QCOMPARE(success, true);
+ const auto decoded = handler.decode(*ext);
+ QVERIFY(decoded);
- QCOMPARE(decoded.fields().value("Member1"), 23);
+ QCOMPARE(decoded->fields().value("Member1"), 23);
QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=4;i=6011"));
- WRITE_VALUE_ATTRIBUTE(node, ext, QOpcUa::Types::ExtensionObject);
+ WRITE_VALUE_ATTRIBUTE(node, *ext, QOpcUa::Types::ExtensionObject);
}
{
@@ -6250,22 +6247,20 @@ void Tst_QOpcUaClient::encodeGenericStruct()
innerValue.fieldsRef()["DoubleSubtypeMember"] = 42.0;
unionValue.fieldsRef()["Member2"] = innerValue;
- QOpcUaExtensionObject ext;
- success = handler.encode(unionValue, ext);
- QCOMPARE(success, true);
- QCOMPARE(ext.encodingTypeId(), unionValue.structureDefinition().defaultEncodingId());
-
- const auto decoded = handler.decode(ext, success);
- QCOMPARE(success, true);
+ auto ext = handler.encode(unionValue);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), unionValue.structureDefinition().defaultEncodingId());
+ const auto decoded = handler.decode(*ext);
+ QVERIFY(decoded);
- QVERIFY(decoded.fields().contains("Member2"));
+ QVERIFY(decoded->fields().contains("Member2"));
- const auto innerDecoded = decoded.fields().value("Member2").value<QOpcUaGenericStructValue>();
+ const auto innerDecoded = decoded->fields().value("Member2").value<QOpcUaGenericStructValue>();
QCOMPARE(innerDecoded.fields().value("DoubleSubtypeMember"), 42.0);
QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=4;i=6003"));
- WRITE_VALUE_ATTRIBUTE(node, ext, QOpcUa::Types::ExtensionObject);
+ WRITE_VALUE_ATTRIBUTE(node, *ext, QOpcUa::Types::ExtensionObject);
}
{
@@ -6273,36 +6268,34 @@ void Tst_QOpcUaClient::encodeGenericStruct()
value.fieldsRef()["MandatoryMember"] = 23.0;
value.fieldsRef()["OptionalMember"] = 42.0;
- QOpcUaExtensionObject ext;
- success = handler.encode(value, ext);
- QCOMPARE(success, true);
- QCOMPARE(ext.encodingTypeId(), value.structureDefinition().defaultEncodingId());
+ auto ext = handler.encode(value);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), value.structureDefinition().defaultEncodingId());
- const auto decoded = handler.decode(ext, success);
+ const auto decoded = handler.decode(*ext);
- QCOMPARE(decoded.fields().value("MandatoryMember"), 23.0);
- QCOMPARE(decoded.fields().value("OptionalMember"), 42.0);
+ QCOMPARE(decoded->fields().value("MandatoryMember"), 23.0);
+ QCOMPARE(decoded->fields().value("OptionalMember"), 42.0);
QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=4;i=6010"));
- WRITE_VALUE_ATTRIBUTE(node, ext, QOpcUa::Types::ExtensionObject);
+ WRITE_VALUE_ATTRIBUTE(node, *ext, QOpcUa::Types::ExtensionObject);
}
{
auto value = handler.createGenericStructValueForTypeId("ns=4;i=3006");
value.fieldsRef()["MandatoryMember"] = 23.0;
- QOpcUaExtensionObject ext;
- success = handler.encode(value, ext);
- QCOMPARE(success, true);
- QCOMPARE(ext.encodingTypeId(), value.structureDefinition().defaultEncodingId());
+ auto ext = handler.encode(value);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), value.structureDefinition().defaultEncodingId());
- const auto decoded = handler.decode(ext, success);
+ const auto decoded = handler.decode(*ext);
- QCOMPARE(decoded.fields().value("MandatoryMember"), 23.0);
- QCOMPARE(decoded.fields().contains("OptionalMember"), false);
+ QCOMPARE(decoded->fields().value("MandatoryMember"), 23.0);
+ QCOMPARE(decoded->fields().contains("OptionalMember"), false);
QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=4;i=6002"));
- WRITE_VALUE_ATTRIBUTE(node, ext, QOpcUa::Types::ExtensionObject);
+ WRITE_VALUE_ATTRIBUTE(node, *ext, QOpcUa::Types::ExtensionObject);
}
{
@@ -6310,17 +6303,16 @@ void Tst_QOpcUaClient::encodeGenericStruct()
value.fieldsRef()["DiagnosticInfoMember"] = testDiagnosticInfos.at(0);
value.fieldsRef()["DiagnosticInfoArrayMember"] = QVariant::fromValue(testDiagnosticInfos);
- QOpcUaExtensionObject ext;
- success = handler.encode(value, ext);
- QCOMPARE(success, true);
- QCOMPARE(ext.encodingTypeId(), value.structureDefinition().defaultEncodingId());
+ auto ext = handler.encode(value);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), value.structureDefinition().defaultEncodingId());
- const auto decoded = handler.decode(ext, success);
- QCOMPARE(decoded.fields().value("DiagnosticInfoMember"), testDiagnosticInfos.at(0));
- QCOMPARE(decoded.fields().value("DiagnosticInfoArrayMember").value<QList<QOpcUaDiagnosticInfo>>(), testDiagnosticInfos);
+ const auto decoded = handler.decode(*ext);
+ QCOMPARE(decoded->fields().value("DiagnosticInfoMember"), testDiagnosticInfos.at(0));
+ QCOMPARE(decoded->fields().value("DiagnosticInfoArrayMember").value<QList<QOpcUaDiagnosticInfo>>(), testDiagnosticInfos);
QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=4;i=6006"));
- WRITE_VALUE_ATTRIBUTE(node, ext, QOpcUa::Types::ExtensionObject);
+ WRITE_VALUE_ATTRIBUTE(node, *ext, QOpcUa::Types::ExtensionObject);
}
{
@@ -6328,18 +6320,17 @@ void Tst_QOpcUaClient::encodeGenericStruct()
value.fieldsRef()["DataValueMember"] = testDataValues.at(0);
value.fieldsRef()["VariantMember"] = testVariants.at(0);
- QOpcUaExtensionObject ext;
- success = handler.encode(value, ext);
- QCOMPARE(success, true);
- QCOMPARE(ext.encodingTypeId(), value.structureDefinition().defaultEncodingId());
+ auto ext = handler.encode(value);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), value.structureDefinition().defaultEncodingId());
- const auto decoded = handler.decode(ext, success);
+ const auto decoded = handler.decode(*ext);
- QCOMPARE(decoded.fields().value("DataValueMember"), testDataValues.at(0));
- QCOMPARE(decoded.fields().value("VariantMember"), testVariants.at(0));
+ QCOMPARE(decoded->fields().value("DataValueMember"), testDataValues.at(0));
+ QCOMPARE(decoded->fields().value("VariantMember"), testVariants.at(0));
QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=4;i=6027"));
- WRITE_VALUE_ATTRIBUTE(node, ext, QOpcUa::Types::ExtensionObject);
+ WRITE_VALUE_ATTRIBUTE(node, *ext, QOpcUa::Types::ExtensionObject);
}
}
@@ -6381,15 +6372,14 @@ void Tst_QOpcUaClient::encodeCustomGenericStruct()
auto value = handler.createGenericStructValueForTypeId("ns=5;i=23");
value.fieldsRef()["MatrixMember"] = QOpcUaMultiDimensionalArray({1, 2, 3, 4}, {2, 2});
- QOpcUaExtensionObject ext;
- success = handler.encode(value, ext);
- QVERIFY(success);
- QCOMPARE(ext.encodingTypeId(), value.structureDefinition().defaultEncodingId());
+ auto ext = handler.encode(value);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), value.structureDefinition().defaultEncodingId());
- const auto decoded = handler.decode(ext, success);
+ const auto decoded = handler.decode(*ext);
QVERIFY(success);
- const auto matrix = decoded.fields().value("MatrixMember").value<QOpcUaMultiDimensionalArray>();
+ const auto matrix = decoded->fields().value("MatrixMember").value<QOpcUaMultiDimensionalArray>();
QCOMPARE(matrix.arrayDimensions(), QList<quint32>({2, 2}));
QCOMPARE(matrix.value(QList<quint32>({0, 0})), 1);
QCOMPARE(matrix.value(QList<quint32>({0, 1})), 2);
@@ -6429,15 +6419,14 @@ void Tst_QOpcUaClient::encodeCustomGenericStruct()
value.fieldsRef()["StructMatrixMember"] =
QOpcUaMultiDimensionalArray(QVariantList({innerValue1, innerValue2, innerValue3, innerValue4}), {2, 2});
- QOpcUaExtensionObject ext;
- success = handler.encode(value, ext);
- QVERIFY(success);
- QCOMPARE(ext.encodingTypeId(), value.structureDefinition().defaultEncodingId());
+ auto ext = handler.encode(value);
+ QVERIFY(ext);
+ QCOMPARE(ext->encodingTypeId(), value.structureDefinition().defaultEncodingId());
- const auto decoded = handler.decode(ext, success);
- QVERIFY(success);
+ const auto decoded = handler.decode(*ext);
+ QVERIFY(decoded);
- const auto matrix = decoded.fields().value("StructMatrixMember").value<QOpcUaMultiDimensionalArray>();
+ const auto matrix = decoded->fields().value("StructMatrixMember").value<QOpcUaMultiDimensionalArray>();
QCOMPARE(matrix.arrayDimensions(), QList<quint32>({2, 2}));
QCOMPARE(matrix.value(QList<quint32>({0, 0})).value<QOpcUaGenericStructValue>().fields().value("DoubleSubtypeMember"), 1);
QCOMPARE(matrix.value(QList<quint32>({0, 1})).value<QOpcUaGenericStructValue>().fields().value("DoubleSubtypeMember"), 2);