@@ -6,14 +6,16 @@ interface
66 System.SysUtils, System.Classes, System.Zip2, LzmaDec, LzmaEnc;
77
88type
9+ PZipHeader = ^TZipHeader;
10+
911 TLZMAEncoderStream = class (TStream)
1012 private
1113 FStream: TStream;
1214 FEncoderHandle: TCLzmaEncHandle;
1315 FProgress: TZipProgressEvent;
14- FZipHeader: TZipHeader ;
16+ FZipHeader: PZipHeader ;
1517 public
16- constructor Create(const Stream: TStream; aZipHeader: TZipHeader ; const
18+ constructor Create(const Stream: TStream; aZipHeader: PZipHeader ; const
1719 aProgress: TZipProgressEvent); reintroduce;
1820 procedure AfterConstruction ; override;
1921 procedure BeforeDestruction ; override;
@@ -41,13 +43,14 @@ TLZMADecoderStream = class(TStream)
4143
4244implementation
4345
44- uses Winapi.Windows, LzmaTypes;
46+ uses System.ZLib, Winapi.Windows, LzmaTypes;
4547
4648type
4749 PLzmaEncoderRead = ^TLzmaEncoderRead;
4850 TLzmaEncoderRead = record
4951 Proc: TInStreamReadProc;
5052 Stream: TStream;
53+ CRC32: UInt32;
5154 end ;
5255
5356 PzmaEncoderWrite = ^TLzmaEncoderWrite;
@@ -70,6 +73,7 @@ function LzmaReadProc(p: PISeqInStream; buf: PByte; var size: SIZE_T): TSRes; cd
7073 try
7174 R := PLzmaEncoderRead(p);
7275 size := R.Stream.Read(buf^, size);
76+ R.CRC32 := crc32(R.CRC32, buf, size);
7377 Result := SZ_OK;
7478 except
7579 Result := SZ_ERROR_DATA;
@@ -132,7 +136,7 @@ procedure TLZMAEncoderStream.BeforeDestruction;
132136end ;
133137
134138constructor TLZMAEncoderStream.Create(const Stream: TStream; aZipHeader:
135- TZipHeader ; const aProgress: TZipProgressEvent);
139+ PZipHeader ; const aProgress: TZipProgressEvent);
136140begin
137141 inherited Create;
138142 FStream := Stream;
@@ -156,16 +160,18 @@ function TLZMAEncoderStream.Write(const Buffer; Count: Longint): Longint;
156160 A.Init;
157161 R.Proc := LzmaReadProc;
158162 R.Stream := TStream(Buffer);
163+ R.CRC32 := 0 ;
159164
160165 W.Proc := LzmaWriteProc;
161166 W.Stream := FStream;
162167
163168 P.Proc := LzmaProgressProc;
164- P.ZipHeader := FZipHeader;
169+ P.ZipHeader := FZipHeader^ ;
165170 P.UncompressedSize := R.Stream.Size;
166171 P.Progress := FProgress;
167172
168173 CheckLzma(LzmaEnc_Encode(FEncoderHandle, @W, @R, @P, A, A));
174+ FZipHeader.CRC32 := R.CRC32;
169175 Result := Count;
170176end ;
171177
@@ -250,7 +256,7 @@ procedure RegisterLZMA;
250256 TZipFile.RegisterCompressionHandler(zcLZMA,
251257 function(InStream: TStream; const ZipFile: TZipFile; const Item: TZipHeader): TStream
252258 begin
253- Result := TLZMAEncoderStream.Create(InStream, Item, ZipFile.OnProgress);
259+ Result := TLZMAEncoderStream.Create(InStream, @ Item, ZipFile.OnProgress);
254260 end ,
255261 function(InStream: TStream; const ZipFile: TZipFile; const Item: TZipHeader): TStream
256262 begin
0 commit comments