From 50236c63093e8bcd6749ba34fb43c0bbedfea970 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Wed, 19 Feb 2025 18:51:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20EventWaitHandle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mROA/Abstract/IInteractionModule.cs | 5 ++- mROA/Implementation/NetworkMessage.cs | 1 + .../NextGenerationInteractionModule.cs | 40 ++++++++++++++----- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/mROA/Abstract/IInteractionModule.cs b/mROA/Abstract/IInteractionModule.cs index cb1072e..83f6ee5 100644 --- a/mROA/Abstract/IInteractionModule.cs +++ b/mROA/Abstract/IInteractionModule.cs @@ -6,9 +6,12 @@ public interface INextGenerationInteractionModule : IInjectableModule { int ConnectionId { get; } public Stream? BaseStream { get; set; } + NetworkMessage[] UnhandledMessages { get; } + NetworkMessage LastMessage { get; } + EventWaitHandle CurrentReceivingHandle { get; } + void StartInfiniteReceiving(); Task GetNextMessageReceiving(); Task PostMessage(NetworkMessage message); void HandleMessage(NetworkMessage message); - NetworkMessage[] UnhandledMessages { get; } NetworkMessage? FirstByFilter(Predicate predicate); } \ No newline at end of file diff --git a/mROA/Implementation/NetworkMessage.cs b/mROA/Implementation/NetworkMessage.cs index 9b524f8..11f8035 100644 --- a/mROA/Implementation/NetworkMessage.cs +++ b/mROA/Implementation/NetworkMessage.cs @@ -5,6 +5,7 @@ namespace mROA.Implementation; public class NetworkMessage { + public static readonly NetworkMessage Null = new() {SchemaId = MessageType.Unknown, Id = Guid.Empty, Data = []}; public Guid Id { get; init; } [JsonConverter(typeof(JsonStringEnumConverter))] public MessageType SchemaId { get; init; } diff --git a/mROA/Implementation/NextGenerationInteractionModule.cs b/mROA/Implementation/NextGenerationInteractionModule.cs index 0036eda..e96ed15 100644 --- a/mROA/Implementation/NextGenerationInteractionModule.cs +++ b/mROA/Implementation/NextGenerationInteractionModule.cs @@ -11,7 +11,9 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule private const int BufferSize = ushort.MaxValue; private readonly Memory _buffer = new byte[BufferSize]; private readonly List _messageBuffer = new (128); - + public NetworkMessage[] UnhandledMessages => _messageBuffer.ToArray(); + public NetworkMessage LastMessage { get; private set; } = NetworkMessage.Null; + public EventWaitHandle CurrentReceivingHandle { get; private set; } = new(false, EventResetMode.ManualReset); public void Inject(T dependency) { @@ -27,6 +29,19 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule } + public async void StartInfiniteReceiving() + { + while (true) + { + var message = ReceiveMessage(); + LastMessage = message; + CurrentReceivingHandle.Set(); + CurrentReceivingHandle = new EventWaitHandle(false, EventResetMode.ManualReset); + } + } + + + public Task GetNextMessageReceiving() { if (_currentReceiving != null) return _currentReceiving; @@ -56,7 +71,6 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule _messageBuffer.Remove(message); } - public NetworkMessage[] UnhandledMessages => _messageBuffer.ToArray(); public NetworkMessage? FirstByFilter(Predicate predicate) { return _messageBuffer.FirstOrDefault(m => predicate(m)); @@ -71,17 +85,21 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule throw new NullReferenceException("Serialization toolkit is null"); - // Console.WriteLine("Receiving message"); - var len = BitConverter.ToUInt16([(byte)BaseStream.ReadByte(), (byte)BaseStream.ReadByte()]); - var localSpan = _buffer.Span.Slice(0, len); - BaseStream.ReadExactly(localSpan); - - // Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len])); - - var message = _serialization.Deserialize(localSpan); - _messageBuffer.Add(message!); + var message = ReceiveMessage(); + + _messageBuffer.Add(message); _currentReceiving = Task.Run(GetNextMessage); return message!; } + + private NetworkMessage ReceiveMessage() + { + var len = BitConverter.ToUInt16([(byte)BaseStream!.ReadByte(), (byte)BaseStream.ReadByte()]); + var localSpan = _buffer.Span.Slice(0, len); + BaseStream.ReadExactly(localSpan); + + var message = _serialization!.Deserialize(localSpan); + return message!; + } } \ No newline at end of file