From 3b1980b8f3fbfaee8f92d0db89e8124b189f3b3a Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 16 Oct 2016 10:22:10 +0000 Subject: [PATCH] * More strict behaviour of TStreamReader after close git-svn-id: trunk@34728 - --- packages/fcl-base/src/streamex.pp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/fcl-base/src/streamex.pp b/packages/fcl-base/src/streamex.pp index 96fad3e64b..756f089496 100644 --- a/packages/fcl-base/src/streamex.pp +++ b/packages/fcl-base/src/streamex.pp @@ -103,6 +103,7 @@ type private FBufferRead: Integer; FBufferPosition: Integer; + FClosed, FOwnsStream: Boolean; FStream: TStream; FBuffer: array of Byte; @@ -348,6 +349,7 @@ begin raise EArgumentException.CreateFmt(SParamIsNil, ['AStream']); FStream := AStream; FOwnsStream := AOwnsStream; + FClosed:=False; if ABufferSize >= MIN_BUFFER_SIZE then SetLength(FBuffer, ABufferSize) else @@ -367,9 +369,17 @@ end; procedure TStreamReader.FillBuffer; begin - FBufferRead := FStream.Read(FBuffer[0], Pred(Length(FBuffer))); - FBuffer[FBufferRead] := 0; - FBufferPosition := 0; + if FClosed then + begin + FBufferRead:=0; + FBufferPosition:=0; + end + else + begin + FBufferRead := FStream.Read(FBuffer[0], Pred(Length(FBuffer))); + FBuffer[FBufferRead] := 0; + FBufferPosition := 0; + end; end; procedure TStreamReader.Reset; @@ -383,15 +393,13 @@ end; procedure TStreamReader.Close; begin if FOwnsStream then - begin - FStream.Free; - FStream := nil; - end; + FreeAndNil(FStream); + FClosed:=True; end; function TStreamReader.IsEof: Boolean; begin - if not Assigned(FStream) then + if FClosed or not Assigned(FStream) then Exit(True); Result := FBufferPosition >= FBufferRead; if Result then @@ -408,6 +416,7 @@ var begin VPosition := FBufferPosition; SetLength(AString, 0); + if FClosed then exit; repeat VPByte := @FBuffer[FBufferPosition]; while (FBufferPosition < FBufferRead) and not (VPByte^ in [10, 13]) do