@@ -18,7 +18,8 @@ interface
1818type
1919 ESimbaCompressAlgo = (
2020 ZLIB,
21- SYNLZ
21+ SYNLZ,
22+ GZ
2223 );
2324{ $POP}
2425
@@ -35,6 +36,7 @@ implementation
3536
3637uses
3738 ZStream,
39+ gz,
3840 mormot2_synlz,
3941 mormot2_rle;
4042
@@ -47,6 +49,7 @@ procedure CompressData(Algo: ESimbaCompressAlgo; InData: PByte; InSize: Int64; o
4749 begin
4850 OutStream := TMemoryStream.Create();
4951 InStream := TCompressionStream.Create(clDefault, OutStream);
52+ InStream.SourceOwner := False;
5053 try
5154 InStream.Write(InData^, InSize);
5255 InStream.Flush();
@@ -89,13 +92,38 @@ procedure CompressData(Algo: ESimbaCompressAlgo; InData: PByte; InSize: Int64; o
8992 OutData := ReAllocMem(OutData, OutSize);
9093 end ;
9194
95+ procedure CompressWithGz ;
96+ var
97+ InStream: TGZFileStream;
98+ OutStream: TMemoryStream;
99+ begin
100+ OutStream := TMemoryStream.Create();
101+ try
102+ InStream := TGZFileStream.Create(OutStream, True);
103+ InStream.SourceOwner := False;
104+ try
105+ InStream.Write(InData^, InSize);
106+ finally
107+ InStream.Free(); // flushes on free
108+ end ;
109+
110+ OutSize := OutStream.Position;
111+ OutData := GetMem(OutSize);
112+
113+ Move(OutStream.Memory^, OutData^, OutSize);
114+ finally
115+ OutStream.Free();
116+ end ;
117+ end ;
118+
92119begin
93120 OutSize := 0 ;
94121 OutData := nil ;
95122
96123 case Algo of
97124 ESimbaCompressAlgo.ZLIB: CompressWithZLib();
98125 ESimbaCompressAlgo.SYNLZ: CompressWithSynLZ();
126+ ESimbaCompressAlgo.GZ: CompressWithGZ();
99127 end ;
100128end ;
101129
@@ -113,6 +141,7 @@ procedure DecompressData(Algo: ESimbaCompressAlgo; InData: PByte; InSize: Int64;
113141 InStream.Position := 0 ;
114142 OutStream := TMemoryStream.Create();
115143 DecompressStream := TDeCompressionStream.Create(InStream);
144+ DecompressStream.SourceOwner := False;
116145 try
117146 repeat
118147 Count := DecompressStream.Read(Chunk[0 ], Length(Chunk));
@@ -156,13 +185,44 @@ procedure DecompressData(Algo: ESimbaCompressAlgo; InData: PByte; InSize: Int64;
156185 end ;
157186 end ;
158187
188+ procedure DecompressWithGZ ;
189+ var
190+ InStream, OutStream: TMemoryStream;
191+ GzStream: TGZFileStream;
192+ Count: Integer;
193+ Chunk: array [0 ..4095 ] of Byte;
194+ begin
195+ InStream := TMemoryStream.Create();
196+ InStream.Write(InData^, InSize);
197+ InStream.Position := 0 ;
198+ OutStream := TMemoryStream.Create();
199+ GzStream := TGZFileStream.Create(InStream, False);
200+ GzStream.SourceOwner := False;
201+ try
202+ repeat
203+ Count := GzStream.Read(Chunk[0 ], Length(Chunk));
204+ if (Count > 0 ) then
205+ OutStream.Write(Chunk[0 ], Count);
206+ until (Count = 0 );
207+ OutSize := OutStream.Position;
208+ OutData := GetMem(OutSize);
209+
210+ Move(OutStream.Memory^, OutData^, OutSize);
211+ finally
212+ InStream.Free();
213+ OutStream.Free();
214+ GzStream.Free();
215+ end ;
216+ end ;
217+
159218begin
160219 OutData := nil ;
161220 OutSize := 0 ;
162221
163222 case Algo of
164223 ESimbaCompressAlgo.ZLIB: DecompressWithZLib();
165224 ESimbaCompressAlgo.SYNLZ: DecompressWithSynLZ();
225+ ESimbaCompressAlgo.GZ: DecompressWithGZ();
166226 end ;
167227end ;
168228
0 commit comments