DMRecord.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. namespace InABox.DigitalMatter
  4. {
  5. public class DMRecord : DMObject
  6. {
  7. private List<DMField> _fields = new();
  8. public ushort Length { get; set; }
  9. public uint Sequence { get; set; }
  10. public uint TimeStamp { get; set; }
  11. public byte LogReason { get; set; }
  12. public DMField[] Fields
  13. {
  14. get => _fields.ToArray();
  15. set => _fields = value.ToList();
  16. }
  17. protected override void DoDecode(IDMReadBuffer buffer)
  18. {
  19. //Logger.Send(LogType.Information, Thread.CurrentThread.ManagedThreadId.ToString(), String.Format("- Length: Size is [{0}]",BufferSize));
  20. Length = buffer.TakeUInt16();
  21. //Logger.Send(LogType.Information, Thread.CurrentThread.ManagedThreadId.ToString(), String.Format("- Sequence: Size is [{0}]", BufferSize));
  22. Sequence = buffer.TakeUInt32();
  23. //Logger.Send(LogType.Information, Thread.CurrentThread.ManagedThreadId.ToString(), String.Format("- TimeStamp: Size is [{0}]", BufferSize));
  24. TimeStamp = buffer.TakeUInt32();
  25. //Logger.Send(LogType.Information, Thread.CurrentThread.ManagedThreadId.ToString(), String.Format("- LogReason: Size is [{0}]", BufferSize));
  26. LogReason = buffer.TakeByte();
  27. _fields.Clear();
  28. int bytesTaken = 0;
  29. while (buffer.BufferSize > 0 && bytesTaken < Length)
  30. {
  31. var fieldid = buffer.PeekByte(0);
  32. var fieldsize = buffer.PeekByte(1) == 255 ? buffer.PeekUInt16(1) : buffer.PeekByte(1);
  33. //Logger.Send(LogType.Information, Thread.CurrentThread.ManagedThreadId.ToString(), String.Format("{0}: Field ID is [{1}] Size is [{2}]", _fields.Count, fieldid, fieldsize));
  34. var field = DMFactory.ParseField(new DMPartialReadBuffer(buffer, 0, buffer.BufferSize));
  35. _fields.Add(field);
  36. var bytesToTake = field.Length > 255 ? field.Length + 3 : field.Length + 2;
  37. buffer.TakeBytes(bytesToTake);
  38. bytesTaken += bytesToTake;
  39. }
  40. //Logger.Send(LogType.Information, Thread.CurrentThread.ManagedThreadId.ToString(), String.Format("- Done!: Size is [{0}]", BufferSize));
  41. }
  42. protected override void DoEncode(IDMWriteBuffer buffer)
  43. {
  44. buffer.AddUInt32(Sequence);
  45. buffer.AddUInt32(TimeStamp);
  46. buffer.AddByte(LogReason);
  47. foreach (var field in _fields)
  48. field.Encode(buffer);
  49. buffer.InsertUInt16(0, buffer.BufferSize);
  50. }
  51. public string Dump()
  52. {
  53. return $"[{string.Join(',', _fields.Select(x => x.Dump()))}]";
  54. }
  55. public IEnumerable<TField> GetFields<TField>() =>
  56. _fields.Where(x => x is TField).Cast<TField>();
  57. }
  58. }