/// <summary> /// Encode Network Message Header /// </summary> /// <param name="decoder"></param> private void DecodeNetworkMessageHeader(BinaryDecoder decoder) { // byte[0..3] UADPVersion value 1 (for now) // byte[4..7] UADPFlags byte versionFlags = decoder.ReadByte("VersionFlags"); UADPVersion = (byte)(versionFlags & kUADPVersionBitMask); // Decode UADPFlags UADPFlags = (UADPFlagsEncodingMask)(versionFlags & 0xF0); // Decode the ExtendedFlags1 if ((UADPFlags & UADPFlagsEncodingMask.ExtendedFlags1) != 0) { ExtendedFlags1 = (ExtendedFlags1EncodingMask)decoder.ReadByte("ExtendedFlags1"); } // Decode the ExtendedFlags2 if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.ExtendedFlags2) != 0) { ExtendedFlags2 = (ExtendedFlags2EncodingMask)decoder.ReadByte("ExtendedFlags2"); } // calculate UADPNetworkMessageType if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.NetworkMessageWithDiscoveryRequest) != 0) { m_uadpNetworkMessageType = UADPNetworkMessageType.DiscoveryRequest; } else if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.NetworkMessageWithDiscoveryResponse) != 0) { m_uadpNetworkMessageType = UADPNetworkMessageType.DiscoveryResponse; } else { m_uadpNetworkMessageType = UADPNetworkMessageType.DataSetMessage; } // Decode PublisherId if ((UADPFlags & UADPFlagsEncodingMask.PublisherId) != 0) { PublisherIdTypeEncodingMask publishedIdTypeType = (PublisherIdTypeEncodingMask)((byte)ExtendedFlags1 & kPublishedIdTypeUsedBits); switch (publishedIdTypeType) { case PublisherIdTypeEncodingMask.UInt16: m_publisherId = decoder.ReadUInt16("PublisherId"); break; case PublisherIdTypeEncodingMask.UInt32: m_publisherId = decoder.ReadUInt32("PublisherId"); break; case PublisherIdTypeEncodingMask.UInt64: m_publisherId = decoder.ReadUInt64("PublisherId"); break; case PublisherIdTypeEncodingMask.String: m_publisherId = decoder.ReadString("PublisherId"); break; case PublisherIdTypeEncodingMask.Byte: default: // 000 The PublisherId is of DataType Byte // This is the default value if ExtendedFlags1 is omitted m_publisherId = decoder.ReadByte("PublisherId"); break; } } // Decode DataSetClassId if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.DataSetClassId) != 0) { DataSetClassId = decoder.ReadGuid("DataSetClassId"); } }
/// <summary> /// Decode a scalar type /// </summary> /// <param name="binaryDecoder"></param> /// <param name="builtInType"></param> /// <returns>The decoded object</returns> private object DecodeRawScalar(BinaryDecoder binaryDecoder, byte builtInType) { switch ((BuiltInType)builtInType) { case BuiltInType.Boolean: return(binaryDecoder.ReadBoolean(null)); case BuiltInType.SByte: return(binaryDecoder.ReadSByte(null)); case BuiltInType.Byte: return(binaryDecoder.ReadByte(null)); case BuiltInType.Int16: return(binaryDecoder.ReadInt16(null)); case BuiltInType.UInt16: return(binaryDecoder.ReadUInt16(null)); case BuiltInType.Int32: return(binaryDecoder.ReadInt32(null)); case BuiltInType.UInt32: return(binaryDecoder.ReadUInt32(null)); case BuiltInType.Int64: return(binaryDecoder.ReadInt64(null)); case BuiltInType.UInt64: return(binaryDecoder.ReadUInt64(null)); case BuiltInType.Float: return(binaryDecoder.ReadFloat(null)); case BuiltInType.Double: return(binaryDecoder.ReadDouble(null)); case BuiltInType.String: return(binaryDecoder.ReadString(null)); case BuiltInType.DateTime: return(binaryDecoder.ReadDateTime(null)); case BuiltInType.Guid: return(binaryDecoder.ReadGuid(null)); case BuiltInType.ByteString: return(binaryDecoder.ReadByteString(null)); case BuiltInType.XmlElement: return(binaryDecoder.ReadXmlElement(null)); case BuiltInType.NodeId: return(binaryDecoder.ReadNodeId(null)); case BuiltInType.ExpandedNodeId: return(binaryDecoder.ReadExpandedNodeId(null)); case BuiltInType.StatusCode: return(binaryDecoder.ReadStatusCode(null)); case BuiltInType.QualifiedName: return(binaryDecoder.ReadQualifiedName(null)); case BuiltInType.LocalizedText: return(binaryDecoder.ReadLocalizedText(null)); case BuiltInType.DataValue: return(binaryDecoder.ReadDataValue(null)); case BuiltInType.Enumeration: return(binaryDecoder.ReadInt32(null)); case BuiltInType.Variant: return(binaryDecoder.ReadVariant(null)); case BuiltInType.ExtensionObject: return(binaryDecoder.ReadExtensionObject(null)); default: return(null); } }