unit StreamCompress;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
function ZipData(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean = True): LongInt;
function UnZipData(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean = True): LongInt;
implementation
uses
zipper, zstream;
type
{ TZipperClass }
TZipperClass = class
strict private
FInputStream: TMemoryStream;
FOutputStream: TMemoryStream;
FResultStream: TMemoryStream;
procedure DoCreateOutZipStream(Sender: TObject; var AStream: TStream;
AItem: TFullZipFileEntry);
procedure DoDoneOutZipStream(Sender: TObject; var AStream: TStream;
AItem: TFullZipFileEntry);
procedure DoOpenInputStream(Sender: TObject; var AStream: TStream);
public
function Zip(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean): LongInt;
function UnZip(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean): LongInt;
end;
procedure TZipperClass.DoCreateOutZipStream(Sender: TObject;
var AStream: TStream; AItem: TFullZipFileEntry);
begin
FOutputStream := TMemoryStream.Create;
AStream := FOutputStream;
end;
procedure TZipperClass.DoDoneOutZipStream(Sender: TObject; var AStream: TStream;
AItem: TFullZipFileEntry);
begin
AStream.Position := 0;
FResultStream.CopyFrom(AStream, AStream.Size);
AStream.Free;
end;
procedure TZipperClass.DoOpenInputStream(Sender: TObject; var AStream: TStream);
begin
AStream := FInputStream;
end;
function TZipperClass.Zip(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean): LongInt;
begin
end;
function TZipperClass.UnZip(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean): LongInt;
var
Unzipper: TUnZipper;
Bookmark: Int64;
begin
Result := 0;
Bookmark := Output.Position;
FInputStream := TMemoryStream.Create;
FInputStream.CopyFrom(Input, Size);
FResultStream := TMemoryStream.Create;
Unzipper := TUnZipper.Create;
with Unzipper do begin
OnCreateStream := @DoCreateOutZipStream;
OnDoneStream := @DoDoneOutZipStream;
OnOpenInputStream := @DoOpenInputStream;
try
UnZipAllFiles;
except
end;
Free;
end;
FResultStream.Position := 0;
Output.CopyFrom(FResultStream, FResultStream.Size);
FResultStream.Free; // FInputStream & FOutputStream has already been freed
Result := Output.Size - Bookmark;
if OutputReturn then Output.Position := Bookmark;
end;
function ZipData(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean): LongInt;
var
Zipper: TZipperClass;
begin
Zipper := TZipperClass.Create;
Result := Zipper.Unzip(Input, Size, Output, OutputReturn);
Zipper.Free;
end;
function UnZipData(const Input: TMemoryStream; Size: LongInt;
var Output: TMemoryStream; OutputReturn: Boolean): LongInt;
var
Zipper: TZipperClass;
begin
Zipper := TZipperClass.Create;
Result := Zipper.Unzip(Input, Size, Output, OutputReturn);
Zipper.Free;
end;
end.