public int Decode(byte[] bytes, int offset, int size)
        {
            int num2;

            DecoderHelper.ValidateSize(size);
            try
            {
                int num;
                FramingRecordType type;
                switch (this.currentState)
                {
                case State.ReadingViaRecord:
                    type = (FramingRecordType)bytes[offset];
                    base.ValidateRecordType(FramingRecordType.Via, type);
                    num = 1;
                    this.viaDecoder.Reset();
                    this.currentState = State.ReadingViaString;
                    goto Label_0148;

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

                case State.ReadingContentTypeRecord:
                    type = (FramingRecordType)bytes[offset];
                    if (type != FramingRecordType.KnownEncoding)
                    {
                        break;
                    }
                    num = 1;
                    this.currentState = State.ReadingContentTypeByte;
                    goto Label_0148;

                case State.ReadingContentTypeString:
                    num = this.contentTypeDecoder.Decode(bytes, offset, size);
                    if (this.contentTypeDecoder.IsValueDecoded)
                    {
                        this.currentState = State.Start;
                        this.contentType  = this.contentTypeDecoder.Value;
                    }
                    goto Label_0148;

                case State.ReadingContentTypeByte:
                    this.contentType = ContentTypeStringDecoder.GetString((FramingEncodingType)bytes[offset]);
                    num = 1;
                    this.currentState = State.Start;
                    goto Label_0148;

                case State.Start:
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(new InvalidDataException(System.ServiceModel.SR.GetString("FramingAtEnd"))));

                default:
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(new InvalidDataException(System.ServiceModel.SR.GetString("InvalidDecoderStateMachine"))));
                }
                base.ValidateRecordType(FramingRecordType.ExtensibleEncoding, type);
                num = 1;
                this.contentTypeDecoder.Reset();
                this.currentState = State.ReadingContentTypeString;
Label_0148:
                base.StreamPosition += num;
                num2 = num;
            }
            catch (InvalidDataException exception)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(exception));
            }
            return(num2);
        }
 public ServerSingletonDecoder(long streamPosition, int maxViaLength, int maxContentTypeLength) : base(streamPosition)
 {
     this.viaDecoder = new ViaStringDecoder(maxViaLength);
     this.contentTypeDecoder = new ContentTypeStringDecoder(maxContentTypeLength);
     this.currentState = State.ReadingViaRecord;
 }
 public ServerSingletonSizedDecoder(long streamPosition, int maxViaLength, int maxContentTypeLength) : base(streamPosition)
 {
     this.viaDecoder         = new ViaStringDecoder(maxViaLength);
     this.contentTypeDecoder = new ContentTypeStringDecoder(maxContentTypeLength);
     this.currentState       = State.ReadingViaRecord;
 }
コード例 #4
0
        public int Decode(byte[] bytes, int offset, int size)
        {
            int num2;

            DecoderHelper.ValidateSize(size);
            try
            {
                int envelopeBytesNeeded;
                FramingRecordType type;
                switch (this.currentState)
                {
                case State.ReadingViaRecord:
                    type = (FramingRecordType)bytes[offset];
                    base.ValidateRecordType(FramingRecordType.Via, type);
                    envelopeBytesNeeded = 1;
                    this.viaDecoder.Reset();
                    this.currentState = State.ReadingViaString;
                    goto Label_0312;

                case State.ReadingViaString:
                    envelopeBytesNeeded = this.viaDecoder.Decode(bytes, offset, size);
                    if (this.viaDecoder.IsValueDecoded)
                    {
                        this.currentState = State.ReadingContentTypeRecord;
                    }
                    goto Label_0312;

                case State.ReadingContentTypeRecord:
                    type = (FramingRecordType)bytes[offset];
                    if (type != FramingRecordType.KnownEncoding)
                    {
                        break;
                    }
                    envelopeBytesNeeded = 1;
                    this.currentState   = State.ReadingContentTypeByte;
                    goto Label_0312;

                case State.ReadingContentTypeString:
                    envelopeBytesNeeded = this.contentTypeDecoder.Decode(bytes, offset, size);
                    if (this.contentTypeDecoder.IsValueDecoded)
                    {
                        this.currentState = State.PreUpgradeStart;
                        this.contentType  = this.contentTypeDecoder.Value;
                    }
                    goto Label_0312;

                case State.ReadingContentTypeByte:
                    this.contentType    = ContentTypeStringDecoder.GetString((FramingEncodingType)bytes[offset]);
                    envelopeBytesNeeded = 1;
                    this.currentState   = State.PreUpgradeStart;
                    goto Label_0312;

                case State.PreUpgradeStart:
                    envelopeBytesNeeded = 0;
                    this.currentState   = State.ReadingUpgradeRecord;
                    goto Label_0312;

                case State.ReadingUpgradeRecord:
                    type = (FramingRecordType)bytes[offset];
                    if (type != FramingRecordType.UpgradeRequest)
                    {
                        goto Label_0171;
                    }
                    envelopeBytesNeeded = 1;
                    this.contentTypeDecoder.Reset();
                    this.currentState = State.ReadingUpgradeString;
                    goto Label_0312;

                case State.ReadingUpgradeString:
                    envelopeBytesNeeded = this.contentTypeDecoder.Decode(bytes, offset, size);
                    if (this.contentTypeDecoder.IsValueDecoded)
                    {
                        this.currentState = State.UpgradeRequest;
                        this.upgrade      = this.contentTypeDecoder.Value;
                    }
                    goto Label_0312;

                case State.UpgradeRequest:
                    envelopeBytesNeeded = 0;
                    this.currentState   = State.ReadingUpgradeRecord;
                    goto Label_0312;

                case State.ReadingPreambleEndRecord:
                    type = (FramingRecordType)bytes[offset];
                    base.ValidateRecordType(FramingRecordType.PreambleEnd, type);
                    envelopeBytesNeeded = 1;
                    this.currentState   = State.Start;
                    goto Label_0312;

                case State.Start:
                    envelopeBytesNeeded = 0;
                    this.currentState   = State.ReadingEndRecord;
                    goto Label_0312;

                case State.ReadingEnvelopeRecord:
                    base.ValidateRecordType(FramingRecordType.SizedEnvelope, (FramingRecordType)bytes[offset]);
                    envelopeBytesNeeded = 1;
                    this.currentState   = State.ReadingEnvelopeSize;
                    this.sizeDecoder.Reset();
                    goto Label_0312;

                case State.ReadingEnvelopeSize:
                    envelopeBytesNeeded = this.sizeDecoder.Decode(bytes, offset, size);
                    if (this.sizeDecoder.IsValueDecoded)
                    {
                        this.currentState        = State.EnvelopeStart;
                        this.envelopeSize        = this.sizeDecoder.Value;
                        this.envelopeBytesNeeded = this.envelopeSize;
                    }
                    goto Label_0312;

                case State.EnvelopeStart:
                    envelopeBytesNeeded = 0;
                    this.currentState   = State.ReadingEnvelopeBytes;
                    goto Label_0312;

                case State.ReadingEnvelopeBytes:
                    envelopeBytesNeeded = size;
                    if (envelopeBytesNeeded > this.envelopeBytesNeeded)
                    {
                        envelopeBytesNeeded = this.envelopeBytesNeeded;
                    }
                    this.envelopeBytesNeeded -= envelopeBytesNeeded;
                    if (this.envelopeBytesNeeded == 0)
                    {
                        this.currentState = State.EnvelopeEnd;
                    }
                    goto Label_0312;

                case State.EnvelopeEnd:
                    envelopeBytesNeeded = 0;
                    this.currentState   = State.ReadingEndRecord;
                    goto Label_0312;

                case State.ReadingEndRecord:
                    type = (FramingRecordType)bytes[offset];
                    if (type != FramingRecordType.End)
                    {
                        goto Label_020C;
                    }
                    envelopeBytesNeeded = 1;
                    this.currentState   = State.End;
                    goto Label_0312;

                case State.End:
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(new InvalidDataException(System.ServiceModel.SR.GetString("FramingAtEnd"))));

                default:
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(new InvalidDataException(System.ServiceModel.SR.GetString("InvalidDecoderStateMachine"))));
                }
                base.ValidateRecordType(FramingRecordType.ExtensibleEncoding, type);
                envelopeBytesNeeded = 1;
                this.contentTypeDecoder.Reset();
                this.currentState = State.ReadingContentTypeString;
                goto Label_0312;
Label_0171:
                envelopeBytesNeeded = 0;
                this.currentState   = State.ReadingPreambleEndRecord;
                goto Label_0312;
Label_020C:
                envelopeBytesNeeded = 0;
                this.currentState   = State.ReadingEnvelopeRecord;
Label_0312:
                base.StreamPosition += envelopeBytesNeeded;
                num2 = envelopeBytesNeeded;
            }
            catch (InvalidDataException exception)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(base.CreateException(exception));
            }
            return(num2);
        }