DMObject.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Collections.Generic;
  3. namespace InABox.DigitalMatter
  4. {
  5. public interface IDMObject
  6. {
  7. void Decode(byte[] data);
  8. byte[] EncodeArray();
  9. }
  10. public abstract class DMObject : IDMObject
  11. {
  12. public void Decode(IDMReadBuffer readBuffer)
  13. {
  14. BeforeDecode(readBuffer);
  15. DoDecode(readBuffer);
  16. AfterDecode(readBuffer);
  17. }
  18. public void Decode(List<byte> data) => Decode(new DMListReadBuffer(data));
  19. public void Decode(byte[] data) => Decode(new DMArrayReadBuffer(data));
  20. public byte[] EncodeArray() => EncodeList().ToArray();
  21. public void Encode(IDMWriteBuffer buffer)
  22. {
  23. BeforeEncode(buffer);
  24. DoEncode(buffer);
  25. AfterEncode(buffer);
  26. }
  27. public List<byte> EncodeList()
  28. {
  29. var buffer = new DMListWriteBuffer(new List<byte>());
  30. Encode(buffer);
  31. return buffer.Buffer;
  32. }
  33. protected uint SecondsSince2013UTC()
  34. {
  35. var epoch = new DateTime(2013, 1, 1);
  36. var utc = DateTime.Now.ToUniversalTime();
  37. var elapsed = utc - epoch;
  38. return (uint)elapsed.TotalSeconds;
  39. }
  40. public DateTime TimeStampToDateTime(uint timestamp)
  41. {
  42. return new DateTime(2013, 1, 1).AddSeconds(timestamp).ToLocalTime();
  43. }
  44. protected virtual void BeforeEncode(IDMWriteBuffer buffer)
  45. {
  46. }
  47. protected abstract void DoEncode(IDMWriteBuffer buffer);
  48. protected virtual void AfterEncode(IDMWriteBuffer buffer)
  49. {
  50. }
  51. protected virtual void BeforeDecode(IDMReadBuffer buffer)
  52. {
  53. }
  54. protected abstract void DoDecode(IDMReadBuffer buffer);
  55. protected virtual void AfterDecode(IDMReadBuffer buffer)
  56. {
  57. }
  58. }
  59. }