public int Decode(byte[] bytes, int offset, int size)
        {
            int num;
            FramingRecordType framingRecordType;
            int num1;

            DecoderHelper.ValidateSize(size);
            try
            {
                switch (this.currentState)
                {
                case ServerSingletonDecoder.State.ReadingViaRecord:
                {
                    framingRecordType = (FramingRecordType)bytes[offset];
                    base.ValidateRecordType(FramingRecordType.Via, framingRecordType);
                    num = 1;
                    this.viaDecoder.Reset();
                    this.currentState = ServerSingletonDecoder.State.ReadingViaString;
                    break;
                }

                case ServerSingletonDecoder.State.ReadingViaString:
                {
                    num = this.viaDecoder.Decode(bytes, offset, size);
                    if (!this.viaDecoder.IsValueDecoded)
                    {
                        break;
                    }
                    this.currentState = ServerSingletonDecoder.State.ReadingContentTypeRecord;
                    break;
                }

                case ServerSingletonDecoder.State.ReadingContentTypeRecord:
                {
                    framingRecordType = (FramingRecordType)bytes[offset];
                    if (framingRecordType != FramingRecordType.KnownEncoding)
                    {
                        base.ValidateRecordType(FramingRecordType.ExtensibleEncoding, framingRecordType);
                        num = 1;
                        this.contentTypeDecoder.Reset();
                        this.currentState = ServerSingletonDecoder.State.ReadingContentTypeString;
                        break;
                    }
                    else
                    {
                        num = 1;
                        this.currentState = ServerSingletonDecoder.State.ReadingContentTypeByte;
                        break;
                    }
                }

                case ServerSingletonDecoder.State.ReadingContentTypeString:
                {
                    num = this.contentTypeDecoder.Decode(bytes, offset, size);
                    if (!this.contentTypeDecoder.IsValueDecoded)
                    {
                        break;
                    }
                    this.currentState = ServerSingletonDecoder.State.PreUpgradeStart;
                    this.contentType  = this.contentTypeDecoder.Value;
                    break;
                }

                case ServerSingletonDecoder.State.ReadingContentTypeByte:
                {
                    this.contentType = ContentTypeStringDecoder.GetString((FramingEncodingType)bytes[offset]);
                    num = 1;
                    this.currentState = ServerSingletonDecoder.State.PreUpgradeStart;
                    break;
                }

                case ServerSingletonDecoder.State.PreUpgradeStart:
                {
                    num = 0;
                    this.currentState = ServerSingletonDecoder.State.ReadingUpgradeRecord;
                    break;
                }

                case ServerSingletonDecoder.State.ReadingUpgradeRecord:
                {
                    framingRecordType = (FramingRecordType)bytes[offset];
                    if (framingRecordType != FramingRecordType.UpgradeRequest)
                    {
                        num = 0;
                        this.currentState = ServerSingletonDecoder.State.ReadingPreambleEndRecord;
                        break;
                    }
                    else
                    {
                        num = 1;
                        this.contentTypeDecoder.Reset();
                        this.currentState = ServerSingletonDecoder.State.ReadingUpgradeString;
                        break;
                    }
                }

                case ServerSingletonDecoder.State.ReadingUpgradeString:
                {
                    num = this.contentTypeDecoder.Decode(bytes, offset, size);
                    if (!this.contentTypeDecoder.IsValueDecoded)
                    {
                        break;
                    }
                    this.currentState = ServerSingletonDecoder.State.UpgradeRequest;
                    this.upgrade      = this.contentTypeDecoder.Value;
                    break;
                }

                case ServerSingletonDecoder.State.UpgradeRequest:
                {
                    num = 0;
                    this.currentState = ServerSingletonDecoder.State.ReadingUpgradeRecord;
                    break;
                }

                case ServerSingletonDecoder.State.ReadingPreambleEndRecord:
                {
                    framingRecordType = (FramingRecordType)bytes[offset];
                    base.ValidateRecordType(FramingRecordType.PreambleEnd, framingRecordType);
                    num = 1;
                    this.currentState = ServerSingletonDecoder.State.Start;
                    break;
                }

                case ServerSingletonDecoder.State.Start:
                {
                    num = 0;
                    this.currentState = ServerSingletonDecoder.State.ReadingEnvelopeRecord;
                    break;
                }

                case ServerSingletonDecoder.State.ReadingEnvelopeRecord:
                {
                    base.ValidateRecordType(FramingRecordType.UnsizedEnvelope, (FramingRecordType)bytes[offset]);
                    num = 1;
                    this.currentState = ServerSingletonDecoder.State.EnvelopeStart;
                    break;
                }

                case ServerSingletonDecoder.State.EnvelopeStart:
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(new InvalidDataException(Microsoft.ServiceBus.SR.GetString(Resources.FramingAtEnd, new object[0]))));
                }

                default:
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(new InvalidDataException(Microsoft.ServiceBus.SR.GetString(Resources.InvalidDecoderStateMachine, new object[0]))));
                }
                }
                ServerSingletonDecoder streamPosition = this;
                streamPosition.StreamPosition = streamPosition.StreamPosition + (long)num;
                num1 = num;
            }
            catch (InvalidDataException invalidDataException)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(invalidDataException));
            }
            return(num1);
        }
 public ServerSingletonDecoder(long streamPosition, int maxViaLength, int maxContentTypeLength) : base(streamPosition)
 {
     this.viaDecoder         = new ViaStringDecoder(maxViaLength);
     this.contentTypeDecoder = new ContentTypeStringDecoder(maxContentTypeLength);
     this.currentState       = ServerSingletonDecoder.State.ReadingViaRecord;
 }