public ServerSessionDecoder(long streamPosition, int maxViaLength, int maxContentTypeLength) : base(streamPosition)
 {
     this.viaDecoder         = new ViaStringDecoder(maxViaLength);
     this.contentTypeDecoder = new ContentTypeStringDecoder(maxContentTypeLength);
     this.sizeDecoder        = new IntDecoder();
     this.currentState       = ServerSessionDecoder.State.ReadingViaRecord;
 }
        public int Decode(byte[] buffer, int offset, int size)
        {
            int num;

            DecoderHelper.ValidateSize(size);
            switch (this.currentState)
            {
            case StringDecoder.State.ReadingSize:
            {
                num = this.sizeDecoder.Decode(buffer, offset, size);
                if (!this.sizeDecoder.IsValueDecoded)
                {
                    break;
                }
                this.encodedSize = this.sizeDecoder.Value;
                if (this.encodedSize > this.sizeQuota)
                {
                    Exception exception = this.OnSizeQuotaExceeded(this.encodedSize);
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception);
                }
                if (this.encodedBytes == null || (int)this.encodedBytes.Length < this.encodedSize)
                {
                    this.encodedBytes = DiagnosticUtility.Utility.AllocateByteArray(this.encodedSize);
                    this.@value       = null;
                }
                this.currentState = StringDecoder.State.ReadingBytes;
                this.bytesNeeded  = this.encodedSize;
                break;
            }

            case StringDecoder.State.ReadingBytes:
            {
                if (this.@value == null || this.valueLengthInBytes != this.encodedSize || this.bytesNeeded != this.encodedSize || size < this.encodedSize || !StringDecoder.CompareBuffers(this.encodedBytes, buffer, offset))
                {
                    num = this.bytesNeeded;
                    if (size < this.bytesNeeded)
                    {
                        num = size;
                    }
                    Buffer.BlockCopy(buffer, offset, this.encodedBytes, this.encodedSize - this.bytesNeeded, num);
                    StringDecoder stringDecoder = this;
                    stringDecoder.bytesNeeded = stringDecoder.bytesNeeded - num;
                    if (this.bytesNeeded != 0)
                    {
                        break;
                    }
                    this.@value             = Encoding.UTF8.GetString(this.encodedBytes, 0, this.encodedSize);
                    this.valueLengthInBytes = this.encodedSize;
                    this.OnComplete(this.@value);
                    break;
                }
                else
                {
                    num = this.bytesNeeded;
                    this.OnComplete(this.@value);
                    break;
                }
            }

            default:
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataException(Microsoft.ServiceBus.SR.GetString(Resources.InvalidDecoderStateMachine, new object[0])));
            }
            }
            return(num);
        }