/// <summary> /// Finalizes a completed fragmented message and invokes message received events. /// </summary> /// <param name="message">The message received.</param> void FinalizeFragmentedMessage(FragmentedMessage message) { IEnumerable <FragmentedMessage.Fragment> orderedFragments = message.received.OrderBy((x) => x.fragmentID); byte[] completeData = new byte[(orderedFragments.Count() - 1) * FragmentSize + orderedFragments.Last().data.Length]; int ptr = 0; foreach (FragmentedMessage.Fragment fragment in orderedFragments) { Buffer.BlockCopy(fragment.data, fragment.offset, completeData, ptr, fragment.data.Length - fragment.offset); ptr += fragment.data.Length - fragment.offset; } InvokeDataReceived(completeData, SendOption.FragmentedReliable); }
/// <summary> /// Gets a message from those we've begun receiving or adds a new one. /// </summary> /// <param name="messageId">The Id of the message to find.</param> /// <returns></returns> FragmentedMessage GetFragmentedMessage(ushort messageId) { lock (fragmentedMessagesReceived) { FragmentedMessage message; if (fragmentedMessagesReceived.ContainsKey(messageId)) { message = fragmentedMessagesReceived[messageId]; } else { message = new FragmentedMessage(); fragmentedMessagesReceived.Add(messageId, message); } return(message); } }