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)); } }
public void Reset() { _currentState = State.ReadingSize; _sizeDecoder.Reset(); }