in src/Azure.IIoT.OpcUa/src/Encoders/PubSub/MonitoredItemMessage.cs [208:331]
internal override bool TryDecode(JsonDecoderEx decoder, string? property, ref bool withHeader,
ref string? publisherId)
{
// If reading from property return false as this means we are a standard dataset message
if (property != null)
{
return false;
}
var value = decoder.ReadDataValue(nameof(Value));
DataSetFieldContentFlags dataSetFieldContentMask = 0u;
if (value != null)
{
if (value.ServerTimestamp != DateTime.MinValue)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.ServerTimestamp;
}
if (value.ServerPicoseconds != 0)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.ServerPicoSeconds;
}
if (value.SourceTimestamp != DateTime.MinValue)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.SourceTimestamp;
}
if (value.SourcePicoseconds != 0)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.SourcePicoSeconds;
}
if (value.StatusCode != 0)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.StatusCode;
}
}
// Read header
DataSetMessageContentMask = 0u;
var displayName = decoder.ReadString(nameof(DisplayName));
if (displayName != null)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.DisplayName;
}
NodeId = decoder.ReadString(nameof(NodeId));
if (NodeId != null)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.NodeId;
}
EndpointUrl = decoder.ReadString(nameof(EndpointUrl));
if (EndpointUrl != null)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.EndpointUrl;
}
ApplicationUri = decoder.ReadString(nameof(ApplicationUri));
if (ApplicationUri != null)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.ApplicationUri;
}
var timestamp = decoder.ReadDateTime(nameof(Timestamp));
if (timestamp != DateTime.MinValue)
{
Timestamp = timestamp;
DataSetMessageContentMask |= DataSetMessageContentFlags.Timestamp;
}
var status = decoder.ReadString(nameof(Status));
if (status != null)
{
if (TypeMaps.StatusCodes.Value.TryGetIdentifier(status, out var statusCode))
{
Status = statusCode;
}
else
{
Status = status == "Good" ? Opc.Ua.StatusCodes.Good : Opc.Ua.StatusCodes.Bad;
}
}
SequenceNumber = decoder.ReadUInt32(nameof(SequenceNumber));
if (SequenceNumber != 0)
{
DataSetMessageContentMask |= DataSetMessageContentFlags.SequenceNumber;
}
var stringDictionary = decoder.ReadStringDictionary(nameof(ExtensionFields));
if (stringDictionary?.Count > 0)
{
dataSetFieldContentMask |= DataSetFieldContentFlags.ExtensionFields;
var extensionFields = new List<ExtensionFieldModel>();
foreach (var (name, v) in stringDictionary)
{
if (name == nameof(DataSetWriterId))
{
DataSetWriterName = v;
}
else if (name == nameof(JsonNetworkMessage.PublisherId))
{
publisherId = v;
}
else if (name == nameof(WriterGroupId))
{
WriterGroupId = v;
}
else
{
extensionFields.Add(new ExtensionFieldModel
{
DataSetFieldName = name,
Value = v
});
}
}
ExtensionFields = extensionFields;
}
else
{
ExtensionFields = null;
}
withHeader |= DataSetMessageContentMask != 0;
if (value != null || dataSetFieldContentMask != 0)
{
Payload = Payload.Add(displayName ?? string.Empty, value, dataSetFieldContentMask);
return true;
}
// Only return true if we otherwise read a header value
return withHeader;
}