mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-18 23:19:25 +02:00
+ TCustomZlibStream now descends from TOwnerStream
git-svn-id: trunk@3512 -
This commit is contained in:
parent
fea15be56f
commit
da32415fc9
@ -44,9 +44,8 @@ type
|
||||
ECompressionError = class(EZlibError);
|
||||
EDecompressionError = class(EZlibError);
|
||||
|
||||
TCustomZlibStream = class(TStream)
|
||||
TCustomZlibStream = class(TOwnerStream)
|
||||
private
|
||||
FStrm: TStream;
|
||||
FStrmPos: Integer;
|
||||
FOnProgress: TNotifyEvent;
|
||||
FZRec: TZStream;
|
||||
@ -82,7 +81,7 @@ type
|
||||
procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
|
||||
OutEstimate: Integer; var OutBuf: Pointer; var OutBytes: Integer);
|
||||
public
|
||||
constructor Create(Source: TStream);
|
||||
constructor Create(ASource: TStream);
|
||||
destructor Destroy; override;
|
||||
function Read(var Buffer; Count: Longint): Longint; override;
|
||||
function Write(const Buffer; Count: Longint): Longint; override;
|
||||
@ -200,8 +199,7 @@ end;
|
||||
|
||||
constructor TCustomZLibStream.Create(Strm: TStream);
|
||||
begin
|
||||
inherited Create;
|
||||
FStrm := Strm;
|
||||
inherited Create(Strm);
|
||||
FStrmPos := Strm.Position;
|
||||
end;
|
||||
|
||||
@ -230,16 +228,16 @@ begin
|
||||
FZRec.next_in := nil;
|
||||
FZRec.avail_in := 0;
|
||||
try
|
||||
if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
|
||||
if Source.Position <> FStrmPos then Source.Position := FStrmPos;
|
||||
while (CompressionCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
|
||||
and (FZRec.avail_out = 0) do
|
||||
begin
|
||||
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
|
||||
Source.WriteBuffer(FBuffer, sizeof(FBuffer));
|
||||
FZRec.next_out := @FBuffer;
|
||||
FZRec.avail_out := sizeof(FBuffer);
|
||||
end;
|
||||
if FZRec.avail_out < sizeof(FBuffer) then
|
||||
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
|
||||
Source.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
|
||||
finally
|
||||
deflateEnd(FZRec);
|
||||
end;
|
||||
@ -267,16 +265,16 @@ function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
|
||||
begin
|
||||
FZRec.next_in := @Buffer;
|
||||
FZRec.avail_in := Count;
|
||||
if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
|
||||
if Source.Position <> FStrmPos then Source.Position := FStrmPos;
|
||||
while (FZRec.avail_in > 0) do
|
||||
begin
|
||||
CompressionCheck(deflate(FZRec, 0));
|
||||
if FZRec.avail_out = 0 then
|
||||
begin
|
||||
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
|
||||
Source.WriteBuffer(FBuffer, sizeof(FBuffer));
|
||||
FZRec.next_out := @FBuffer;
|
||||
FZRec.avail_out := sizeof(FBuffer);
|
||||
FStrmPos := FStrm.Position;
|
||||
FStrmPos := Source.Position;
|
||||
Progress(Self);
|
||||
end;
|
||||
end;
|
||||
@ -305,9 +303,9 @@ end;
|
||||
|
||||
// TDecompressionStream
|
||||
|
||||
constructor TDecompressionStream.Create(Source: TStream);
|
||||
constructor TDecompressionStream.Create(ASource: TStream);
|
||||
begin
|
||||
inherited Create(Source);
|
||||
inherited Create(ASource);
|
||||
FZRec.next_in := @FBuffer;
|
||||
DecompressionCheck(inflateInit(FZRec));
|
||||
end;
|
||||
@ -332,19 +330,19 @@ function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
|
||||
begin
|
||||
FZRec.next_out := @Buffer;
|
||||
FZRec.avail_out := Count;
|
||||
if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
|
||||
if Source.Position <> FStrmPos then Source.Position := FStrmPos;
|
||||
while (FZRec.avail_out > 0) do
|
||||
begin
|
||||
if FZRec.avail_in = 0 then
|
||||
begin
|
||||
FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
|
||||
FZRec.avail_in := Source.Read(FBuffer, sizeof(FBuffer));
|
||||
if FZRec.avail_in = 0 then
|
||||
begin
|
||||
Result := Count - FZRec.avail_out;
|
||||
Exit;
|
||||
end;
|
||||
FZRec.next_in := @FBuffer;
|
||||
FStrmPos := FStrm.Position;
|
||||
FStrmPos := Source.Position;
|
||||
Progress(Self);
|
||||
end;
|
||||
DeCompressionCheck(inflate(FZRec, 0));
|
||||
@ -368,7 +366,7 @@ begin
|
||||
DecompressionCheck(inflateReset(FZRec));
|
||||
FZRec.next_in := @FBuffer;
|
||||
FZRec.avail_in := 0;
|
||||
FStrm.Position := 0;
|
||||
Source.Position := 0;
|
||||
FStrmPos := 0;
|
||||
end
|
||||
else if ( (Offset >= 0) and (Origin = soFromCurrent)) or
|
||||
|
Loading…
Reference in New Issue
Block a user