Browse Source

* Fix repeated calling of flush, bug ID #34112

git-svn-id: trunk@39607 -
michael 7 years ago
parent
commit
64e4f169de
1 changed files with 23 additions and 23 deletions
  1. 23 23
      packages/paszlib/src/zstream.pp

+ 23 - 23
packages/paszlib/src/zstream.pp

@@ -52,7 +52,11 @@ type
           destructor destroy;override;
         end;
 
+        { Tcompressionstream }
+
         Tcompressionstream=class(Tcustomzlibstream)
+        private
+          function ClearOutBuffer: Integer;
         protected
           raw_written,compressed_written: int64;
         public
@@ -176,8 +180,7 @@ end;
 function Tcompressionstream.write(const buffer;count:longint):longint;
 
 var err:smallint;
-    lastavail,
-    written:longint;
+    lastavail:longint;
 
 begin
   Fstream.next_in:=@buffer;
@@ -186,17 +189,9 @@ begin
   while Fstream.avail_in<>0 do
     begin
       if Fstream.avail_out=0 then
-        begin
-          { Flush the buffer to the stream and update progress }
-          written:=source.write(Fbuffer^,bufsize);
-          inc(compressed_written,written);
-          inc(raw_written,lastavail-Fstream.avail_in);
-          lastavail:=Fstream.avail_in;
-          progress(self);
-          { reset output buffer }
-          Fstream.next_out:=Fbuffer;
-          Fstream.avail_out:=bufsize;
-        end;
+        ClearOutBuffer;
+      inc(raw_written,lastavail-Fstream.avail_in);
+      lastavail:=Fstream.avail_in;
       err:=deflate(Fstream,Z_NO_FLUSH);
       if err<>Z_OK then
         raise Ecompressionerror.create(zerror(err));
@@ -211,25 +206,28 @@ begin
   get_compressionrate:=100*compressed_written/raw_written;
 end;
 
+Function TCompressionstream.ClearOutBuffer : Integer;
+
+
+begin
+  { Flush the buffer to the stream and update progress }
+  Result:=source.write(Fbuffer^,bufsize);
+  inc(compressed_written,Result);
+  progress(self);
+  { reset output buffer }
+  Fstream.next_out:=Fbuffer;
+  Fstream.avail_out:=bufsize;
+end;
 
 procedure Tcompressionstream.flush;
 
 var err:smallint;
-    written:longint;
 
 begin
   {Compress remaining data still in internal zlib data buffers.}
   repeat
     if Fstream.avail_out=0 then
-      begin
-        { Flush the buffer to the stream and update progress }
-        written:=source.write(Fbuffer^,bufsize);
-        inc(compressed_written,written);
-        progress(self);
-        { reset output buffer }
-        Fstream.next_out:=Fbuffer;
-        Fstream.avail_out:=bufsize;
-      end;
+      ClearOutBuffer;
     err:=deflate(Fstream,Z_FINISH);
     if err=Z_STREAM_END then
       break;
@@ -241,6 +239,8 @@ begin
       source.writebuffer(FBuffer^,bufsize-Fstream.avail_out);
       inc(compressed_written,bufsize-Fstream.avail_out);
       progress(self);
+      Fstream.next_out:=Fbuffer;
+      Fstream.avail_out:=bufsize;
     end;
 end;