Componentes.Terceros.jcl/official/2.1.1/source/windows/sevenzip.pas
2010-01-18 16:51:36 +00:00

716 lines
30 KiB
ObjectPascal

{**************************************************************************************************}
{ }
{ Project JEDI Code Library (JCL) }
{ }
{ interface of the 'sevenzip' (http://sourceforge.net/projects/sevenzip/) compression library }
{ version 4.62, December 2th, 2008 }
{ }
{ Copyright (C) 1999-2008 Igor Pavlov }
{ }
{ GNU LGPL information }
{ -------------------- }
{ }
{ This library is free software; you can redistribute it and/or modify it under the terms of }
{ the GNU Lesser General Public License as published by the Free Software Foundation; either }
{ version 2.1 of the License, or (at your option) any later version. }
{ }
{ This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; }
{ without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. }
{ See the GNU Lesser General Public License for more details. }
{ }
{ You should have received a copy of the GNU Lesser General Public License along with this }
{ library; if not, write to }
{ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA }
{ }
{ unRAR restriction }
{ ----------------- }
{ }
{ The decompression engine for RAR archives was developed using source code of unRAR program. }
{ All copyrights to original unRAR code are owned by Alexander Roshal. }
{ }
{ The license for original unRAR code has the following restriction: }
{ }
{ The unRAR sources cannot be used to re-create the RAR compression algorithm, }
{ which is proprietary. Distribution of modified unRAR sources in separate form }
{ or as a part of other software is permitted, provided that it is clearly }
{ stated in the documentation and source comments that the code may }
{ not be used to develop a RAR (WinRAR) compatible archiver. }
{ }
{**************************************************************************************************}
{ }
{ Translation 2007-2008 Florent Ouchet for the JEDI Code Library }
{ Contributors: }
{ Uwe Schuster (uschuster) }
{ Jan Goyvaerts (jgsoft) }
{ }
{**************************************************************************************************}
{ }
{ Last modified: $Date:: 2009-10-19 16:28:24 +0200 (lun., 19 oct. 2009) $ }
{ Revision: $Rev:: 3049 $ }
{ Author: $Author:: outchy $ }
{ }
{**************************************************************************************************}
unit sevenzip;
interface
{$I jcl.inc}
uses
Windows,
ActiveX,
JclBase;
// Guid.txt
const
CLSID_CCodec : TGUID = '{23170F69-40C1-2790-0000-000000000000}';
CLSID_CCodecBCJ2 : TGUID = '{23170F69-40C1-2790-1B01-030300000000}'; // BCJ2 0303011B
CLSID_CCodecBCJ : TGUID = '{23170F69-40C1-2790-0301-030300000000}'; // BCJ 03030103
CLSID_CCodecSWAP2 : TGUID = '{23170F69-40C1-2790-0203-030000000000}'; // swap2 020302
CLSID_CCodecSWAP4 : TGUID = '{23170F69-40C1-2790-0403-020000000000}'; // swap4 020304
CLSID_CCodecBPPC : TGUID = '{23170F69-40C1-2790-0502-030300000000}'; // branch ppc 03030205
CLSID_CCodecBIA64 : TGUID = '{23170F69-40C1-2790-0104-030300000000}'; // branch IA64 03030401
CLSID_CCodecBARM : TGUID = '{23170F69-40C1-2790-0105-030300000000}'; // branch ARM 03030501
CLSID_CCodecBARMT : TGUID = '{23170F69-40C1-2790-0107-030300000000}'; // branch ARM Thumb 03030701
CLSID_CCodecBARMS : TGUID = '{23170F69-40C1-2790-0508-030300000000}'; // branch ARM Sparc 03030805
CLSID_CCodecBZIP : TGUID = '{23170F69-40C1-2790-0202-040000000000}'; // bzip2 040202
CLSID_CCodecCOPY : TGUID = '{23170F69-40C1-2790-0000-000000000000}'; // copy 0
CLSID_CCodecDEF64 : TGUID = '{23170F69-40C1-2790-0901-040000000000}'; // deflate64 040109
CLSID_CCodecDEFNSIS : TGUID = '{23170F69-40C1-2790-0109-040000000000}'; // deflate nsis 040901
CLSID_CCodecDEFREG : TGUID = '{23170F69-40C1-2790-0801-040000000000}'; // deflate register 040108
CLSID_CCodecLZMA : TGUID = '{23170F69-40C1-2790-0101-030000000000}'; // lzma 030101
CLSID_CCodecPPMD : TGUID = '{23170F69-40C1-2790-0104-030000000000}'; // ppmd 030401
CLSID_CCodecRAR1 : TGUID = '{23170F69-40C1-2790-0103-040000000000}'; // rar1 040301
CLSID_CCodecRAR2 : TGUID = '{23170F69-40C1-2790-0203-040000000000}'; // rar2 040302
CLSID_CCodecRAR3 : TGUID = '{23170F69-40C1-2790-0303-040000000000}'; // rar3 040303
CLSID_CAESCodec : TGUID = '{23170F69-40C1-2790-0107-F10600000000}'; // AES 06F10701
CLSID_CArchiveHandler : TGUID = '{23170F69-40C1-278A-1000-000110000000}';
CLSID_CFormatZip : TGUID = '{23170F69-40C1-278A-1000-000110010000}';
CLSID_CFormatBZ2 : TGUID = '{23170F69-40C1-278A-1000-000110020000}';
CLSID_CFormatRar : TGUID = '{23170F69-40C1-278A-1000-000110030000}';
CLSID_CFormatArj : TGUID = '{23170F69-40C1-278A-1000-000110040000}';
CLSID_CFormatZ : TGUID = '{23170F69-40C1-278A-1000-000110050000}';
CLSID_CFormatLzh : TGUID = '{23170F69-40C1-278A-1000-000110060000}';
CLSID_CFormat7z : TGUID = '{23170F69-40C1-278A-1000-000110070000}';
CLSID_CFormatCab : TGUID = '{23170F69-40C1-278A-1000-000110080000}';
CLSID_CFormatNsis : TGUID = '{23170F69-40C1-278A-1000-000110090000}';
CLSID_CFormatLzma : TGUID = '{23170F69-40C1-278A-1000-0001100A0000}';
CLSID_CFormatLzma86 : TGUID = '{23170F69-40C1-278A-1000-0001100B0000}';
CLSID_CFormatXz : TGUID = '{23170F69-40C1-278A-1000-0001100C0000}';
CLSID_CFormatMslz : TGUID = '{23170F69-40C1-278A-1000-000110D50000}';
CLSID_CFormatFlv : TGUID = '{23170F69-40C1-278A-1000-000110D60000}';
CLSID_CFormatSwf : TGUID = '{23170F69-40C1-278A-1000-000110D70000}';
CLSID_CFormatSwfc : TGUID = '{23170F69-40C1-278A-1000-000110D80000}';
CLSID_CFormatNtfs : TGUID = '{23170F69-40C1-278A-1000-000110D90000}';
CLSID_CFormatFat : TGUID = '{23170F69-40C1-278A-1000-000110DA0000}';
CLSID_CFormatMbr : TGUID = '{23170F69-40C1-278A-1000-000110DB0000}';
CLSID_CFormatVhd : TGUID = '{23170F69-40C1-278A-1000-000110DC0000}';
CLSID_CFormatPe : TGUID = '{23170F69-40C1-278A-1000-000110DD0000}';
CLSID_CFormatElf : TGUID = '{23170F69-40C1-278A-1000-000110DE0000}';
CLSID_CFormatMacho : TGUID = '{23170F69-40C1-278A-1000-000110DF0000}';
CLSID_CFormatUdf : TGUID = '{23170F69-40C1-278A-1000-000110E00000}';
CLSID_CFormatXar : TGUID = '{23170F69-40C1-278A-1000-000110E10000}';
CLSID_CFormatMub : TGUID = '{23170F69-40C1-278A-1000-000110E20000}';
CLSID_CFormatHfs : TGUID = '{23170F69-40C1-278A-1000-000110E30000}';
CLSID_CFormatDmg : TGUID = '{23170F69-40C1-278A-1000-000110E40000}';
CLSID_CFormatCompound : TGUID = '{23170F69-40C1-278A-1000-000110E50000}';
CLSID_CFormatWim : TGUID = '{23170F69-40C1-278A-1000-000110E60000}';
CLSID_CFormatIso : TGUID = '{23170F69-40C1-278A-1000-000110E70000}';
//CLSID_CFormatBkf : TGUID = '{23170F69-40C1-278A-1000-000110E80000}'; not in 4.57
CLSID_CFormatChm : TGUID = '{23170F69-40C1-278A-1000-000110E90000}';
CLSID_CFormatSplit : TGUID = '{23170F69-40C1-278A-1000-000110EA0000}';
CLSID_CFormatRpm : TGUID = '{23170F69-40C1-278A-1000-000110EB0000}';
CLSID_CFormatDeb : TGUID = '{23170F69-40C1-278A-1000-000110EC0000}';
CLSID_CFormatCpio : TGUID = '{23170F69-40C1-278A-1000-000110ED0000}';
CLSID_CFormatTar : TGUID = '{23170F69-40C1-278A-1000-000110EE0000}';
CLSID_CFormatGZip : TGUID = '{23170F69-40C1-278A-1000-000110EF0000}';
// IStream.h
type
// "23170F69-40C1-278A-0000-000300xx0000"
ISequentialInStream = interface(IUnknown)
['{23170F69-40C1-278A-0000-000300010000}']
function Read(Data: Pointer; Size: Cardinal; ProcessedSize: PCardinal): HRESULT; stdcall;
{Out: if size != 0, return_value = S_OK and (*processedSize == 0),
then there are no more bytes in stream.
if (size > 0) && there are bytes in stream,
this function must read at least 1 byte.
This function is allowed to read less than number of remaining bytes in stream.
You must call Read function in loop, if you need exact amount of data}
end;
ISequentialOutStream = interface(IUnknown)
['{23170F69-40C1-278A-0000-000300020000}']
function Write(Data: Pointer; Size: Cardinal; ProcessedSize: PCardinal): HRESULT; stdcall;
{if (size > 0) this function must write at least 1 byte.
This function is allowed to write less than "size".
You must call Write function in loop, if you need to write exact amount of data}
end;
IInStream = interface(ISequentialInStream)
['{23170F69-40C1-278A-0000-000300030000}']
function Seek(Offset: Int64; SeekOrigin: Cardinal; NewPosition: PInt64): HRESULT; stdcall;
end;
IOutStream = interface(ISequentialOutStream)
['{23170F69-40C1-278A-0000-000300040000}']
function Seek(Offset: Int64; SeekOrigin: Cardinal; NewPosition: PInt64): HRESULT; stdcall;
function SetSize(NewSize: Int64): HRESULT; stdcall;
end;
IStreamGetSize = interface(IUnknown)
['{23170F69-40C1-278A-0000-000300060000}']
function GetSize(Size: PInt64): HRESULT; stdcall;
end;
IOutStreamFlush = interface(IUnknown)
['{23170F69-40C1-278A-0000-000300070000}']
function Flush: HRESULT; stdcall;
end;
// PropID.h
const
kpidNoProperty = 0;
kpidHandlerItemIndex = 2;
kpidPath = 3;
kpidName = 4;
kpidExtension = 5;
kpidIsFolder = 6 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidIsDir' {$ENDIF} {$ENDIF};
kpidIsDir = 6;
kpidSize = 7;
kpidPackedSize = 8 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidPackSize' {$ENDIF} {$ENDIF};
kpidPackSize = 8;
kpidAttributes = 9 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidAttrib' {$ENDIF} {$ENDIF};
kpidAttrib = 9;
kpidCreationTime = 10 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidCTime' {$ENDIF} {$ENDIF};
kpidCTime = 10;
kpidLastAccessTime = 11 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidATime' {$ENDIF} {$ENDIF};
kpidATime = 11;
kpidLastWriteTime = 12 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidMTime' {$ENDIF} {$ENDIF};
kpidMTime = 12;
kpidSolid = 13;
kpidCommented = 14;
kpidEncrypted = 15;
kpidSplitBefore = 16;
kpidSplitAfter = 17;
kpidDictionarySize = 18;
kpidCRC = 19;
kpidType = 20;
kpidIsAnti = 21;
kpidMethod = 22;
kpidHostOS = 23;
kpidFileSystem = 24;
kpidUser = 25;
kpidGroup = 26;
kpidBlock = 27;
kpidComment = 28;
kpidPosition = 29;
kpidPrefix = 30;
kpidNumSubDirs = 31;
kpidNumSubFiles = 32;
kpidUnpackVer = 33;
kpidVolume = 34;
kpidIsVolume = 35;
kpidOffset = 36;
kpidLinks = 37;
kpidNumBlocks = 38;
kpidNumVolumes = 39;
kpidTimeType = 40;
kpidBit64 = 41;
kpidBigEndian = 42;
kpidCpu = 43;
kpidPhySize = 44;
kpidHeadersSize = 45;
kpidChecksum = 46;
kpidCharacts = 47;
kpidVa = 48;
kpidTotalSize = $1100;
kpidFreeSpace = $1101;
kpidClusterSize = $1102;
kpidVolumeName = $1103;
kpidLocalName = $1200;
kpidProvider = $1201;
kpidUserDefined = $10000;
// HandlerOut.cpp
kCopyMethodName = WideString('Copy');
kLZMAMethodName = WideString('LZMA');
kLZMA2MethodName = WideString('LZMA2');
kBZip2MethodName = WideString('BZip2');
kPpmdMethodName = WideString('PPMd');
kDeflateMethodName = WideString('Deflate');
kDeflate64MethodName = WideString('Deflate64');
kAES128MethodName = WideString('AES128');
kAES192MethodName = WideString('AES192');
kAES256MethodName = WideString('AES256');
kZipCryptoMethodName = WideString('ZIPCRYPTO');
// ICoder.h
type
ICompressProgressInfo = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400040000}']
function SetRatioInfo(InSize: PInt64; OutSize: PInt64): HRESULT; stdcall;
end;
ICompressCoder = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400050000}']
function Code(InStream: ISequentialInStream; OutStream: ISequentialOutStream;
InSize, OutSize: PInt64; Progress: ICompressProgressInfo): HRESULT; stdcall;
end;
PISequentialInStream = ^ISequentialInStream;
PISequentialOutStream = ^ISequentialOutStream;
ICompressCoder2 = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400180000}']
function Code(InStreams: PISequentialInStream; InSizes: JclBase.PPInt64; NumInStreams: Cardinal;
OutStreams: PISequentialOutStream; OutSizes: JclBase.PPInt64; NumOutStreams: Cardinal;
Progress: ICompressProgressInfo): HRESULT; stdcall;
end;
const
kDictionarySize = $400;
kUsedMemorySize = $401;
kOrder = $402;
kBlockSize = $403;
kPosStateBits = $440;
kLitContextBits = $441;
kLitPosBits = $442;
kNumFastBytes = $450;
kMatchFinder = $451;
kMatchFinderCycles = $452;
kNumPasses = $460;
kAlgorithm = $470;
kMultiThread = $480;
kNumThreads = $481;
kEndMarker = $490;
type
ICompressSetCoderProperties = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400200000}']
function SetCoderProperties(PropIDs: PPropID; Properties: PPropVariant;
NumProperties: Cardinal): HRESULT; stdcall;
end;
ICompressSetDecoderProperties2 = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400220000}']
function SetDecoderProperties2(Data: PByte; Size: Cardinal): HRESULT; stdcall;
end;
ICompressWriteCoderProperties = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400230000}']
function WriteCoderProperties(OutStream: ISequentialOutStream): HRESULT; stdcall;
end;
ICompressGetInStreamProcessedSize = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400240000}']
function GetInStreamProcessedSize(Value: PInt64): HRESULT; stdcall;
end;
ICompressSetCoderMt = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400250000}']
function SetNumberOfThreads(NumThreads: Cardinal): HRESULT; stdcall;
end;
ICompressGetSubStreamSize = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400300000}']
function GetSubStreamSize(SubStream: Int64; out Value: Int64): HRESULT; stdcall;
end;
ICompressSetInStream = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400310000}']
function SetInStream(InStream: ISequentialInStream): HRESULT; stdcall;
function ReleaseInStream: HRESULT; stdcall;
end;
ICompressSetOutStream = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400320000}']
function SetOutStream(OutStream: ISequentialOutStream): HRESULT; stdcall;
function ReleaseOutStream: HRESULT; stdcall;
end;
ICompressSetInStreamSize = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400330000}']
function SetInStreamSize(InSize: PInt64): HRESULT; stdcall;
end;
ICompressSetOutStreamSize = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400340000}']
function SetOutStreamSize(OutSize: PInt64): HRESULT; stdcall;
end;
ICompressFilter = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400400000}']
function Init: HRESULT; stdcall;
function Filter(Data: PByte; Size: Cardinal): Cardinal; stdcall;
// Filter return outSize (UInt32)
// if (outSize <= size): Filter have converted outSize bytes
// if (outSize > size): Filter have not converted anything.
// and it needs at least outSize bytes to convert one block
// (it's for crypto block algorithms).
end;
ICompressCodecsInfo = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400600000}']
function GetNumberOfMethods(NumMethods: PCardinal): HRESULT; stdcall;
function GetProperty(Index: Cardinal; PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
function CreateDecoder(Index: Cardinal; IID: PGUID; out Decoder): HRESULT; stdcall;
function CreateEncoder(Index: Cardinal; IID: PGUID; out Coder): HRESULT; stdcall;
end;
ISetCompressCodecsInfo = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400610000}']
function SetCompressCodecsInfo(CompressCodecsInfo: ICompressCodecsInfo): HRESULT; stdcall;
end;
ICryptoProperties = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400800000}']
function SetKey(Data: PByte; Size: Cardinal): HRESULT; stdcall;
function SetInitVector(Data: PByte; Size: Cardinal): HRESULT; stdcall;
end;
ICryptoSetPassword = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400900000}']
function CryptoSetPassword(Data: PByte; Size: Cardinal): HRESULT; stdcall;
end;
ICryptoSetCRC = interface(IUnknown)
['{23170F69-40C1-278A-0000-000400A00000}']
function CryptoSetCRC(crc: Cardinal): HRESULT; stdcall;
end;
const
kID = 0;
kName = 1;
kDecoder = 2;
kEncoder = 3;
kInStreams = 4;
kOutStreams = 5;
kDescription = 6;
kDecoderIsAssigned = 7;
kEncoderIsAssigned = 8;
// IProgress.h
type
IProgress = interface(IUnknown)
['{23170F69-40C1-278A-0000-000000050000}']
function SetTotal(Total: Int64): HRESULT; stdcall;
function SetCompleted(CompleteValue: PInt64): HRESULT; stdcall;
end;
// IArchive.h
const
// file time type
kWindows = 0;
kUnix = 1;
kDOS = 2;
// archive
kArchiveName = 0;
kClassID = 1;
kExtension = 2;
kAddExtension = 3;
kUpdate = 4;
kKeepName = 5;
kStartSignature = 6;
kFinishSignature = 7;
kAssociate = 8;
// ask mode
kExtract = 0;
kTest = 1;
kSkip = 2;
// operation result
kOK = 0;
kUnSupportedMethod = 1;
kDataError = 2;
kCRCError = 3;
kError = 1;
type
// "23170F69-40C1-278A-0000-000600xx0000"
IArchiveOpenCallback = interface(IUnknown)
['{23170F69-40C1-278A-0000-000600100000}']
function SetTotal(Files: PInt64; Bytes: PInt64): HRESULT; stdcall;
function SetCompleted(Files: PInt64; Bytes: PInt64): HRESULT; stdcall;
end;
IArchiveExtractCallback = interface(IProgress)
['{23170F69-40C1-278A-0000-000600200000}']
function GetStream(Index: Cardinal; out OutStream: ISequentialOutStream;
askExtractMode: Cardinal): HRESULT; stdcall;
// GetStream OUT: S_OK - OK, S_FALSE - skeep this file
function PrepareOperation(askExtractMode: Cardinal): HRESULT; stdcall;
function SetOperationResult(resultEOperationResult: Integer): HRESULT; stdcall;
end;
IArchiveOpenVolumeCallback = interface(IUnknown)
['{23170F69-40C1-278A-0000-000600300000}']
function GetProperty(PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
function GetStream(Name: PWideChar; out InStream: IInStream): HRESULT; stdcall;
end;
IInArchiveGetStream = interface(IUnknown)
['{23170F69-40C1-278A-0000-000600400000}']
function GetStream(Index: Cardinal; out Stream: ISequentialInStream): HRESULT; stdcall;
end;
IArchiveOpenSetSubArchiveName = interface(IUnknown)
['{23170F69-40C1-278A-0000-000600500000}']
function SetSubArchiveName(Name: PWideChar): HRESULT; stdcall;
end;
IInArchive = interface(IUnknown)
['{23170F69-40C1-278A-0000-000600600000}']
function Open(Stream: IInStream; MaxCheckStartPosition: PInt64;
OpenArchiveCallback: IArchiveOpenCallback): HRESULT; stdcall;
function Close: HRESULT; stdcall;
function GetNumberOfItems(NumItems: PCardinal): HRESULT; stdcall;
function GetProperty(Index: Cardinal; PropID: TPropID;
var Value: TPropVariant): HRESULT; stdcall;
function Extract(Indices: PCardinal; NumItems: Cardinal;
TestMode: Integer; ExtractCallback: IArchiveExtractCallback): HRESULT; stdcall;
// indices must be sorted
// numItems = 0xFFFFFFFF means all files
// testMode != 0 means "test files operation"
function GetArchiveProperty(PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
function GetNumberOfProperties(NumProperties: PCardinal): HRESULT; stdcall;
function GetPropertyInfo(Index: Cardinal; out Name: TBStr; out PropID: TPropID;
out VarType: TVarType): HRESULT; stdcall;
function GetNumberOfArchiveProperties(NumProperties: PCardinal): HRESULT; stdcall;
function GetArchivePropertyInfo(Index: Cardinal; out Name: TBStr; out PropID: TPropID;
out VarType: TVarType): HRESULT; stdcall;
end;
IArchiveUpdateCallback = interface(IProgress)
['{23170F69-40C1-278A-0000-000600800000}']
function GetUpdateItemInfo(Index: Cardinal;
NewData: PInteger; // 1 - new data, 0 - old data
NewProperties: PInteger; // 1 - new properties, 0 - old properties
IndexInArchive: PCardinal // -1 if there is no in archive, or if doesn't matter
): HRESULT; stdcall;
function GetProperty(Index: Cardinal; PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
function GetStream(Index: Cardinal; out InStream: ISequentialInStream): HRESULT; stdcall;
function SetOperationResult(OperationResult: Integer): HRESULT; stdcall;
end;
IArchiveUpdateCallback2 = interface(IArchiveUpdateCallback)
['{23170F69-40C1-278A-0000-000600820000}']
function GetVolumeSize(Index: Cardinal; Size: PInt64): HRESULT; stdcall;
function GetVolumeStream(Index: Cardinal; out VolumeStream: ISequentialOutStream): HRESULT; stdcall;
end;
IOutArchive = interface(IUnknown)
['{23170F69-40C1-278A-0000-000600A00000}']
function UpdateItems(OutStream: ISequentialOutStream; NumItems: Cardinal;
UpdateCallback: IArchiveUpdateCallback): HRESULT; stdcall;
function GetFileTimeType(Type_: PCardinal): HRESULT; stdcall;
end;
ISetProperties = interface(IUnknown)
['{23170F69-40C1-278A-0000-000600030000}']
function SetProperties(Names: PPWideChar; Values: PPropVariant; NumProperties: Integer): HRESULT; stdcall;
end;
// IPassword.h
type
ICryptoGetTextPassword = interface(IUnknown)
['{23170F69-40C1-278A-0000-000500100000}']
function CryptoGetTextPassword(password: PBStr): HRESULT; stdcall;
end;
ICryptoGetTextPassword2 = interface(IUnknown)
['{23170F69-40C1-278A-0000-000500110000}']
function CryptoGetTextPassword2(PasswordIsDefined: PInteger;
Password: PBStr): HRESULT; stdcall;
end;
// ZipHandlerOut.cpp
const
kDeflateAlgoX1 = 0 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kLzAlgoX1' {$ENDIF} {$ENDIF};
kLzAlgoX1 = 0;
kDeflateAlgoX5 = 1 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kLzAlgoX5' {$ENDIF} {$ENDIF};
kLzAlgoX5 = 1;
kDeflateNumPassesX1 = 1;
kDeflateNumPassesX7 = 3;
kDeflateNumPassesX9 = 10;
kNumFastBytesX1 = 32 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kDeflateNumFastBytesX1' {$ENDIF} {$ENDIF};
kDeflateNumFastBytesX1 = 32;
kNumFastBytesX7 = 64 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kDeflateNumFastBytesX7' {$ENDIF} {$ENDIF};
kDeflateNumFastBytesX7 = 64;
kNumFastBytesX9 = 128 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kDeflateNumFastBytesX9' {$ENDIF} {$ENDIF};
kDeflateNumFastBytesX9 = 128;
kLzmaNumFastBytesX1 = 32;
kLzmaNumFastBytesX7 = 64;
kBZip2NumPassesX1 = 1;
kBZip2NumPassesX7 = 2;
kBZip2NumPassesX9 = 7;
kBZip2DicSizeX1 = 100000;
kBZip2DicSizeX3 = 500000;
kBZip2DicSizeX5 = 900000;
// HandlerOut.cpp
const
kLzmaAlgoX1 = 0;
kLzmaAlgoX5 = 1;
kLzmaDicSizeX1 = 1 shl 16;
kLzmaDicSizeX3 = 1 shl 20;
kLzmaDicSizeX5 = 1 shl 24;
kLzmaDicSizeX7 = 1 shl 25;
kLzmaDicSizeX9 = 1 shl 26;
kLzmaFastBytesX1 = 32;
kLzmaFastBytesX7 = 64;
kPpmdMemSizeX1 = (1 shl 22);
kPpmdMemSizeX5 = (1 shl 24);
kPpmdMemSizeX7 = (1 shl 26);
kPpmdMemSizeX9 = (192 shl 20);
kPpmdOrderX1 = 4;
kPpmdOrderX5 = 6;
kPpmdOrderX7 = 16;
kPpmdOrderX9 = 32;
kDeflateFastBytesX1 = 32;
kDeflateFastBytesX7 = 64;
kDeflateFastBytesX9 = 128;
{$IFDEF 7ZIP_LINKONREQUEST}
type
TCreateObjectFunc = function (ClsID: PGUID; IID: PGUID; out Obj): HRESULT; stdcall;
TGetNumberOfFormatsFunc = function (NumFormats: PCardinal): HRESULT; stdcall;
TGetNumberOfMethodsFunc = function (NumMethods: PCardinal): HRESULT; stdcall;
TSetLargePageMode = function: HRESULT; stdcall;
var
CreateObject: TCreateObjectFunc = nil;
GetNumberOfFormats: TGetNumberOfFormatsFunc = nil;
GetNumberOfMethods: TGetNumberOfMethodsFunc = nil;
SetLargePageMode: TSetLargePageMode = nil;
{$ELSE ~7ZIP_LINKONREQUEST}
function CreateObject(ClsID: PGUID; IID: PGUID; out Obj): HRESULT; stdcall;
function GetNumberOfFormats(NumFormats: PCardinal): HRESULT; stdcall;
function GetNumberOfMethods(NumMethods: PCardinal): HRESULT; stdcall;
function SetLargePageMode: HRESULT; stdcall;
{$ENDIF ~7ZIP_LINKONREQUEST}
function Load7Zip: Boolean;
function Is7ZipLoaded: Boolean;
procedure Unload7Zip;
implementation
type
{$IFDEF MSWINDOWS}
TModuleHandle = HINST;
{$ENDIF MSWINDOWS}
{$IFDEF LINUX}
TModuleHandle = Pointer;
{$ENDIF LINUX}
const
sz7Zip = '7z.dll';
CreateObjectExportName = 'CreateObject';
GetNumberOfFormatsExportName = 'GetNumberOfFormats';
GetNumberOfMethodsExportName = 'GetNumberOfMethods';
SetLargePageModeExportName = 'SetLargePageMode';
INVALID_MODULEHANDLE_VALUE = TModuleHandle(0);
{$IFDEF 7ZIP_LINKDLL}
function CreateObject; external sz7Zip name CreateObjectExportName;
function GetNumberOfFormats; external sz7Zip name GetNumberOfFormatsExportName;
function GetNumberOfMethods; external sz7Zip name GetNumberOfMethodsExportName;
function SetLargePageMode; external sz7Zip name SetLargePageModeExportName;
{$ENDIF 7ZIP_LINKDLL}
{$IFDEF 7ZIP_LINKONREQUEST}
var
SevenzipLib: TModuleHandle = INVALID_MODULEHANDLE_VALUE;
{$ENDIF 7ZIP_LINKONREQUEST}
function Load7Zip: Boolean;
{$IFDEF 7ZIP_LINKONREQUEST}
function GetSymbol(SymbolName: PChar): Pointer;
begin
{$IFDEF MSWINDOWS}
Result := GetProcAddress(SevenzipLib, PChar(SymbolName));
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
Result := dlsym(SevenzipLib, PChar(SymbolName));
{$ENDIF UNIX}
end;
begin
Result := SevenzipLib <> INVALID_MODULEHANDLE_VALUE;
if not Result then
begin
{$IFDEF MSWINDOWS}
SevenzipLib := LoadLibrary(sz7Zip);
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
SevenzipLib := dlopen(PChar(sz7Zip), RTLD_NOW);
{$ENDIF UNIX}
Result := SevenzipLib <> INVALID_MODULEHANDLE_VALUE;
if Result then
begin
@CreateObject := GetSymbol(CreateObjectExportName);
@GetNumberOfFormats := GetSymbol(GetNumberOfFormatsExportName);
@GetNumberOfMethods := GetSymbol(GetNumberOfMethodsExportName);
@SetLargePageMode := GetSymbol(SetLargePageModeExportName);
Result := Assigned(@CreateObject) and Assigned(@GetNumberOfFormats) and
Assigned(@GetNumberOfMethods) and Assigned(@SetLargePageMode);
end;
end;
end;
{$ELSE ~7ZIP_LINKONREQUEST}
begin
Result := True;
end;
{$ENDIF ~7ZIP_LINKONREQUEST}
function Is7ZipLoaded: Boolean;
begin
{$IFDEF 7ZIP_LINKONREQUEST}
Result := SevenzipLib <> INVALID_MODULEHANDLE_VALUE;
{$ELSE ~7ZIP_LINKONREQUEST}
Result := True;
{$ENDIF ~7ZIP_LINKONREQUEST}
end;
procedure Unload7Zip;
begin
{$IFDEF 7ZIP_LINKONREQUEST}
@CreateObject := nil;
@GetNumberOfFormats := nil;
@GetNumberOfMethods := nil;
@SetLargePageMode := nil;
if SevenzipLib <> INVALID_MODULEHANDLE_VALUE then
{$IFDEF MSWINDOWS}
FreeLibrary(SevenzipLib);
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
dlclose(Pointer(SevenzipLib));
{$ENDIF UNIX}
SevenzipLib := INVALID_MODULEHANDLE_VALUE;
{$ENDIF 7ZIP_LINKONREQUEST}
end;
end.