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;
                }
            }
        }
Example #2
0
        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;
 }