|
@@ -68,6 +68,8 @@ type
|
|
Tdecompressionstream=class(Tcustomzlibstream)
|
|
Tdecompressionstream=class(Tcustomzlibstream)
|
|
protected
|
|
protected
|
|
raw_read,compressed_read:longint;
|
|
raw_read,compressed_read:longint;
|
|
|
|
+ skipheader:boolean;
|
|
|
|
+ procedure reset;
|
|
public
|
|
public
|
|
constructor create(Asource:Tstream;Askipheader:boolean=false);
|
|
constructor create(Asource:Tstream;Askipheader:boolean=false);
|
|
destructor destroy;override;
|
|
destructor destroy;override;
|
|
@@ -173,6 +175,7 @@ function Tcompressionstream.write(const buffer;count:longint):longint;
|
|
var err:smallint;
|
|
var err:smallint;
|
|
lastavail,
|
|
lastavail,
|
|
written:longint;
|
|
written:longint;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
Fstream.next_in:=@buffer;
|
|
Fstream.next_in:=@buffer;
|
|
Fstream.avail_in:=count;
|
|
Fstream.avail_in:=count;
|
|
@@ -207,8 +210,10 @@ end;
|
|
|
|
|
|
|
|
|
|
procedure Tcompressionstream.flush;
|
|
procedure Tcompressionstream.flush;
|
|
|
|
+
|
|
var err:smallint;
|
|
var err:smallint;
|
|
written:longint;
|
|
written:longint;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
{Compress remaining data still in internal zlib data buffers.}
|
|
{Compress remaining data still in internal zlib data buffers.}
|
|
repeat
|
|
repeat
|
|
@@ -230,8 +235,8 @@ begin
|
|
until false;
|
|
until false;
|
|
if Fstream.avail_out<bufsize then
|
|
if Fstream.avail_out<bufsize then
|
|
begin
|
|
begin
|
|
- source.writebuffer(FBuffer,bufsize-Fstream.avail_out);
|
|
|
|
- inc(compressed_written,written);
|
|
|
|
|
|
+ source.writebuffer(FBuffer^,bufsize-Fstream.avail_out);
|
|
|
|
+ inc(compressed_written,bufsize-Fstream.avail_out);
|
|
progress(self);
|
|
progress(self);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
@@ -257,6 +262,7 @@ var err:smallint;
|
|
begin
|
|
begin
|
|
inherited create(Asource);
|
|
inherited create(Asource);
|
|
|
|
|
|
|
|
+ skipheader:=Askipheader;
|
|
if Askipheader then
|
|
if Askipheader then
|
|
err:=inflateInit2(Fstream,-MAX_WBITS)
|
|
err:=inflateInit2(Fstream,-MAX_WBITS)
|
|
else
|
|
else
|
|
@@ -269,6 +275,7 @@ function Tdecompressionstream.read(var buffer;count:longint):longint;
|
|
|
|
|
|
var err:smallint;
|
|
var err:smallint;
|
|
lastavail:longint;
|
|
lastavail:longint;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
Fstream.next_out:=@buffer;
|
|
Fstream.next_out:=@buffer;
|
|
Fstream.avail_out:=count;
|
|
Fstream.avail_out:=count;
|
|
@@ -297,21 +304,45 @@ begin
|
|
read:=count-Fstream.avail_out;
|
|
read:=count-Fstream.avail_out;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure Tdecompressionstream.reset;
|
|
|
|
+
|
|
|
|
+var err:smallint;
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+ raw_read:=0;
|
|
|
|
+ compressed_read:=0;
|
|
|
|
+ source.position:=0;
|
|
|
|
+ inflateEnd(Fstream);
|
|
|
|
+ if skipheader then
|
|
|
|
+ err:=inflateInit2(Fstream,-MAX_WBITS)
|
|
|
|
+ else
|
|
|
|
+ err:=inflateInit(Fstream);
|
|
|
|
+ if err<>Z_OK then
|
|
|
|
+ raise Ecompressionerror.create(zerror(err));
|
|
|
|
+end;
|
|
|
|
+
|
|
function Tdecompressionstream.seek(offset:longint;origin:word):longint;
|
|
function Tdecompressionstream.seek(offset:longint;origin:word):longint;
|
|
|
|
|
|
|
|
+var c:longint;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
- if ((origin=sofrombeginning) and (offset>=raw_read)) or
|
|
|
|
- ((origin=sofromcurrent) and (offset>=0)) then
|
|
|
|
|
|
+ if (origin=sofrombeginning) or
|
|
|
|
+ ((origin=sofromcurrent) and (offset+raw_read>=0)) then
|
|
begin
|
|
begin
|
|
if origin=sofrombeginning then
|
|
if origin=sofrombeginning then
|
|
dec(offset,raw_read);
|
|
dec(offset,raw_read);
|
|
|
|
+ if offset<0 then
|
|
|
|
+ begin
|
|
|
|
+ inc(offset,raw_read);
|
|
|
|
+ reset;
|
|
|
|
+ end;
|
|
while offset>0 do
|
|
while offset>0 do
|
|
begin
|
|
begin
|
|
- size:=bufsize;
|
|
|
|
- if offset<bufsize then
|
|
|
|
- size:=offset;
|
|
|
|
- size:=read(Fbuffer^,size);
|
|
|
|
- dec(offset,size);
|
|
|
|
|
|
+ c:=offset;
|
|
|
|
+ if c>bufsize then
|
|
|
|
+ c:=bufsize;
|
|
|
|
+ c:=read(Fbuffer^,c);
|
|
|
|
+ dec(offset,c);
|
|
end;
|
|
end;
|
|
end
|
|
end
|
|
else
|
|
else
|