public void ReconstructMessagePage(BMSByte page, EndPoint sender) { Sender = sender; if (MessageReconstructed) { return; } if (page.Size == 0) { throw new ArgumentException($"The input page buffer had an invalid size of 0"); } var pageNumber = page.GetBasicType <int>(); var totalSize = page.GetBasicType <int>(); if (page.Size == 0) { throw new ArgumentException($"The input page buffer had an invalid size of 0"); } if (page.Size + page.StartPointer == totalSize) { MessageBuffer.Append(page); MessageReconstructed = true; } else { if (_pages == null) { double actualSize = page.StartPointer + page.Size; MessageBuffer.SetArraySize(totalSize); int count = (int)System.Math.Ceiling(totalSize / actualSize); _pages = new BMSByte[count]; } if (_pages[pageNumber] == null) { _pages[pageNumber] = _bufferPool.Get(page.Size); _pages[pageNumber].Clone(page); } if (IsDone()) { foreach (var p in _pages) { MessageBuffer.Append(p); _bufferPool.Release(p); } MessageReconstructed = true; } } }
public void SendMessage(IMessage message, ISocket sender, EndPoint receiver) { // TODO: Possibly use the message interface to get the size needed for this BMSByte buffer = _bufferPool.Get(128); ForgeSerializer.Instance.Serialize(GetMessageCode(message), buffer); if (message.Receipt != null) { ForgeSerializer.Instance.Serialize(message.Receipt, buffer); } else { ForgeSerializer.Instance.Serialize(false, buffer); } message.Serialize(buffer); IPaginatedMessage pm = _messageDestructor.BreakdownMessage(buffer); sender.Send(receiver, pm.Buffer); message.Sent(); _bufferPool.Release(buffer); }
public void Setup(BMSBytePool bufferPool, int id) { _bufferPool = bufferPool; MessageBuffer = _bufferPool.Get(1024); Id = id; }