Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
        }