doublecmd/plugins/wcx/zip/src/ZipOpt.pas

128 lines
3.5 KiB
ObjectPascal

unit ZipOpt;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, AbUtils, AbZipTyp;
type
TArchiveFormat = (
afNil,
afZip,
afZipx,
afGzip,
afBzip2,
afXzip,
afLzma,
afZstd
);
TFormatOptions = record
Level: PtrInt;
Method: PtrInt;
end;
const
ARCHIVE_FORMAT: array[TAbArchiveType] of TArchiveFormat =
(
afNil, afZip, afZip, afZip, afNil, afGzip, afGzip, afNil,
afBzip2, afBzip2, afXzip, afXzip, afLzma, afLzma, afZstd, afZstd
);
const
DefaultConfig: array[TArchiveFormat] of TFormatOptions =
(
(Level: 0; Method: 0;),
(Level: 6; Method: PtrInt(cmDeflated);),
(Level: 7; Method: PtrInt(cmXz);),
(Level: 6; Method: PtrInt(cmDeflated);),
(Level: 9; Method: PtrInt(cmBzip2);),
(Level: 7; Method: PtrInt(cmXz);),
(Level: 7; Method: PtrInt(cmLZMA);),
(Level: 11; Method: PtrInt(cmZstd);)
);
var
PluginConfig: array[TArchiveFormat] of TFormatOptions;
procedure LoadConfiguration;
procedure SaveConfiguration;
implementation
uses
TypInfo, DCClassesUtf8, Extension, ZipFunc;
procedure LoadConfiguration;
var
Ini: TIniFileEx;
Section: AnsiString;
ArchiveFormat: TArchiveFormat;
begin
try
Ini:= TIniFileEx.Create(gStartupInfo.PluginConfDir + IniFileName);
try
for ArchiveFormat:= Succ(Low(TArchiveFormat)) to High(TArchiveFormat) do
begin
Section:= Copy(GetEnumName(TypeInfo(TArchiveFormat), PtrInt(ArchiveFormat)), 3, MaxInt);
PluginConfig[ArchiveFormat].Level:= Ini.ReadInteger(Section, 'Level', DefaultConfig[ArchiveFormat].Level);
PluginConfig[ArchiveFormat].Method:= Ini.ReadInteger(Section, 'Method', DefaultConfig[ArchiveFormat].Method);
end;
gTarAutoHandle:= Ini.ReadBool('Configuration', 'TarAutoHandle', True);
// Backward compatibility
case Ini.ReadInteger('Configuration', 'DeflationOption', -1) of
IntPtr(doSuperFast): PluginConfig[afZip].Level:= 1;
IntPtr(doFast): PluginConfig[afZip].Level:= 3;
IntPtr(doNormal): PluginConfig[afZip].Level:= 6;
IntPtr(doMaximum): PluginConfig[afZip].Level:= 9;
end;
case Ini.ReadInteger('Configuration', 'CompressionMethodToUse', -1) of
IntPtr(smStored): PluginConfig[afZip].Method:= IntPtr(cmStored);
IntPtr(smDeflated): PluginConfig[afZip].Method:= IntPtr(cmDeflated);
IntPtr(smBestMethod): PluginConfig[afZip].Method:= IntPtr(cmEnhancedDeflated);
end;
finally
Ini.Free;
end;
except
// Ignore
end;
end;
procedure SaveConfiguration;
var
Ini: TIniFileEx;
Section: AnsiString;
ArchiveFormat: TArchiveFormat;
begin
try
Ini:= TIniFileEx.Create(gStartupInfo.PluginConfDir + IniFileName);
try
for ArchiveFormat:= Succ(Low(TArchiveFormat)) to High(TArchiveFormat) do
begin
Section:= Copy(GetEnumName(TypeInfo(TArchiveFormat), PtrInt(ArchiveFormat)), 3, MaxInt);
Ini.WriteInteger(Section, 'Level', PluginConfig[ArchiveFormat].Level);
Ini.WriteInteger(Section, 'Method', PluginConfig[ArchiveFormat].Method);
end;
Ini.DeleteKey('Configuration', 'DeflationOption');
Ini.DeleteKey('Configuration', 'CompressionMethodToUse');
Ini.WriteBool('Configuration', 'TarAutoHandle', gTarAutoHandle);
Ini.UpdateFile;
finally
Ini.Free;
end;
except
on E: Exception do
begin
gStartupInfo.MessageBox(PAnsiChar(E.Message), nil, MB_OK or MB_ICONERROR);
end;
end;
end;
initialization
Move(DefaultConfig[Low(DefaultConfig)], PluginConfig[Low(PluginConfig)], SizeOf(PluginConfig));
end.