/// <summary> /// Decodes just the DataSetMetaData Message omitting the DiscoveryResponse Header. /// </summary> /// <param name="inputStream"></param> /// <param name="instance"></param> /// <returns></returns> protected static bool DeocdeChunk(Stream inputStream, EncodingOptions options, ref MetaFrame instance) { instance.DataSetWriterID = BaseType.ReadUInt16(inputStream) .Value; instance.Namespaces = ParseNamespaceArray(inputStream); instance.StructureDataTypes = ParseStructureDescriptions(inputStream); // if (instance.StructureDataTypes != null) // DataPointsManager.UpdateStructureDescription(instance.StructureDataTypes); instance.EnumDataTypes = ParseEnumDescriptions(inputStream); // Simple Data Types are currently not supported int?arrayLength = BaseType.ReadInt32(inputStream); if (arrayLength > 0) { // Simple Data Types are not supported // ToDo: Log error return(false); } instance.Name = String.Decode(inputStream); instance.Description = LocalizedText.Decode(inputStream); instance.FieldMetaDataList = ParseFieldMetaDataArray(inputStream, options); byte[] guidAsByte = Common.ReadBytes(inputStream, 16); if (guidAsByte != null && guidAsByte.Length == 16) { instance.DataSetClassID = new Guid(guidAsByte); } instance.ConfigurationVersion = ConfigurationVersion.Decode(inputStream); uint?readValue = BaseType.ReadUInt32(inputStream); if (readValue != null) { instance.StatusCode = readValue.Value; } else { return(false); } return(true); }
public static bool DecodeChunk(Stream inputStream, ref DataFrame instance) { // 3. DataSetFlags1 instance.Flags1.RawValue = (byte)inputStream.ReadByte(); // 4. DataSetFlags2 if (instance.Flags1.Flags1.HasFlag(DataSetFlags1Enum.DataSetFlags2Enabled)) { instance.Flags2.RawValue = (byte)inputStream.ReadByte(); } // 5. Message Sequence Number if (instance.Flags1.Flags1.HasFlag(DataSetFlags1Enum.DataSetSequenceNumberEnabled)) { ushort?sequence = BaseType.ReadUInt16(inputStream); if (sequence != null) { instance.DataSetMessageSequenceNumber = sequence.Value; } else { // ToDo: Log error return(false); } } // evaluate the following options only if DataSetFlags2 field is provided if (instance.Flags1.Flags1.HasFlag(DataSetFlags1Enum.DataSetFlags2Enabled)) { // Timestamp if (instance.Flags2.Flags2.HasFlag(DataSetFlags2Enum.TimeStampEnabled)) { long?timestamp = BaseType.ReadInt64(inputStream); if (timestamp != null) { instance.Timestamp = DateTime.FromFileTimeUtc(timestamp.Value); //instance.Timestamp = DateTime.FromBinary(timestamp.Value); } else { // ToDo: Log error return(false); } } } // 6. Major & Minor // // we always expect both, minor and major version; ensure that both // bits are set in DataSetFlags1 // if (instance.Flags1.Flags1.HasFlag(DataSetFlags1Enum.ConfigurationVersionMajorVersion)) { if (instance.Flags1.Flags1.HasFlag(DataSetFlags1Enum.ConfigurationVersionMinorVersion)) { // read minor and major version, must both exist instance.ConfigurationVersion = ConfigurationVersion.Decode(inputStream); } else { throw new Exception("DataSetMessageHeader: Minor Configuration Version not present."); } } else { if (instance.Flags1.Flags1.HasFlag(DataSetFlags1Enum.ConfigurationVersionMinorVersion)) { throw new Exception("DataSetMessageHeader: Major Configuration Version not present."); } } return(true); }