IFilter.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. namespace Universal.IO;
  2. public class Data(byte[] rawData, Connection? connection = null, DateTime? dateTime = default)
  3. {
  4. public byte[] RawData { get; } = rawData;
  5. public Connection? Connection { get; } = connection;
  6. public DateTime DateTime { get; internal set; } = dateTime is null ? DateTime.Now : dateTime.Value;
  7. }
  8. public interface ISender
  9. {
  10. ISender? NextSender { get; set; }
  11. bool Send(Data data);
  12. }
  13. public interface IReceiver
  14. {
  15. IReceiver? PrevReceiver { get; set; }
  16. bool Receive(Data data);
  17. }
  18. public interface IConnect
  19. {
  20. IConnect? PrevConnector { get; set; }
  21. void Connected(Connection connection);
  22. void Disconnected(Connection connection);
  23. }
  24. public interface IFilter : ISender, IReceiver, IConnect
  25. {
  26. public static IFilter operator >>(IFilter filter1, IFilter filter2)
  27. {
  28. filter1.NextSender = filter2;
  29. filter2.PrevReceiver = filter1;
  30. filter2.PrevConnector = filter1;
  31. return filter2;
  32. }
  33. bool IReceiver.Receive(Data data)
  34. {
  35. return this.PrevReceiver?.Receive(data) == true;
  36. }
  37. bool ISender.Send(Data data)
  38. {
  39. return this.NextSender?.Send(data) == true;
  40. }
  41. void IConnect.Connected(Connection connection)
  42. {
  43. this.PrevConnector?.Connected(connection);
  44. }
  45. void IConnect.Disconnected(Connection connection)
  46. {
  47. this.PrevConnector?.Disconnected(connection);
  48. }
  49. }
  50. public abstract class BaseFilter : IFilter
  51. {
  52. public static BaseFilter operator >>(BaseFilter filter1, BaseFilter filter2)
  53. {
  54. filter1.NextSender = filter2;
  55. filter2.PrevReceiver = filter1;
  56. filter2.PrevConnector = filter1;
  57. return filter2;
  58. }
  59. public ISender? NextSender { get; set; }
  60. public IReceiver? PrevReceiver { get; set; }
  61. public IConnect? PrevConnector { get; set; }
  62. public virtual bool Receive(Data data)
  63. {
  64. return this.PrevReceiver?.Receive(data) == true;
  65. }
  66. public virtual bool Send(Data data)
  67. {
  68. return this.NextSender?.Send(data) == true;
  69. }
  70. public virtual void Connected(Connection connection)
  71. {
  72. this.PrevConnector?.Connected(connection);
  73. }
  74. public virtual void Disconnected(Connection connection)
  75. {
  76. this.PrevConnector?.Disconnected(connection);
  77. }
  78. }