コード例 #1
0
        public int Decode(byte[] bytes, int offset, int size)
        {
            DecoderHelper.ValidateSize(size);

            try
            {
                int bytesConsumed;
                switch (_currentState)
                {
                case State.ReadingEnvelopeChunkSize:
                    bytesConsumed = _sizeDecoder.Decode(bytes, offset, size);
                    if (_sizeDecoder.IsValueDecoded)
                    {
                        _chunkSize = _sizeDecoder.Value;
                        _sizeDecoder.Reset();

                        if (_chunkSize == 0)
                        {
                            _currentState = State.EnvelopeEnd;
                        }
                        else
                        {
                            _currentState     = State.ChunkStart;
                            _chunkBytesNeeded = _chunkSize;
                        }
                    }
                    break;

                case State.ChunkStart:
                    bytesConsumed = 0;
                    _currentState = State.ReadingEnvelopeBytes;
                    break;

                case State.ReadingEnvelopeBytes:
                    bytesConsumed = size;
                    if (bytesConsumed > _chunkBytesNeeded)
                    {
                        bytesConsumed = _chunkBytesNeeded;
                    }
                    _chunkBytesNeeded -= bytesConsumed;
                    if (_chunkBytesNeeded == 0)
                    {
                        _currentState = State.ChunkEnd;
                    }
                    break;

                case State.ChunkEnd:
                    bytesConsumed = 0;
                    _currentState = State.ReadingEnvelopeChunkSize;
                    break;

                case State.EnvelopeEnd:
                    ValidateRecordType(FramingRecordType.End, (FramingRecordType)bytes[offset]);
                    bytesConsumed = 1;
                    _currentState = State.End;
                    break;

                case State.End:
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                              CreateException(new InvalidDataException(SR.FramingAtEnd)));

                default:
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                              CreateException(new InvalidDataException(SR.InvalidDecoderStateMachine)));
                }

                StreamPosition += bytesConsumed;
                return(bytesConsumed);
            }
            catch (InvalidDataException e)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateException(e));
            }
        }
コード例 #2
0
 public void Reset()
 {
     _currentState = State.ReadingSize;
     _sizeDecoder.Reset();
 }