Beispiel #1
0
        /// <summary>
        /// Produces a MessageReader with a new buffer. This MessageReader should be recycled.
        /// </summary>
        public MessageReader ReadMessageAsNewBuffer()
        {
            if (this.BytesRemaining < 3)
            {
                throw new InvalidDataException($"ReadMessage header is longer than message length: 3 of {this.BytesRemaining}");
            }

            var len = this.ReadUInt16();
            var tag = this.ReadByte();

            if (this.BytesRemaining < len)
            {
                throw new InvalidDataException($"Message Length at Position {this.readHead} is longer than message length: {len} of {this.BytesRemaining}");
            }

            var output = MessageReader.GetSized(len);

            output.Parent = this;
            Array.Copy(this.Buffer, this.readHead, output.Buffer, 0, len);

            output.Length = len;
            output.Tag    = tag;

            this.Position += output.Length;
            return(output);
        }
        public static MessageReader CopyMessageIntoParent(MessageReader source)
        {
            var output = MessageReader.GetSized(source.Length + 3);

            System.Buffer.BlockCopy(source.Buffer, source.Offset - 3, output.Buffer, 0, source.Length + 3);

            output.Offset   = 0;
            output.Position = 0;
            output.Length   = source.Length + 3;

            return(output);
        }
Beispiel #3
0
        public static MessageReader Get(MessageReader source)
        {
            var output = MessageReader.GetSized(source.Buffer.Length);

            System.Buffer.BlockCopy(source.Buffer, 0, output.Buffer, 0, source.Buffer.Length);

            output.Offset = source.Offset;

            output._position = source._position;
            output.readHead  = source.readHead;

            output.Length = source.Length;
            output.Tag    = source.Tag;

            return(output);
        }
Beispiel #4
0
        public void RemoveMessage(MessageReader reader)
        {
            var temp = MessageReader.GetSized(reader.Buffer.Length);

            try
            {
                var headerOffset = reader.Offset - 3;
                var endOfMessage = reader.Offset + reader.Length;
                var len          = reader.Buffer.Length - endOfMessage;

                Array.Copy(reader.Buffer, endOfMessage, temp.Buffer, 0, len);
                Array.Copy(temp.Buffer, 0, this.Buffer, headerOffset, len);

                this.AdjustLength(reader.Offset, reader.Length + 3);
            }
            finally
            {
                temp.Recycle();
            }
        }
Beispiel #5
0
        public void InsertMessage(MessageReader reader, MessageWriter writer)
        {
            var temp = MessageReader.GetSized(reader.Buffer.Length);

            try
            {
                var headerOffset   = reader.Offset - 3;
                var startOfMessage = reader.Offset;
                var len            = reader.Buffer.Length - startOfMessage;
                int writerOffset   = 3;
                switch (writer.SendOption)
                {
                case SendOption.Reliable:
                    writerOffset = 3;
                    break;

                case SendOption.None:
                    writerOffset = 1;
                    break;
                }

                //store the original buffer in temp
                Array.Copy(reader.Buffer, headerOffset, temp.Buffer, 0, len);

                //put the contents of writer in at headerOffset
                Array.Copy(writer.Buffer, writerOffset, this.Buffer, headerOffset, writer.Length - writerOffset);

                //put the original buffer in after that
                Array.Copy(temp.Buffer, 0, this.Buffer, headerOffset + (writer.Length - writerOffset), len - writer.Length);

                this.AdjustLength(-1 * reader.Offset, -1 * (writer.Length - writerOffset));
            }
            finally
            {
                temp.Recycle();
            }
        }