Prechádzať zdrojové kódy

Blocked revisions 9291,9362 via svnmerge

........
r9291 | peter | 2007-11-18 22:41:55 +0100 (Sun, 18 Nov 2007) | 2 lines

  * cleanroom implementation from Daniel Mantoine

........
r9362 | daniel | 2007-12-01 11:13:42 +0100 (Sat, 01 Dec 2007) | 3 lines

  * Fix compression bug.
  + Allow random seeks through compressed file.

........
Merged revisions 9372,9377-9378,9380 via svnmerge from 
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r9372 | daniel | 2007-12-01 23:03:53 +0100 (Sat, 01 Dec 2007) | 2 lines

  * Should use Edecompressionerror in Tdecompresionstream.

........
r9377 | daniel | 2007-12-02 10:51:19 +0100 (Sun, 02 Dec 2007) | 4 lines

  * Reset resets stream to beginning to zstream, not beginning of file.
  * Readpng resets source stream to start of zstream before creating
    Tdecompressionstream, rather than seek the decompression stream.

........
r9378 | daniel | 2007-12-02 11:35:46 +0100 (Sun, 02 Dec 2007) | 2 lines

  * Convert error messages to resourcestrings.

........
r9380 | daniel | 2007-12-02 12:34:11 +0100 (Sun, 02 Dec 2007) | 2 lines

  * Use zerror rather than hardcoded error table.

........

git-svn-id: branches/fixes_2_2@9450 -
Jonas Maebe 18 rokov pred
rodič
commit
babfc7f6d1

+ 1 - 1
packages/fcl-image/src/fpreadpng.pp

@@ -803,9 +803,9 @@ begin
       ReadChunk;
       HandleChunk;
       end;
+    ZData.position:=0;
     Decompress := TDecompressionStream.Create (ZData);
     try
-      Decompress.position := 0;
       DoDecompress;
     finally
       Decompress.Free;

+ 34 - 15
packages/paszlib/src/zbase.pas

@@ -400,21 +400,17 @@ function zError(err : integer) : string;
 const
   ZLIB_VERSION : string[10] = '1.1.2';
 
+resourcestring Sneed_dict     = 'need dictionary';
+               Sstream_end    = 'stream end';
+               Sfile_error    = 'file error';
+               Sstream_error  = 'stream error';
+               Sdata_error    = 'data error';
+               Smem_error     = 'insufficient memory';
+               Sbuf_error     = 'buffer error';
+               Sversion_error = 'incompatible version';
+
 const
-  z_errbase = Z_NEED_DICT;
-  z_errmsg : Array[0..9] of string[21] = { indexed by 2-zlib_error }
-           ('need dictionary',     { Z_NEED_DICT       2  }
-            'stream end',          { Z_STREAM_END      1  }
-            '',                    { Z_OK              0  }
-            'file error',          { Z_ERRNO         (-1) }
-            'stream error',        { Z_STREAM_ERROR  (-2) }
-            'data error',          { Z_DATA_ERROR    (-3) }
-            'insufficient memory', { Z_MEM_ERROR     (-4) }
-            'buffer error',        { Z_BUF_ERROR     (-5) }
-            'incompatible version',{ Z_VERSION_ERROR (-6) }
-            '');
-const
-  z_verbose : integer = 1;
+  z_verbose = 1;
 
 {$IFDEF ZLIB_DEBUG}
 procedure z_error (m : string);
@@ -423,8 +419,31 @@ procedure z_error (m : string);
 implementation
 
 function zError(err : integer) : string;
+
 begin
-  zError := z_errmsg[Z_NEED_DICT-err];
+  case err of
+    Z_VERSION_ERROR:
+      zerror:=Sversion_error;
+    Z_BUF_ERROR:
+      zerror:=Sbuf_error;
+    Z_MEM_ERROR:
+      zerror:=Smem_error;
+    Z_DATA_ERROR:
+      zerror:=Sdata_error;
+    Z_STREAM_ERROR:
+      zerror:=Sstream_error;
+    Z_ERRNO:
+      zerror:=Sfile_error;
+    Z_OK:
+      zerror:='';
+    Z_STREAM_END:
+      zerror:=Sstream_end;
+    Z_NEED_DICT:
+      zerror:=Sneed_dict;
+    else
+      str(err,zerror);
+      zerror:='Unknown zlib error '+zerror;
+  end;
 end;
 
 function zlibVersion : string;

+ 5 - 5
packages/paszlib/src/zdeflate.pas

@@ -587,7 +587,7 @@ begin
      (s^.pending_buf=nil) then
   begin
     {ERR_MSG(Z_MEM_ERROR);}
-    strm.msg := z_errmsg[z_errbase-Z_MEM_ERROR];
+    strm.msg := zerror(Z_MEM_ERROR);
     deflateEnd (strm);
     deflateInit2_ := Z_MEM_ERROR;
     exit;
@@ -857,14 +857,14 @@ begin
      ((s^.status=FINISH_STATE) and (flush<>Z_FINISH)) then
   begin
     {ERR_RETURN(strm^, Z_STREAM_ERROR);}
-    strm.msg := z_errmsg[z_errbase - Z_STREAM_ERROR];
+    strm.msg := zerror(Z_STREAM_ERROR);
     deflate := Z_STREAM_ERROR;
     exit;
   end;
   if (strm.avail_out = 0) then
   begin
     {ERR_RETURN(strm^, Z_BUF_ERROR);}
-    strm.msg := z_errmsg[z_errbase - Z_BUF_ERROR];
+    strm.msg := zerror(Z_BUF_ERROR);
     deflate := Z_BUF_ERROR;
     exit;
   end;
@@ -926,7 +926,7 @@ begin
       and (flush <> Z_FINISH) then
     begin
       {ERR_RETURN(strm^, Z_BUF_ERROR);}
-      strm.msg := z_errmsg[z_errbase - Z_BUF_ERROR];
+      strm.msg := zerror(Z_BUF_ERROR);
       deflate := Z_BUF_ERROR;
       exit;
     end;
@@ -935,7 +935,7 @@ begin
   if (s^.status = FINISH_STATE) and (strm.avail_in <> 0) then
   begin
     {ERR_RETURN(strm^, Z_BUF_ERROR);}
-    strm.msg := z_errmsg[z_errbase - Z_BUF_ERROR];
+    strm.msg := zerror(Z_BUF_ERROR);
     deflate := Z_BUF_ERROR;
     exit;
   end;

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

@@ -296,7 +296,7 @@ begin
       if err=Z_STREAM_END then
         break;
       if err<>Z_OK then
-        raise Ecompressionerror.create(zerror(err));
+        raise Edecompressionerror.create(zerror(err));
     end;
   if err=Z_STREAM_END then
     dec(compressed_read,Fstream.avail_in);
@@ -309,16 +309,16 @@ procedure Tdecompressionstream.reset;
 var err:smallint;
 
 begin
+  source.seek(-compressed_read,sofromcurrent);
   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));
+    raise Edecompressionerror.create(zerror(err));
 end;
 
 function Tdecompressionstream.seek(offset:longint;origin:word):longint;