Esempio n. 1
0
        public bool DecodePacket <T>(uint id, out T packet, byte[] buffer)
        {
            var binary = new OseanBinary(buffer);

            try {
                packet = Activator.CreateInstance <T>();

                var fields = this._packets[id].Fields;

                for (var i = 0; i < fields.Count; ++i)
                {
                    var field = fields[i];

                    var fieldType     = fields[i].DataType;
                    var nextFieldType = i + 1 < fields.Count
                        ? fields[i + 1].DataType
                        : OseanDataType.None;

                    field.Field.SetValue(packet, this.ReadValue(binary, fieldType, nextFieldType));

                    if (fieldType == OseanDataType.Array)
                    {
                        ++i;
                    }
                }
            }
            catch {
                packet = default(T);
                return(false);
            }

            return(true);
        }
Esempio n. 2
0
        private object ReadValue(OseanBinary binary, OseanDataType type, OseanDataType arrayType)
        {
            return(type switch {
                OseanDataType.I8 => binary.ReadI8(),
                OseanDataType.I16 => binary.ReadI16(),
                OseanDataType.I32 => binary.ReadI32(),
                OseanDataType.I64 => binary.ReadI64(),

                OseanDataType.U8 => binary.ReadU8(),
                OseanDataType.U16 => binary.ReadU16(),
                OseanDataType.U32 => binary.ReadU32(),
                OseanDataType.U64 => binary.ReadU64(),

                OseanDataType.R32 => binary.ReadR32(),
                OseanDataType.R64 => binary.ReadR64(),

                OseanDataType.Boolean => binary.ReadU8() != 0,
                OseanDataType.String => binary.ReadString(),
                OseanDataType.WString => binary.ReadWString(),

                OseanDataType.Array => ((Func <Array>)(() => {
                    var array = Array.CreateInstance(this.TypeFromDataType(arrayType), binary.ReadI32());

                    for (var i = 0; i < array.Length; ++i)
                    {
                        array.SetValue(this.ReadValue(binary, arrayType, OseanDataType.None), i);
                    }

                    return array;
                }))(),

                _ => throw new InvalidOperationException("cannot read invalid type code!")
            });
Esempio n. 3
0
        public bool EncodePacket <T>(uint id, T packet, out byte[] buffer)
        {
            buffer = null;

            if (!this._packets.ContainsKey(id))
            {
                return(false);
            }

            var binary = new OseanBinary();

            try {
                var fields = this._packets[id].Fields;

                for (var i = 0; i < fields.Count; ++i)
                {
                    var field = fields[i];

                    var fieldType     = fields[i].DataType;
                    var nextFieldType = i + 1 < fields.Count
                        ? fields[i + 1].DataType
                        : OseanDataType.None;

                    this.WriteValue(binary, fieldType, nextFieldType, field.Field.GetValue(packet));

                    if (fieldType == OseanDataType.Array)
                    {
                        ++i;
                    }
                }
            }
            catch {
                return(false);
            }

            buffer = binary.Buffer();

            return(true);
        }