I am still unable to get paszlib to work.
I have since gone to some pretty big lengths toward my goal, but I am afraid I
am stuck.
I think the ideal way would be to be able to read the file into a TMemstream,
decompress it into another Tmemstream and then write that out, but I must
admit I have no idea how to go about achieving that.
So considering that, for the moment I decided that I may have made a mistake
in my code conversions, so I fell back on minigz's own code virtually
unaltered, but wrapped inside a component.
All I get is that when I call the extract method - the program throws:
TApplication.HandleException Access violation
Stack trace:
$40489AE0 GZ_EXTRACT_finalize_implicit, line 54 of gtkglobals.pp
What does an error in finalize MEAN ?
I did an strace on the program, and it certainly reads and writes a LOT of
data once you trigger the method, so SOMETHING is happening before the crash.
I attach my full source code this time, if somebody would like to see the
trace I will mail that offlist as it is likely to be huge.
I urgently need to get this working to do transparent decompression for
OpenBook on windows (calling gunzip only works where gunzip works well).
Ciao
A.J.
--
A.J. Venter
Chief Software Architext
OpenLab International
www.getopenlab.com
www.silentcoder.co.za
+27 82 726 5103
{ Copyright (C) 2006 A.J. Venter
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
for more details.
You should have received a copy of the GNU Library General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
unit gz_extract;
{Note - you must add turbopoweripro to your project requirements for
this to work}
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,Process,zutil,gzIo, Forms, Controls, Graphics, Dialogs;
Type
TGZ_Extractor = class(TComponent)
private
FInputFile : String;
FOutPutFile : String;
public
destructor destroy; override;
Procedure Extract;
published
property InputFile : String write FInputFile;
property OutPutFile : String write FOutPutFile;
constructor create(AOwner: TComponent); override;
end;
procedure register;
Implementation
{TGZ_Extractor}
const
BUFLEN = 16384 ;
GZ_SUFFIX = '.gz' ;
{$DEFINE MAXSEF_64K}
var
buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack }
prog : string;
procedure error (msg:string);
begin
showMessage(msg);
end;
procedure Register;
begin
RegisterComponents('OLPack',[TGZ_Extractor]);
end;
procedure gz_uncompress (infile:gzFile; var outfile:file);
var
len : int;
written : uInt;
ioerr : integer;
err : int;
begin
while true do begin
len := gzread (infile, @buf, BUFLEN);
if (len < 0)
then error (gzerror (infile, err));
if (len = 0)
then break;
{$I-}
blockwrite (outfile, buf, len, written);
{$I+}
if (written <> len)
then error ('write error');
end; {WHILE}
{$I-}
close (outfile);
{$I+}
ioerr := IOResult;
if (ioerr <> 0) then begin
writeln ('close error: ',ioerr);
halt(1);
end;
if (gzclose (infile) <> 0{Z_OK})
then error ('gzclose error');
end;
procedure file_uncompress (filename,outname:String);
var
inname : string;
infile : gzFile;
outfile : file;
ioerr : integer;
len : integer;
begin
len := Length(filename);
inname := filename;
infile := gzopen (inname, 'r');
if (infile = NIL) then begin
writeln (prog,': can''t gzopen ',inname);
halt(1);
end;
Assign (outfile, outname);
{$I-}
Rewrite (outfile,1);
{$I+}
ioerr := IOResult;
if (ioerr <> 0) then begin
writeln ('open error: ',ioerr);
halt(1);
end;
gz_uncompress (infile, outfile);
end;
Procedure TGZ_Extractor.Extract;
Begin
File_UnCompress(FInputFile,FOutPutFile);
end;
destructor TGZ_Extractor.destroy;
Begin
end;
constructor TGZ_Extractor.create(AOwner: TComponent);
begin
inherited create(AOwner);
end;
end.