This repository has been archived on 2024-02-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
MyPresenter1.0/bgrabitmap/unzipperext.pas
2015-02-08 16:52:18 -08:00

129 lines
3.4 KiB
ObjectPascal

unit UnzipperExt;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, zipper;
type
{ TUnzipperStreamUtf8 }
TUnzipperStreamUtf8 = class(TUnZipper)
private
FCustomOutputStream: TStream;
FCustomInputStream: TStream;
procedure SetInputStream(AValue: TStream);
protected
Procedure CustomOpenInput(Sender: TObject; var AStream: TStream);
procedure CustomCloseInput(Sender: TObject; var AStream: TStream);
procedure CustomCreateOutput(Sender : TObject; var AStream : TStream; {%H-}AItem : TFullZipFileEntry);
procedure CustomCloseOutput(Sender : TObject; var AStream : TStream; {%H-}AItem : TFullZipFileEntry);
public
function UnzipFileToStream(AFilename: string; AStream: TStream; ACaseSensitive: boolean= true): boolean;
function UnzipFileToString(AFilename:string): string;
constructor Create;
property InputStream: TStream read FCustomInputStream write SetInputStream;
end;
implementation
uses lazutf8classes;
{ TUnzipperStreamUtf8 }
procedure TUnzipperStreamUtf8.SetInputStream(AValue: TStream);
begin
if FCustomInputStream=AValue then Exit;
FCustomInputStream:=AValue;
end;
procedure TUnzipperStreamUtf8.CustomOpenInput(Sender: TObject; var AStream: TStream);
begin
if Assigned(FCustomInputStream) then
AStream := FCustomInputStream
else
AStream := TFileStreamUTF8.Create(FileName, fmOpenRead or fmShareDenyWrite);
end;
procedure TUnzipperStreamUtf8.CustomCloseInput(Sender: TObject; var AStream: TStream);
begin
if AStream = FCustomInputStream then
AStream := nil
else
FreeAndNil(AStream);
end;
procedure TUnzipperStreamUtf8.CustomCreateOutput(Sender: TObject;
var AStream: TStream; AItem: TFullZipFileEntry);
begin
AStream := FCustomOutputStream;
end;
procedure TUnzipperStreamUtf8.CustomCloseOutput(Sender: TObject;
var AStream: TStream; AItem: TFullZipFileEntry);
begin
AStream := nil;
end;
function TUnzipperStreamUtf8.UnzipFileToStream(AFilename: string; AStream: TStream;
ACaseSensitive: boolean): boolean;
var
i: integer;
entryName: string;
begin
OpenInput;
AFilename := StringReplace(AFilename,'/','\',[rfReplaceAll]);
Try
ReadZipDirectory;
for i := 0 to Entries.count-1 do
begin
entryName := Entries.FullEntries[i].ArchiveFileName;
entryName:= StringReplace(entryName,'/','\',[rfReplaceAll]);
if (entryName = AFilename) or
(not ACaseSensitive and (CompareText(entryName,AFilename)=0)) then
begin
OnCreateStream := @CustomCreateOutput;
OnDoneStream := @CustomCloseOutput;
FCustomOutputStream := AStream;
UnZipOneFile(Entries.FullEntries[i]);
OnCreateStream := nil;
OnDoneStream := nil;
FCustomOutputStream := nil;
result := true;
exit;
end;
end;
Finally
CloseInput;
end;
result := false;
end;
function TUnzipperStreamUtf8.UnzipFileToString(AFilename: string): string;
var mem: TMemoryStream;
begin
mem := TMemoryStream.Create;
try
UnzipFileToStream(AFilename,mem);
setlength(result,mem.Size);
mem.Position:= 0;
mem.Read(result[1], length(result));
finally
mem.Free;
end;
end;
constructor TUnzipperStreamUtf8.Create;
begin
inherited Create;
OnOpenInputStream := @CustomOpenInput;
OnCloseInputStream:= @CustomCloseInput;
end;
end.