1 using System.Collections.Generic;
2 using System.Collections.Immutable;
9 private readonly Dictionary<ushort, MessageFragment[]> partialMessages =
new Dictionary<ushort, MessageFragment[]>();
13 if (!partialMessages.ContainsKey(fragment.FragmentId.MessageId))
15 partialMessages[fragment.FragmentId.MessageId] =
new MessageFragment[fragment.FragmentId.FragmentCount];
17 else if (partialMessages[fragment.FragmentId.MessageId].Length != fragment.FragmentId.FragmentCount)
19 DebugConsole.AddWarning($
"Got a fragment for message {fragment.FragmentId.MessageId} " +
20 $
"with a mismatched expected fragment count");
24 var fragmentBuffer = partialMessages[fragment.FragmentId.MessageId];
25 if (fragment.FragmentId.FragmentIndex >= fragmentBuffer.Length)
27 DebugConsole.AddWarning($
"Got a fragment for message {fragment.FragmentId.MessageId} " +
28 $
"with an index greater than or equal to the expected fragment count ({fragment.FragmentId.FragmentIndex} >= {fragmentBuffer.Length})");
32 fragmentBuffer[fragment.FragmentId.FragmentIndex] = fragment;
33 if (fragmentBuffer.All(f => !f.Data.IsDefault && f.FragmentId.MessageId == fragment.FragmentId.MessageId))
35 partialMessages.Remove(fragment.FragmentId.MessageId);
36 return Option.Some(fragmentBuffer.SelectMany(f => f.Data).ToImmutableArray());
Option< ImmutableArray< byte > > ProcessIncomingFragment(MessageFragment fragment)