Beispiel #1
0
        /// <summary>
        /// Read a sequence command.
        /// </summary>
        /// <param name="br">The reader.</param>
        /// <param name="type">Type of sequence command.</param>
        /// <returns>The read sequence command.</returns>
        public static SequenceCommand Read(BinaryDataReader br, SequenceCommandType type = SequenceCommandType.Normal)
        {
            //Get sequence command.
            SequenceCommand s = null;

            switch (type)
            {
            case SequenceCommandType.Normal:
                s = NewFromType(br.ReadByte(), (int)br.Position);
                break;

            case SequenceCommandType.Extended:
                s = NewFromTypeExtended(br.ReadByte(), (int)br.Position);
                break;
            }

            //Read the objects.
            int count = 0;

            foreach (var t in s.SequenceParameterTypes)
            {
                //Switch the type.
                switch (t)
                {
                //U8.
                case SequenceParameterType.u8:
                    s.Parameters[count] = br.ReadByte();
                    break;

                //U16.
                case SequenceParameterType.u16:
                    s.Parameters[count] = br.ReadUInt16();
                    break;

                //U24.
                case SequenceParameterType.u24:
                    s.Parameters[count] = new UInt24(br);
                    break;

                //U32.
                case SequenceParameterType.u32:
                    s.Parameters[count] = br.ReadUInt32();
                    break;

                //U64.
                case SequenceParameterType.u64:
                    s.Parameters[count] = br.ReadUInt64();
                    break;

                //S8.
                case SequenceParameterType.s8:
                    s.Parameters[count] = br.ReadSByte();
                    break;

                //S16.
                case SequenceParameterType.s16:
                    s.Parameters[count] = br.ReadInt16();
                    break;

                //S32.
                case SequenceParameterType.s32:
                    s.Parameters[count] = br.ReadInt32();
                    break;

                //S64.
                case SequenceParameterType.s64:
                    s.Parameters[count] = br.ReadInt64();
                    break;

                //Boolean.
                case SequenceParameterType.boolean:
                    s.Parameters[count] = br.ReadBoolean();
                    break;

                //Variable length.
                case SequenceParameterType.VariableLength:
                    s.Parameters[count] = VariableLength.ReadVariableLength(br);
                    break;

                //Sequence command.
                case SequenceParameterType.SeqCommand:

                    //The type of sequence command embedded depends on the command type.
                    switch ((CommandType)s.Identifier)
                    {
                    //Extended.
                    case CommandType.Extended:
                        s.Parameters[count] = Read(br, SequenceCommandType.Extended);
                        break;

                    //Random.
                    case CommandType.Random:
                        s.Parameters[count] = NewFromType(br.ReadByte(), (int)br.Position);

                        //Extended.
                        if (((SequenceCommand)s.Parameters[count]).Identifier == (byte)CommandType.Extended)
                        {
                            //Read a new extended command.
                            ((SequenceCommand)s.Parameters[count]).Parameters[0] = NewFromTypeExtended(br.ReadByte(), (int)br.Position);

                            //Remove the last parameter of the sequence command.
                            ((SequenceCommand)((SequenceCommand)s.Parameters[count]).Parameters[0]).SequenceParameterTypes.RemoveAt(((SequenceCommand)((SequenceCommand)s.Parameters[count]).Parameters[0]).SequenceParameterTypes.Count - 1);

                            //Read the parameters.
                            ((SequenceCommand)((SequenceCommand)s.Parameters[count]).Parameters[0]).ReadPrefixParameters(br);
                        }

                        //Regular.
                        else
                        {
                            //Remove the last parameter, since it is replaced with the min and max.
                            ((SequenceCommand)s.Parameters[count]).SequenceParameterTypes.RemoveAt(((SequenceCommand)s.Parameters[count]).SequenceParameterTypes.Count - 1);
                            ((SequenceCommand)s.Parameters[count]).ReadPrefixParameters(br);
                        }
                        break;

                    //Variable.
                    case CommandType.Variable:
                        s.Parameters[count] = NewFromType(br.ReadByte(), (int)br.Position);

                        //Extended.
                        if (((SequenceCommand)s.Parameters[count]).Identifier == (byte)CommandType.Extended)
                        {
                            //Read a new extended command.
                            ((SequenceCommand)s.Parameters[count]).Parameters[0] = NewFromTypeExtended(br.ReadByte(), (int)br.Position);

                            //Remove the last parameter of the sequence command.
                            ((SequenceCommand)((SequenceCommand)s.Parameters[count]).Parameters[0]).SequenceParameterTypes.RemoveAt(((SequenceCommand)((SequenceCommand)s.Parameters[count]).Parameters[0]).SequenceParameterTypes.Count - 1);

                            //Read the parameters.
                            ((SequenceCommand)((SequenceCommand)s.Parameters[count]).Parameters[0]).ReadPrefixParameters(br);
                        }

                        //Regular.
                        else
                        {
                            //Remove the last parameter, since it is replaced with the min and max.
                            ((SequenceCommand)s.Parameters[count]).SequenceParameterTypes.RemoveAt(((SequenceCommand)s.Parameters[count]).SequenceParameterTypes.Count - 1);
                            ((SequenceCommand)s.Parameters[count]).ReadPrefixParameters(br);
                        }
                        break;

                    //Last resort.
                    default:
                        s.Parameters[count] = Read(br);
                        break;
                    }
                    break;
                }

                //Increase count.
                count++;
            }

            //Return the command.
            return(s);
        }
Beispiel #2
0
        /// <summary>
        /// Read parameters, but only for prefix commands.
        /// </summary>
        /// <param name="br">The reader</param>
        public void ReadPrefixParameters(BinaryDataReader br)
        {
            //Read the objects.
            int count = 0;

            foreach (var t in SequenceParameterTypes)
            {
                //Switch the type.
                switch (t)
                {
                //U8.
                case SequenceParameterType.u8:
                    Parameters[count] = br.ReadByte();
                    break;

                //U16.
                case SequenceParameterType.u16:
                    Parameters[count] = br.ReadUInt16();
                    break;

                //U24.
                case SequenceParameterType.u24:
                    Parameters[count] = new UInt24(br);
                    break;

                //U32.
                case SequenceParameterType.u32:
                    Parameters[count] = br.ReadUInt32();
                    break;

                //U64.
                case SequenceParameterType.u64:
                    Parameters[count] = br.ReadUInt64();
                    break;

                //S8.
                case SequenceParameterType.s8:
                    Parameters[count] = br.ReadSByte();
                    break;

                //S16.
                case SequenceParameterType.s16:
                    Parameters[count] = br.ReadInt16();
                    break;

                //S32.
                case SequenceParameterType.s32:
                    Parameters[count] = br.ReadInt32();
                    break;

                //S64.
                case SequenceParameterType.s64:
                    Parameters[count] = br.ReadInt64();
                    break;

                //Boolean.
                case SequenceParameterType.boolean:
                    Parameters[count] = br.ReadBoolean();
                    break;

                //Variable length.
                case SequenceParameterType.VariableLength:
                    Parameters[count] = VariableLength.ReadVariableLength(br);
                    break;

                //Sequence command.
                case SequenceParameterType.SeqCommand:
                    Parameters[count] = Read(br);
                    break;
                }

                //Increase count.
                count++;
            }
        }