| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | using System;using System.Collections.Generic;namespace InABox.DigitalMatter{    public interface IDMObject    {        void Decode(byte[] data);        byte[] EncodeArray();    }    public abstract class DMObject : IDMObject    {        public void Decode(IDMReadBuffer readBuffer)        {            BeforeDecode(readBuffer);            DoDecode(readBuffer);            AfterDecode(readBuffer);        }        public void Decode(List<byte> data) => Decode(new DMListReadBuffer(data));        public void Decode(byte[] data) => Decode(new DMArrayReadBuffer(data));        public byte[] EncodeArray() => EncodeList().ToArray();        public void Encode(IDMWriteBuffer buffer)        {            BeforeEncode(buffer);            DoEncode(buffer);            AfterEncode(buffer);        }        public List<byte> EncodeList()        {            var buffer = new DMListWriteBuffer(new List<byte>());            Encode(buffer);            return buffer.Buffer;        }        protected uint SecondsSince2013UTC()        {            var epoch = new DateTime(2013, 1, 1);            var utc = DateTime.Now.ToUniversalTime();            var elapsed = utc - epoch;            return (uint)elapsed.TotalSeconds;        }        public DateTime TimeStampToDateTime(uint timestamp)        {            return new DateTime(2013, 1, 1).AddSeconds(timestamp).ToLocalTime();        }        protected virtual void BeforeEncode(IDMWriteBuffer buffer)        {        }        protected abstract void DoEncode(IDMWriteBuffer buffer);        protected virtual void AfterEncode(IDMWriteBuffer buffer)        {        }        protected virtual void BeforeDecode(IDMReadBuffer buffer)        {        }        protected abstract void DoDecode(IDMReadBuffer buffer);        protected virtual void AfterDecode(IDMReadBuffer buffer)        {        }    }}
 |