+ TCustomZlibStream now descends from TOwnerStream

git-svn-id: trunk@3512 -
This commit is contained in:
michael 2006-05-13 21:34:30 +00:00
parent fea15be56f
commit da32415fc9

View File

@ -44,9 +44,8 @@ type
ECompressionError = class(EZlibError); ECompressionError = class(EZlibError);
EDecompressionError = class(EZlibError); EDecompressionError = class(EZlibError);
TCustomZlibStream = class(TStream) TCustomZlibStream = class(TOwnerStream)
private private
FStrm: TStream;
FStrmPos: Integer; FStrmPos: Integer;
FOnProgress: TNotifyEvent; FOnProgress: TNotifyEvent;
FZRec: TZStream; FZRec: TZStream;
@ -82,7 +81,7 @@ type
procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
OutEstimate: Integer; var OutBuf: Pointer; var OutBytes: Integer); OutEstimate: Integer; var OutBuf: Pointer; var OutBytes: Integer);
public public
constructor Create(Source: TStream); constructor Create(ASource: TStream);
destructor Destroy; override; destructor Destroy; override;
function Read(var Buffer; Count: Longint): Longint; override; function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override;
@ -200,8 +199,7 @@ end;
constructor TCustomZLibStream.Create(Strm: TStream); constructor TCustomZLibStream.Create(Strm: TStream);
begin begin
inherited Create; inherited Create(Strm);
FStrm := Strm;
FStrmPos := Strm.Position; FStrmPos := Strm.Position;
end; end;
@ -230,16 +228,16 @@ begin
FZRec.next_in := nil; FZRec.next_in := nil;
FZRec.avail_in := 0; FZRec.avail_in := 0;
try 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) while (CompressionCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
and (FZRec.avail_out = 0) do and (FZRec.avail_out = 0) do
begin begin
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); Source.WriteBuffer(FBuffer, sizeof(FBuffer));
FZRec.next_out := @FBuffer; FZRec.next_out := @FBuffer;
FZRec.avail_out := sizeof(FBuffer); FZRec.avail_out := sizeof(FBuffer);
end; end;
if FZRec.avail_out < sizeof(FBuffer) then if FZRec.avail_out < sizeof(FBuffer) then
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out); Source.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
finally finally
deflateEnd(FZRec); deflateEnd(FZRec);
end; end;
@ -267,16 +265,16 @@ function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
begin begin
FZRec.next_in := @Buffer; FZRec.next_in := @Buffer;
FZRec.avail_in := Count; 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 while (FZRec.avail_in > 0) do
begin begin
CompressionCheck(deflate(FZRec, 0)); CompressionCheck(deflate(FZRec, 0));
if FZRec.avail_out = 0 then if FZRec.avail_out = 0 then
begin begin
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); Source.WriteBuffer(FBuffer, sizeof(FBuffer));
FZRec.next_out := @FBuffer; FZRec.next_out := @FBuffer;
FZRec.avail_out := sizeof(FBuffer); FZRec.avail_out := sizeof(FBuffer);
FStrmPos := FStrm.Position; FStrmPos := Source.Position;
Progress(Self); Progress(Self);
end; end;
end; end;
@ -305,9 +303,9 @@ end;
// TDecompressionStream // TDecompressionStream
constructor TDecompressionStream.Create(Source: TStream); constructor TDecompressionStream.Create(ASource: TStream);
begin begin
inherited Create(Source); inherited Create(ASource);
FZRec.next_in := @FBuffer; FZRec.next_in := @FBuffer;
DecompressionCheck(inflateInit(FZRec)); DecompressionCheck(inflateInit(FZRec));
end; end;
@ -332,19 +330,19 @@ function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
begin begin
FZRec.next_out := @Buffer; FZRec.next_out := @Buffer;
FZRec.avail_out := Count; 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 while (FZRec.avail_out > 0) do
begin begin
if FZRec.avail_in = 0 then if FZRec.avail_in = 0 then
begin begin
FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer)); FZRec.avail_in := Source.Read(FBuffer, sizeof(FBuffer));
if FZRec.avail_in = 0 then if FZRec.avail_in = 0 then
begin begin
Result := Count - FZRec.avail_out; Result := Count - FZRec.avail_out;
Exit; Exit;
end; end;
FZRec.next_in := @FBuffer; FZRec.next_in := @FBuffer;
FStrmPos := FStrm.Position; FStrmPos := Source.Position;
Progress(Self); Progress(Self);
end; end;
DeCompressionCheck(inflate(FZRec, 0)); DeCompressionCheck(inflate(FZRec, 0));
@ -368,7 +366,7 @@ begin
DecompressionCheck(inflateReset(FZRec)); DecompressionCheck(inflateReset(FZRec));
FZRec.next_in := @FBuffer; FZRec.next_in := @FBuffer;
FZRec.avail_in := 0; FZRec.avail_in := 0;
FStrm.Position := 0; Source.Position := 0;
FStrmPos := 0; FStrmPos := 0;
end end
else if ( (Offset >= 0) and (Origin = soFromCurrent)) or else if ( (Offset >= 0) and (Origin = soFromCurrent)) or